不积小流,无以成江海
Back Propagation 笔记

Michael Nielsen 的 深度学习 文章里对 BP 算法有了相当全面的介绍,网上也有中文翻译版本。本文是自己学习的一些笔记,主要是抄一遍公式的证明来加强记忆。

逻辑回归实验

最近在看 Andrew Ng 老师的 机器学习课程 ,这篇文章试图通过编程的方式,一步步实验课程中的知识点,验证其中的一些结论,从而加深对逻辑回归的理解。

性能优化三件套

提高性能最怕是没有方向,没有头绪的时候不妨试试三件套:并行、异步、加缓存。

决策树 (decision tree)

通过训练,我们可以从样本中学习到决策树,作为预测模型来预测其它样本。两个问题:

  1. 我们说要训练/学习,训练/学习什么?
  2. 为什么决策树可以用来预测?或者说它的泛化能力的来源是哪?
核密度估计(kernel density estimation)

有一些数据,想“看看”它长什么样,我们一般会画直方图(Histogram)。现在你也可以用核密度估计。

线段树 (区间树)

不查不知道,一查吓一跳,“线段树”这个名字的定义真是混乱到一定程度了。

维基百科 Segment Tree 说它是一种数据结构,用来存储区间或线段,用来在 O(log n) 的时间内查找包含某个点的所有区间。一般线段树是静态的结构,不需要修改的,但一些教程又很强调线段树的修改,比如说“lazy 节点是线段树的精髓“。与此同时,另一种结构区间树(Interval Tree) 在结构和功能上和线段树又十分接近。看来看去,线段树,区间树在维基百科、教材、博客里的介绍经常大不相同。

本文里,我们以解决区间最小值(RMQ)问题中使用的数据结构为基准,讲讲“线段树”的基本思想。

二叉索引树

二叉索引树(Binary Indexed Tree) 也称为 Fenwick tree,中文也称树状数组。它可以在 O(log n) 的时间内得到数组的前缀和(A[1] + A[2] + … + A[i]),且在 O(log n) 时间内支持动态修改数组的值。

Git: merge vs rebase

Merge 还是 Rebase,这是一个问题。网上有许多教程说明二者的区别,之前我写的一个 关于 Git 的 PPT 里也说过两者的区别。这篇文章里,我们从分支图的角度,看看两种策略下产生的分支图有什么区别。

不要轻易使用元编程

元编程就像核弹,自己梦寐以求,却不希望别人拥有。

一般说元编程分为两类,一类是宏,在编译时期生成代码;另一类是运行时修改代码的行为。而不论是哪一类,我的建议是在决定使用之前要慎重考虑。元编程能让我们扩展语言本身,是十足的黑魔法;但用好不易,容易造成团队/社区在意见是实现上的分裂。(另外这篇文章里主要是对元编程的一些吐糟,并不包含基础知识的介绍。)

DIP vs IoC vs DI

你听过 SOLID 原则吗?了解 Spring 的控制反转(IoC)吗?知道依赖注入(Dependency Injection)和它们有什么区别吗?虽然形式多样,它们的内核却很简单。

Java Annotation Processor 小记

最近基于工作上的需求调研了下 Java Annotation Processor 的使用方式,开篇博客记录下学习过程中遇到的坑。可以由于平时用到 Annotation 的场景特别少,因此能搜索到的教程特别有限,也希望文章在某种程度上填补部分空白吧。

及时获取反馈以提升工作效率

最近发现自己及整个团队的开发效率低下,思前想后认为跟反馈链太长脱不了干系,于是思考及时反馈的重要性,以及它如何影响我们的效率。这里做一个小结。

估算:古代水稻亩产量

用了金克垃,亩产一千八。古代没有金克垃,亩产有多少?有你现有的常识,能估算出来吗?

CSS 子元素依次收缩的实现

当子元素的宽度(或高度)超过父元素时,如果父元素设置了 display: flex,则子元素将按比例缩小自己的宽度(或高度),但现在我们希望子元素按一定的优先级缩小。即:当宽度不足时,优先缩小某一个子元素,当达到该元素的最小宽度(min-width)时,再开始缩小另外的元素。下面是一个示例图:

可以看到,当宽度不足时,上例中优先缩小了最右的元素,当最右元素达到最小宽度 100px 时开始缩小左边的元素,依此类推。

Python Decorator(装饰器)

今天来说说 Python 里的装饰器 (decorator)。它不难,但却几乎是 “精通” Python 的路上的第一道关卡。让我们来看看它到底是什么东西,为什么我们需要它。