从今天起,强迫自己几天精读一篇别人的写作成果,然后来这里进行总结归纳。可以是论文、感悟、博客、微信公众号推送文章,或者是读到的书本上的一个章节。总得记录点什么。


May 22, 2018 10:04 PM


lambda函数 (λ 函数)

定义与语法格式

匿名函数,lambda其实返回的是一个函数对象

1
2
# 冒号前面是参数,可以有多个,用逗号隔开,
lambda x: x + 1

相当于

1
2
def func(x)
return x + 1

使用lambda的好处

  1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
  2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
  3. 使用lambda在某些时候让代码更容易理解。

Lambda_Python_Demos

Python提供了很多函数式编程的特性,如:map、reduce、filter、sorted等这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
list1 = [3,5,-4,-1,0,-2,-6]
sorted(list1, key=lambda x: abs(x))
[0,1,2,3,4,5,6]

L=[('b',2),('a',1),('c',3),('d',4)]
sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda s: s[2]) # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]


May 22, 2018 10:44 AM


TF-IDF算法

是什么

TF-IDF用于衡量一个词在文本中的重要程度,TF-IDF值大的词语可以作为一个文本的特征词

TF-IDF = Term Frequency * Inverse Document Frequency
TF = 词在该文本中出现的频率
IDF = log(D/d) 其中D为文档总数,d为词在多少文档中出现过

思考

TF-IDF算法也体现了一种内外的制约平衡,既考虑到了本身的频数,又考虑到了大环境。It prefers words that are frequent in the current doc j but rare overall in the collection.

TF 相当于极大似然估计,IDF相当于先验概率

TF 越大——> 词频 越高
IDF 越大——> 词越 稀有,give a higher weight to words thats occur only in a few documents.



信息指纹及其应用

  • 数学之美第16章 信息指纹及其应用
  • 吴军博士

信息指纹的定义

信息指纹,顾名思义,就是一段信息的ID,与身份证号类似,信息指纹具有如下几个性质:

  1. 信息指纹是一串定长的数字
  2. 信息指纹由伪随机数产生器产生,例如MD5,SHA-1
  3. 信息指纹具有不可逆性

为什么要使用信息指纹

信息指纹可以作为文本、语音、图片、视频的ID进行存储,从而节省大量的存储空间,也方便了基于ID的各种应用。

应用

爬虫网页去重

为了防止网络爬虫爬取相同的网页,通常要将网页地址存储到hashtable中进行去重,如果提取网页地址的信息指纹进行存储的话,可以减小存储空间,同样的道理也适用于图片、视频和音频。

判断集合是否相同

提取集合中所有元素的信息指纹,然后相加,从而判断两个集合是否相等。

判断两个集合是否大致相等

提取两个集合中具有某种相同特征的两个子集,计算信息指纹然后相加,多提取一些特征进行多次计算,从而判断两个集合是否相同。例如提取两个集合的字符串中以a结尾的字符,或者提取两个网页中IDF值IDF = log(D/d) 其中D为文档总数,d为词在多少文档中出现过(IDF值越大,词越稀有)最大的几个词进行网页判重,或者提取IDF特征词进行文章抄袭的判断,或者提取视频的关键帧,从而进行视频的反盗版。



Variance 和 Bias

Variance
Variance即方差

减小Variance

  1. 增加数据
  2. 正则化处理

减小Bias

  1. 更复杂的模型
  2. 更多的特征

Variance和Bias的本质
Variance和Bias

  1. Variance是枪瞄准靶心射出去,漂移的范围有多大
  2. Bias是枪并没有瞄准靶心射出去,其偏离靶心的距离有多远

复杂模型和简单模型的直观解释

  1. 复杂模型往往有着很大的Variance和很小的Bias
  2. 简单模型往往有着很小的Variance和很大的Bias

  3. 复杂的模型,由于其Func Set很大,所以更有可能覆盖并解释target

  4. 简单的模型,由于其Func Set较小,所以很可能不能解释target,即Bias太大


标准差、协方差与皮尔逊相关系数

解释

标准差
标准差用来描述变量沿着均值的波动程度,标准差和均值的量纲(单位)是一致的,在描述一个波动范围时标准差比方差更方便,比如一个班男生的平均身高是 170cm,标准差是 10cm,那么方差就是 100cm^2。可以进行的比较简便的描述是本班男生身高分布是 170±10cm

协方差公式
Cov(X,Y)=E[(X-ux)(Y-uy)]
用来描述两个随机变量的变化关系,是否相关,其中(X-ux)就是变量X沿着均值变化的振幅。

皮尔逊相关系数公式
p = Cov(X,Y) / (X的标准差 * Y的标准差)
是标准化后的协方差,用来衡量两个随机变量的相关程度

总结

  • 协方差公式用来衡量两个变量X、Y的变化趋势,如果两个变量在某一时刻都大于各自的期望值,那么该时刻的两个变量都是同方向偏离各自均值,如果大多数情况下两个变量都是同方向偏离均值,那么这两个变量就是正相关的。

  • 皮尔逊相关系数是标准化的协方差,标准化后,其大小范围为:[-1, 1],当相关系数为1时,两个变量时完全正相关的,即你变大一倍,我也变化一倍(例如y = 2x);当相关系数为0时,两个变量完全无关;当相关系数为-1时,两个变量完全负相关,即你变大一倍,我缩小一倍(例如y = -2x

思考

  • 任何一个朴素的公式或算法,都来源于对本质的深刻洞察。学习一门科学,一定要抓住最本质的东西。

信息量的建模与信息熵

建模的直觉

奇异博士在复仇者联盟中利用时间宝石看到了所有可能的结果,一共14000605个,而复仇者们只赢了一次。我们以复仇者们对抗灭霸事件为例,引出信息量的建模。

首先该事件有两种可能,从灭霸的角度来看,1400万中可能中,只有一种是输了,其余都是灭霸赢了,那么从概率上来说,灭霸赢基本上毫无悬念了。这件事的信息量就非常小的。但是小归小,它的信息量是非零的,毕竟还是有可能输的。这里得到了一个信息量的性质:非零性

从直觉上看,灭霸几乎是百分之百赢的,所以灭霸赢的这个结果所传达的信息量非常小,而灭霸输的概率很小,那么灭霸输所传达的信息量就非常大了,所以如果一个结果的概率增大,其信息量反而是减小的,也就是说信息量与概率成反比。这里得到了一个信息量的性质:单调递减

对于 灭霸 Vs 复仇者 的这个事件的两个结果,虽然灭霸输有很大的信息量,但是其概率是微乎其微的,所以对于这个事件,从概率论角度来说,其所传达的信息量并不大。如果事件的两个结果概率对半分,那么其包含的信息量就更大了。所以一件事情的信息量与其结果的概率有关

如果发生两个事件,例如 美队 Vs 亡刃将军, 黑寡妇 Vs 暗夜比邻星,那么这两个事件的信息量具有可加性

从直觉上看,如果 灭霸 Vs 复仇者 事件的结果从两种变成4中,从{输,赢}变成了{输,赢,平手,和解} 那么显然后者4个结果的事件,其所包含的信息量更大。也就是说当其他条件不变,事件的结果 n 增多后,那么其信息量应该增大

我们将以上的直觉分析形式化,定义一个事件 A,这件事情有 n 个结果,每一个结果的概率为{p(A1),p(A2),.....p(An)}定义这件事情的信息量为 E(A),每一个结果的信息量为 E(An)E(A)n{p(A1),p(A2),.....p(An)} 两组参数共同决定:

  • E(A) > 0 恒成立
  • p(An) 增大, E(An) 减小
  • E(A) 与 p(A1),p(A2),….有关
  • E(AB) = E(A) + E(B)
  • n 增大,E(A) 增大

对于每一个结果的信息量,根据这些性质,我们可以先绘制一个图:
建模图片

从图中我们可以看出,这个函数的大致特点,其应该是非零单调递减的,而且在发生概率为1的时候信息量为0,在 概率-> 0 时,信息量趋近于无穷大,显然 1/x 的函数是不能满足的,f(1) = 0 的特点让我们想到了 log(x),这个图就像是log(x)函数取了一个符号,沿着 x 轴翻过去了一样。 由于 0<x<1 and 单调减 ,所以我们在前面加一个符号:-log(x),这个函数就完美的匹配了以上提到的这些性质。

最后得到衡量事件的每一个结果的信息量计算公式: -log(p(An))

而一个事件的信息量则为其每一个结果的 信息量的加权平均 ,即为 信息熵

总结

信息量与信息熵

  • 一个事件结果的信息量就是对其发生的 概率取负对数

  • 一个事件的信息量与其结果的个数和每个结果的概率有关,也就是和 变量的分布 有关。

  • 一个事件的信息量就是其信息熵,也就是其每个结果的 加权信息量

如何进行数学建模

  • 先把所有的直觉形式化

  • 画个图试一试,抓住一些特殊点,套一个公式

  • 本质上是找到一个合适的公式解释这种直觉

信息熵的作用

  • 信息熵就是一个事件或者系统的复杂程度,信息熵越大,其不确定性也越大。

如何学习

  • 一个知识点以前不会,并不代表现在不会;书和视频以前看不懂,并不代表现在看不懂;一个知识点被认为学会了,并不一定是真正学会了。知识是慢慢补充的。


matrix67_基于SNS的文本数据挖掘(一)

概述

介绍了一种新词识别的方法:基于 内部凝合程度信息熵

1、两个字A 和 B的凝合程度 = P(AB) / P(A) * P(B) 凝合程度越高,说明两个字成词的概率越大

2、词A的前后搭配词的两个集合为:front_set, back_set。集合中词的信息熵越大(即词的种类越多,混乱度越大),说明词A独立成词的概率越大,自由度高,如果搭配比较固定,说明该词可能有一个固定搭配的词,不能独立成词。

总结

  • 一个词如果要想独立成词,其应该有丰富的左邻字集合和右邻字集合和高内部凝合度。 凝合度可以看成是从自身出发进行分析,而自由度则是从该词所处的环境出发进行分析。一内一外,这个方法很平衡

  • 这篇文章涉及到两个重要知识点: 互信息信息熵

重点

为了证明“电影院”一词的内部凝固程度确实很高,我们可以计算一下,如果“电影”和“院”真的是各自独立地在文本中随机出现,它俩正好拼到一起的概率会有多小。在整个 2400 万字的数据中,“电影”一共出现了 2774 次,出现的概率约为 0.000113 。“院”字则出现了 4797 次,出现的概率约为 0.0001969 。如果两者之间真的毫无关系,它们恰好拼在了一起的概率就应该是 0.000113 × 0.0001969 ,约为 2.223 × 10 次方。但事实上,“电影院”在语料中一共出现了175 次,出现概率约为 7.183 × 10 次方,是预测值的 300 多倍。

用信息熵来衡量一个文本片段的左邻字集合和右邻字集合有多随机。光看文本片段内部的凝合程度还不够,我们还需要从整体来看它在外部的表现。考虑“被子”和“辈子”这两个片段。我们可以说“买被子”、“盖被子”、“进被子”、“好被子”、“这被子”等等,在“被子”前面加各种字;但“辈子”的用法却非常固定,除了“一辈子”、“这辈子”、“上辈子”、“下辈子”,基本上“辈子”前面不能加别的字了。“辈子”这个文本片段左边可以出现的字太有限,以至于直觉上我们可能会认为,“辈子”并不单独成词,真正成词的其实是“一辈子”、“这辈子”之类的整体。可见,文本片段的自由运用程度也是判断它是否成词的重要标准。如果一个文本片段能够算作一个词的话,它应该能够灵活地出现在各种不同的环境中,具有非常丰富的左邻字集合和右邻字集合。 也称为自由度

在实际运用中你会发现,文本片段的凝固程度和自由程度,两种判断标准缺一不可。只看凝固程度的话,程序会找出“巧克”、“俄罗”、“颜六色”、“柴可夫”等实际上是“半个词”的片段;只看自由程度的话,程序则会把“吃了一顿”、“看了一遍”、“睡了一晚”、“去了一趟”中的“了一”提取出来,因为它的左右邻字都太丰富了。

思考

  • 对于自然语言处理的学习,一定要深入到理论上,不要做表面功夫

  • 很多算法都是很朴素的,直接就能想到

  • 可以先举一些数据量小的例子进行算法的模拟,当成功后,再迁移到大的数据集上

  • 设计算法的时候要注意算法复杂度,毕竟NLP一般处理的都是大数据

  • 阅读好的文章,要学习作者是怎么思考的

  • 能够提出一个好问题,这同样很重要

一个问题

如何量化30->60的改变比1->4的改变大