ARTS 第 6 周

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章 —-

Contents:


Algorithm

LeetCode 118. Pascal’s Triangle

难度:Easy

题意:帕斯卡三角又称为杨辉三角,给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

示例:

Input: 5
Output:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

解法:

这道题其实很简单,只要想明白如何由上一行生成下一行即可。

我们先定义一个列表 triangle 作为最后输出的杨辉三角,triangle 的每一个元素对应杨辉三角的每一行,所以 triangle 的每个元素也应该是列表,我们将其定义为 L。首先应该对 L 进行初始化,让 L 的长度与其行数相等,然后再将其首尾都置为 1。然后利用杨辉三角基本的计算原理对下一行进行计算:这一行的第 i 个数是上一行的第 i-1 个数与第 i 个数的和。最后将计算好的一行添加进 triangle 即可。

class Solution(object):
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        triangle = []
        for n in range(numRows):
            L = [None for _ in range(n+1)]
            L[0], L[-1] = 1, 1
            for i in range(1, len(L)-1):
                L[i] = triangle[n-1][i-1] + triangle[n-1][i]
            triangle.append(L)
        return triangle

程序中有两个嵌套的循环,L 更新的次数与 numRows 的平方成正比。或者说,杨辉三角中元素的个数与它的行数成正比,所以时间复杂度和空间复杂度都为 O(n2)。


Review

The Random Forest Algorithm

这周选择了 Medium 上面一篇讲解随机森林算法的文章。

作者在文章的第一节,给出了随机森林算法的简单定义:

随机森林构建多个决策树,并将它们合并在一起以获得更准确和稳定的预测。

然后解释了随机森林是如何运作的,以及给出了真实生活中的一个例子,随后解释了特征的重要性以及决策树和随机森林的不同:

决策树利用特征值构建起一套规则,随后利用这些规则作出预测;而随机森林利用随机选取的一些规则来构建若干个决策树,再去这些决策树结果的平均。 深度的决策树可能会陷入过拟合,而随机森林则利用随机选取的特征子集构建小的决策树,这在大多数情况下避免了过拟合。

之后介绍了两类重要的超参数:一类是「预测能力」,包括 n_estimators,即随机森林中树的数量、max_features,即随机森林拆分一个结点是使用的最大的特征值的数量、min_sample_leaf,即拆分内部节点所需的最小叶子数;另一类是「模型速度」,包括 n_jobs,即每次并行运行的线程数,random_state 使模型的输出可复现,oob_score 是否使用袋外样品(out-of-bag)来估计泛化精度。

最后作者分析了随机森林的优缺点和使用场景。


Tips

这周给大家分享一个我一直在用的神器 「Alfred」,它是 macOS 上的一款启动器。

什么是启动器?顾名思义,就是通过键盘输入来执行相应动作,从而提高工作效率的软件。例如 macOS 自带的聚焦搜索(Spotlight),就能将文稿、邮件、应用等整合在一起,通过关键词匹配展示。

而 Alfred 可以看做是 Spotlight 的高级版,它有更多的高级功能,如:

另外也可以通过购买 Powerpack 解锁更多的高级功能如 Workflow、Clipboard、Snippets、iTunes 管理、1Password 集成等功能。尤其是 Workflow,简直是大杀器。推荐大家一试。


Share

这周给大家分享一篇讲解 CNN 卷积神经网络架构的文章。

CNN 卷积神经网络架构综述