统计学中的自由度

自由度

自由度的概念

在统计学中,自由度(degree of freedom, df)指的是计算某一统计量时,取值不受限制的变量个数。通常df=n-k。其中n为样本数量,k为被限制的条件数或变量个数,或计算某一统计量时用到其它独立统计量的个数。自由度通常用于抽样分布中。

统计学上,自由度是指当以样本的统计量估计总体的参数时,样本中独立或能自由变化的数据的个数,称为该统计量的自由度。一般来说,自由度等于独立变量减掉其衍生量数。举例来说,变异数的定义是样本减平均值(一个由样本决定的衍生量),因此对N个随机样本而言,其自由度为N-1

所谓自由度是指问题解的维数,自由度同时也决定了边界条件的维数。在固体力学中,最多自由度可达6个,三个线位移和三个角位移,对应的应力边界条件是线力和力矩,一般结构是以上6这个自由度的子集。

例如平面应力应变结构为;平板结构为;三维实体结构为;平面框架结构为;三维框架结构为全部6个等。

由单元刚度矩阵到结构刚度矩阵,单元与单元之间仅通过节点进行作用联系,变形协调条件,即在相互连接的公共节点处,各单元的节点位移必须相等。力的平衡条件,即在相互连接的公共节点处,各单元对节点的作用力与作用,在该节点的外载荷必须相等。

 

用python实现基于凝固度和自由度的新词发现

这篇就来讨论发现新词的一种算法。

 

n-gram加词频

最原始的新词算法莫过于n-gram加词频了。简单来说就是,从大量语料中抽取连续的字的组合片段,这些字组合片段最多包含n个字,同时统计每个字组合的频率,按照词频并设置一个阈值来判断一个字组合片段是否为词汇。 该方法简单处理速度快,它的缺点也很明显,就是会把一些不是词汇但出现频率很高的字组合也当成词了。

 

凝固度和自由度

这个算法在文章《互联网时代的社会语言学:基于SNS的文本数据挖掘》 里有详细的阐述。 凝固度就是一个字组合片段里面字与字之间的紧密程度。比如“琉璃”、“榴莲”这样的词的凝固度就非常高,而“华为”、“组合”这样的词的凝固度就比较低。 自由度就是一个字组合片段能独立自由运用的程度。比如“巧克力”里面的“巧克”的凝固度就很高,和“巧克力”一样高,但是它自由运用的程度几乎为零,所以“巧克”不能单独成词。

 

Python实现

根据以上阐述,算法实现的步骤如下:

1. n-gram统计字组合的频率

如果文本量很小,可以直接用Python的dict来统计n-gram及其频率。一段文本n-gram出来的字组合的大小大约是原始文本的(1+n)*n/2倍,字组合的数量也非常惊人。比如,“中华人民共和国”的首字n-gram是(n=5):

中
中华
中华人
中华人民
中华人民共

n-gram统计字组合频率的同时还要统计字组合的左右邻居,这个用来计算自由度。 如果文本量再大一些,Python的dict经常会碰到最好使用trie tree这样的数据结构。双数组Trie Tree有很多非常好的开源实现,比如,cedar、darts等等。Trie Tree使用的好处是,它天然包含了字组合的右邻居信息,因为这个数据结构一般是前缀树。要统计左邻居信息时,只需要把字组合倒序放入另外一个Trie Tree即可。

使用cedar Trie Tree的时候,5-gram统计30M的文本大约使用6GB左右的内存。 如果文本量更大,这就要借助硬盘了,可以使用leveldb这样的key-value数据库来实现。实验下来,trie tree统计30M的文本用几十秒,而同样的用leveldb统计却要6个多小时!!!应该还有比leveldb更合适的数据库来做这件事情,有时间再说。 当然,为了发现新词,几十MB的文本文本足够了。

 

2. 计算字组合的凝固度;

有了上述的统计结果,计算每个字组合的凝固度就比较简单了。 首先,把字组合切分成不同的组合对,比如’abcd’可以拆成(‘a’, ‘bcd’), (‘ab’, ‘cd’), (‘abc’, ‘d’), 然后,计算每个组合对的凝固度:D(s1, s2) = P(s1s2) / (P(s1) * P(s2)) 最后,取这些组合对凝固度中最小的那个为整个字组合的凝固度。

3. 计算字组合的自由度;

分别计算它的左邻居信息熵和右邻居信息熵,取其中较小的为该组合的自由度

4. 阈值的选择

整个过程涉及到三个阈值的选择: 组合的词频:频率很低的组合成词的可能性很小 组合的凝固度:凝固度越大成词的可能性越大 组合的自由度:自由度越大成词的可能性越大 经验值:30M文本,词频>200, 凝固度>10(n-1), 自由度>1.5 小窍门:词频>30, 凝固度>20(n-1)也能发现很多低频的词汇。

卡方检验中自由度的计算

 

 

 

给定一组数据,我们来计算不同的统计量,看看自由度的变化。这些数据分别为 1 2 4 6 8. 5个数。

先来求平均值,这几个数据都可以任意变化成其它数据,而我们仍然可以对它们求平均值,它们的平均值也跟着变化。这时自由度为5,也就是说有几个数据自由度就是几。

1)当我们来计算方差时,我们要先计算平均值,下一步再计算方差,计算完平均值后,我们还可以变更这些数据,但是要保证平均值不变化,如果变化,我们需要重新计算均值。

2)而要保证均值不变,那么原来这几个数字中只有4个数字是可以自由变化的,而另外一个数字只能是=均值×5-其它四个数字之和。

3)这个数字的值由其它数字确定了,自己被逼无奈,只能接受这个值,没有自由变化的可能,这一组数字当中,有一个数字没有了自由,因此自由度要减去1.

凡是计算公式中用到一个均值都要减去1.

大家也可以自己查找方差分析中,几个均方的计算公式以及对应的自由度。

1)总体均方,自由度为全部个体数减去1,因为用了总体均数这一个均值; 2)组间均方,自由度为组数减去1.因为计算的是组之间的均值,而且用了这一个组间均值。 3)误差均方,自由度为全部个体数减去组数,计算均值时用到了全部个体值,同时计算了每个组的均值并且使用了这些均值。

卡方检验的自由度: 1)如果是独立性检验,那么自由度就等于(a-1)*(b-1),a b表示这两个检验条件的对应的分类数。

比如《问卷与量表数据分析》课程里面的性别和是否购买之间的独立性检验,自由度就等于(2-1)*(2-1)=1。这里可以理解为有两个约束条件,即性别和是否购买这两个变量,这两个变量约束的方向都是自己那一方面的,所以要在自己的类别数目后面减去1,而不是总的类别数减去总的约束条件数目。

2)适合性检验,类别数减去1。此处相当于约束条件只有一个。

卡方检验只有在用笔算查表时使用自由度,软件计算不用担心这个问题,但是最好明白自由度代表着总的变量数目减去约束条件的数目。

总之大家注意到计算自由度时,要考虑限制条件的数目就可以了

Chi-Square检验 代码

f_obs = np.array([contingency_table.iloc[0][0:6].values,
                  contingency_table.iloc[1][0:6].values])
f_obs
​
from scipy import stats
stats.chi2_contingency(f_obs)[0:3]
Out[38]: (2287.190943926107, 0.0, 5)

p值= ~0,自由度= 5。

结论

如果p值<0.05,我们可以拒绝零假设。 “性别”和“每周工作时间”之间肯定存在某种关系。 我们不知道这种关系是什么,但我们知道这两个变量并不是彼此独立的。

你可能感兴趣的:(统计学原理)