Blog

韦克斯勒离差智商

Content #

韦克斯勒的量表是一个平均值为 100,标准差为 15 的一个正态分布曲线。在用韦克斯勒的方法测量智商的时候,你得先做一组标准的测验题,然后再将你的得分套用到韦克斯勒正态分布表(韦氏量表)中对应,这样就能得出你的智商值了。

当然,由于年龄差异的问题,韦氏量表也分为韦氏成人智力量表、韦氏儿童智力量表和韦氏幼儿智力量表这三套量表,可以用于检测所有年龄段的智商。

根据前面标准差的知识可知,正负 3 个标准差也就是 6 个σ能覆盖人类 99.97% 的情况。也就是说,100±15×3(也就是 55 到 145 之间)是大多数人的智商分布。所以当你的智商测试得分在 100 分以上,可以说你已经比较聪明了;如果是 130 分,你已经是相当聪明;如果你是 150 分,感谢你还在看我的专栏,因为你就是那个 6 个σ万世不遇的奇才,这就是现代智商的算法。

Viewpoints #

From #

10 | 指数和KPI:智商是怎么计算出来的?

蓄水池算法的思路

Content #

假设印度现在人太多,没人知道印度有多少人口,也不知道印度的整体情况是什么,我们要去通过抽样调查统计新冠的比率,我只能遇到一个人去统计一个人,然后要有个算法看是不是抽中这个人来调察。但是怎么能够让每个人被选中的概率相等呢?

这时蓄水池算法应运而生。我们需要把抽中做统计的印度人都放到一个游泳池(蓄水池)里。假设我目标是只抽 n 个人,这就有一个有 n 个人容量的游泳池,抽中的人都站在这个游泳池里面。当游泳池站满了以后,再往里加人的话有一定的概率会把游泳池里面的人给挤出来,也有一定的概率是新加的人根本挤不进去游泳池(想象一下上班时间的北京地铁)。

这样无论一共有多少人进来,他都有一定概率挤进游泳池里或者被挤出去,游泳池里面最后留下来的人,就是我们要的随机的 n 个人,这些就是我们的抽样结果。我们最后统计这些人的新冠阳性情况时,就可以说我们是随机抽样的,而不用管印度一共有多少人口了。

Viewpoints #

From #

09 | 数据抽样:大数据来了还需要抽样么?

蓄水池算法明细

Content #

  1. 将 1~n 条数据,存入待定长为 n 的集合序列,从这个序列里随机抽取 k 条数据,每条被抽取的概率为:k/n。
  2. 读到第 k 条数据时:
  3. 定义第 k 条数据选中的概率为:k/n;
  4. 如果被选中,在原集合序列中的 n 条数据中随机选择一条,替换为第 k 条的新数据;
  5. 前 k 条数据被选取后,第 k+1 条数据要么被选取替代为前 k 条中的一条,要么不被选取,概率为 k/n。再依此规则遍历所有的数据。

单机版本实现起来可以如下实现,直接调用 Sampling(k),就可以得到蓄水池中的 k 个数据。

public class ReservoirSampling {
    private int[] ALL; // 整体的水池中的数据
    private final int N = 100000; // 整体数据规模
    private final int K = 1000; // 水池规模
    private Random random = new Random();
    public void setUp() throws Exception {
        ALL = new int[N];
        for (int i = 0; i < N; i++) {
            ALL[i] = i;
        }
    }
    private int[] Sampling(int K) {
        int[] Pool = new int[K];
        for (int i = 0; i < K; i++) { // 前面K个印度人直接进入水池
            Pool[i] = ALL[i];
        }
        for (int i = K; i < N; i++) { // K + 1个元素开始进行概率采样
            int r = random.nextInt(i + 1);  //这就是K/N的概率
            if (r < K) {
                Pool[r] = ALL[i]; //如果被选中了,那么这个人就被从蓄水池中挤出来,用新人进去
            }
        }
        return Pool;
    }
}

Viewpoints #

From #

09 | 数据抽样:大数据来了还需要抽样么?

...

六希格玛(Six Sigma)

Content #

我们常见的六希格玛(Six Sigma),其实就是指所有的产品质量问题需要控制在 6 个标准误差里面。你听到的产品质量或者运维故障控制在 3 个 9 或者 5 个 9,说的也是误差范围。5 个 9 的意思就是 99.99966% 的产品是没有品质问题的。

比如说我们用下面这个图做质量控制,那么这些值就是标准误差范围。例如,我们说在一个标准误差范围里,大概就是图里面的 68.3%;两个标准误差范围里也就是距离均值(标准件)的 95.4%;三个标准误差就是 99.7%;6 个标准误差(也就是 6-sigma)也就代表着要控制到在生产的产品中,有 99.99966% 的产品是没有品质问题的(每一百万件产品中只有 3.4 件有缺陷)。

所以说我们从标准误差来看,系统的稳定性要保证 5 个 9、6 个 9 或者说我们开发的代码的质量控制是 6-sigma,这个质量就非常好了。

Viewpoints #

From #

08 | 标准差:这人是不是“靠谱”其实看标准差?

标准差和离散系数

Content #

假如两个小组的月薪大概是如下这个样子,单位都是“万”。

第一组:[1.72,1.70,1.68,1.71,1.69] ;第二组:[1.70,5.20,0.60,0.2,0.8]。

这两组人你可以简单计算一下,你会发现平均月薪都是 1 万 7。但很明显,第 2 组人的薪酬高低差异要比第 1 组人大很多。第一组人都是 1 万 7 左右的薪资,差异不大。你很不巧在第二组里,你月薪 6000,周边都是 2000、8000 的小伙伴,但是实际上,你这组里有月薪 5 万的人你不认识,于是,你就“被涨薪”了。

通过公式或者 Excel 函数,你能算出来第一组标准差是 0.014,第二组是 1.818,差异能有一百多倍。如果每次只给你某地区或者某部门的平均薪酬,但是不告诉你这个地区部门它的标准差有多大,那我们难免就会觉得困惑,“不患寡而患不均”用在这里依旧很合适。

但是只有这个概念还不够,假设对于第 1 组的薪资单位来说,我用的是不是“万元”,而是用“百元”甚至“元”作为单位的话,它的标准差就会到 1.414 和 141.4。这个时候再和第 2 组人员去比,感觉好像标准差的离散度更高,但是实际数据却不是如此。

所以一般我们真的在做数据分析的时候,我们会常用另外一个数据来规避这种问题,它叫做离散系数 CV(coefficient of variation)。它的计算公式很简单,就是用标准差除以平均值

离散系数 = 标准差 / 平均值

这样的话就规避了单位或者其他因素的这些差异。我们直接看离散系数这个数据,就能知道这几组数据之间的离散程度和差异是什么样的。

Viewpoints #

From #

08 | 标准差:这人是不是“靠谱”其实看标准差?

拉弗曲线

Content #

一个比较著名的反 U 型趋势就是经济学里面的“拉弗曲线”( Laffer curve),这条曲线最典型地反映了政府税收收入和税率之间的关系。

当税率开始增加时,税收一开始也会随之增加,但是当增加到一定程度,大家就交不起税了,重税导致企业开始倒闭和破产,这时候整体税收反而开始减小,到最终税率为 100% 时,其实企业会全部破产,税收反而是 0 了。

U 型曲线在很多场合也适用,例如员工工作时长和公司收入的关系(适度 996,不要 007),客户满意度与公司利润的关系(没有口碑的公司破产了,不加控制让客户全部高度满意的公司也都破产了)。

而数据分析的艺术就在于通过数据分析和管理经验找到反 U 型最高点,如果你能很好把握你所在公司的反 U 型曲线高点,你大概率是公司的管理层了。

Viewpoints #

From #

07 | 散点图和相关性:怎样快速从数据当中找到规律?

拉普拉斯分布

Content #

我们的房价其实和我们的身高是不一样的,它不是我们想象当中的正态分布,而是我下面提到的拉普拉斯分布。

拉普拉斯分布是一个“凸”字形的塔尖儿曲线,从左到右,斜率先缓慢增大再快速增大,到达最高点后变为负值继续先快速减小,最后再缓慢地减小,所以有点像“往里边凹陷的金字塔”。

对比正态分布的概率密度函数图像,我们可以看到拉普拉斯分布图像是尖峰厚尾的,塔尖上的那些,就是我们看到的稀缺资源。比如拿全球顶尖程序员的薪资(塔尖对应的横坐标值是均值)来说,全球顶尖的程序员年薪是 100 万美元,但这部分群体可能只占全球城市人口的 1%,程序员中的人数不足 10%。但是, 90% 的资源其实都在他们的身上,够刺激吧。

那我们怎样去理解这个拉普拉斯分布呢?它经常用在金融领域,尤其是衡量股票收益的时候。起初我们认为股票收益率是服从正态分布,但是由于股票价格波动与时间变化有关,有波动聚集性,最后实际股票的收益率都是符合拉普拉斯分布的,也就是赚大钱的日子其实特别集中,余下的都是赚小钱的日子。

现在随着市场和互联网的发展,信息越来越透明,我们相关的数据分布其实变化还是挺大的。

比如说在改革开放之前信息不对称,资源也相对没有那么聚集,人们拿到的工资是一个正态分布的。但是到了现在,就我们程序员的工资来说,一个顶尖的程序员和普通的程序员的工资收入可能会差十倍都不止,这就会导致更厚的尾部和更高的峰度。

而全国的城市房价分布、一个城市当中的小区房价分布现在也是符合拉普拉斯分布的。因为在信息透明和市场竞争的情况下,工资、房价、股票都会符合一个特点:越塔尖的个体越具有资源吸附能力。那么在整体资源恒定的情况下,这已经不是一个简单的符合随机分布的市场了,简单来讲,“大势”变了。

所以当你在做数据分析的时候,一定得先考虑一下,原有的数据分布模型是否还适用于现有的市场情况?

准确把握住数据分布这个大势,我们才能够做出更为正确的决策。就拿买房这件事来说吧,买房是一个我们基本都绕不开的话题,在你买房前,你可以先判断一下你要买的房屋的房价在这座城市里是正态分布还是拉普拉斯分布。

也就是说你可以去评估一下,你所在城市资源是否比较平均?会不会出现聚集效应?如果你认真用这两个分布去判断一下,你会发现如果你所在的城市是三四线城市,那么房价的分布大概率会呈正态分布。那么在这种情况下你要投资买房就可以选择价格在曲线腰部的房子,这种房子的房价将来涨跌以及抗风险性都比较适中。

而如果你准备买大城市里的房子,情况就不一样了。因为对于一线城市的房价而言,大概率是呈拉普拉斯分布的,这也就意味着越贵的房子周边资源越好,进而这些房子将来增值空间越大。那我们买房子的时候就应该买资源最好的最贵的房子,未来的收获也最大(当然,如果最贵的已经天价了,那么我们可以退而求其次)。

反之,当你看到一些铺面房非常便宜的时候,你要留个心眼了:是不是这些铺面房处于拉普拉斯分布的最两侧?如果是,那么这些铺面房不但增值空间小,将来还有可能买了亏本的风险。所以,只有了解整体市场的分布我们才能够更好地把握市场大势,顺势而为。

Viewpoints #

From #

06 | 数据分布:房子应该是买贵的还是买便宜的?

global命令

Content #

global 命令允许我们在某个指定模式的所有匹配行上运行 Ex 命令。 global命令通常采用以下形式(参见 :h :g):

:[range] global[!] /{pattern}/ [cmd]
  1. 在缺省情况下,:global命令的作用范围是整个文件(%),这一点与其他大多数 Ex 命令(包括 :delete、:substitute 以及 :normal)有所不同,这些命令的缺省范围仅为当前行(.)。
  2. {pattern} 域与查找历史相互关联。这意味着如果将该域留空的话,Vim会自动使用当前的查找模式。
  3. [cmd] 可以是除 :global命令之外的任何 Ex 命令。如果我们不指定任何 [cmd],Vim将缺省使用 :print。
  4. 可以用:global! 或者 :vglobal(v 表示 invert)反转 :global命令的行为。这两条命令将指示Vim在没有匹配到指定模式的行上执行 [cmd]。

最后需要指出的是:global 命令在指定 [range] 内的文本行上执行时通常分为两轮。第一轮,Vim会在所有 [pattern] 的匹配行上做上标记。第二轮,再在所有已标记的文本行上执行 [cmd] 。另外,由于 [cmd] 的范围可单独设定,因此可在多行文本段内进行操作。

From #

Vim实用技巧

编辑宏的内容

宏中的键盘编码 #

:reg a
"a Omoul<80>kb<80>kbdule Rank^[j>GGoend^[

Vim都用 ^[ 表示ESC键。代表退格键的符号 <80>kb。

将宏粘贴到文档中 #

用于录制宏的寄存器,与用作复制、粘贴操作的寄存器是一样的。因此,如果我们想修改寄存器 a中的宏的话,只需将其粘贴至文档中,便可以像编辑普通文本一样编辑它了。

首先,我们按G键,跳到当前文档的结尾,目的是要把寄存器a中的内容粘贴至新的一行。处理这种情况最简单的方式是用 :put命令:

:put a

为什么不直接用 “ap 命令呢?因为,p命令会把寄存器a的内容粘贴至当前行的光标之后。而:put命令总会将它们粘贴至当前行的下方,无论寄存器保存的是面向行的还是面向字符的文本块。

编辑宏 #

现在我们可以像编辑普通文本一样编辑宏了。

将宏从文档复制回寄存器 #

最简单的方式就是运行 “add(或者 :d a),但这么做可能会在以后导致问题。 dd命令将执行面向行的删除操作,因此,寄存器会包含一个拖尾字符 ^J:

:reg a
0f.r)wvUj^J

该字符表示一个换行符,且在大多数情况下,该字符都无关紧要。但有时这个拖尾字符可能会改变宏的意义。为了保险起见,用面向字符的复制操作把这些字符从文档复制回寄存器会更安全:

0"ay$
dd

我们依次运行命令 0 以及 “ay$,将把该行除回车符之外的每一个字符都复制下来。在把宏的内容保存回寄存器a之后,我们就可以用dd删除这一行了。尽管删除的内容最终将被保存到缺省寄存器,但我们也不会用到它们。

做完以上这些步骤,当前寄存器 a中保存着一个新的、改进的宏。

From #

Vim实用技巧