每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章 —-Contents:
- Algorithm: LeetCode 118. Pascal’s Triangle
- Review: The Random Forest Algorithm
- Tip: Alfred 推荐
- Share: CNN 卷积神经网络架构综述
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)。
这周选择了 Medium 上面一篇讲解随机森林算法的文章。
作者在文章的第一节,给出了随机森林算法的简单定义:
随机森林构建多个决策树,并将它们合并在一起以获得更准确和稳定的预测。
然后解释了随机森林是如何运作的,以及给出了真实生活中的一个例子,随后解释了特征的重要性以及决策树和随机森林的不同:
决策树利用特征值构建起一套规则,随后利用这些规则作出预测;而随机森林利用随机选取的一些规则来构建若干个决策树,再去这些决策树结果的平均。 深度的决策树可能会陷入过拟合,而随机森林则利用随机选取的特征子集构建小的决策树,这在大多数情况下避免了过拟合。
之后介绍了两类重要的超参数:一类是「预测能力」,包括 n_estimators
,即随机森林中树的数量、max_features
,即随机森林拆分一个结点是使用的最大的特征值的数量、min_sample_leaf
,即拆分内部节点所需的最小叶子数;另一类是「模型速度」,包括 n_jobs
,即每次并行运行的线程数,random_state
使模型的输出可复现,oob_score
是否使用袋外样品(out-of-bag)来估计泛化精度。
最后作者分析了随机森林的优缺点和使用场景。
这周给大家分享一个我一直在用的神器 「Alfred」,它是 macOS 上的一款启动器。
什么是启动器?顾名思义,就是通过键盘输入来执行相应动作,从而提高工作效率的软件。例如 macOS 自带的聚焦搜索(Spotlight),就能将文稿、邮件、应用等整合在一起,通过关键词匹配展示。
而 Alfred 可以看做是 Spotlight 的高级版,它有更多的高级功能,如:
另外也可以通过购买 Powerpack 解锁更多的高级功能如 Workflow、Clipboard、Snippets、iTunes 管理、1Password 集成等功能。尤其是 Workflow,简直是大杀器。推荐大家一试。
这周给大家分享一篇讲解 CNN 卷积神经网络架构的文章。