您的位置:首页 > 其它

文本分类之特征简约算法说明

2010-07-20 22:16 176 查看
http://blog.csdn.net/aalbertini/archive/2010/07/20/5749883.aspx

用数值衡量某个特征的重要性。

1 df: 用df衡量重要性。 df就是包含该词的文档的个数 除以 文档总数

2 ig: infomation gain

信息论中有关信息量(就是“熵”)的定义。说有这么一个变量X,它可能的取值有n多种,分别是x1,x2,……,xn,每一种取到的概率分别是P1,P2,……,Pn,那么X的熵就定义为:





意思就是一个变量可能的变化越多(反而跟变量具体的取值没有任何关系,只和值的种类多少以及发生概率有关),它携带的信息量就越大(因此我一直觉得我们的政策法规信息量非常大,因为它变化很多,基本朝令夕改,笑)。

对分类系统来说,类别C是变量,它可能的取值是C1,C2,……,Cn,而每一个类别出现的概率是P(C1),P(C2),……,P(Cn),因此n就是类别的总数。此时分类系统的熵就可以表示为:





我们用T代表特征,而用t代表T出现,那么:





与刚才的式子对照一下,含义很清楚对吧,P(t)就是T出现的概率,

就是T不出现的概率。这个式子可以进一步展开,其中的





另一半就可以展开为:





因此特征T给系统带来的信息增益就可以写成系统原本的熵与固定特征T后的条件熵之差:





公式中的东西看上去很多,其实也都很好计算。比如P(Ci),表示类别Ci出现的概率,其实只要用1除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。再比如P(t),就是特征T出现的概率,只要用出现过T的文档数除以总文档数就可以了,再比如P(Ci|t)表示出现T的时候,类别Ci出现的概率,只要用出现了T并且属于类别Ci的文档数除以出现了T的文档数就可以了。

代码中的 double p = 1 + pt / total * pct + (1 - pt / total) * pnotct;

其中

1表示H(C)。因为每个类别都是一样大,所以H(C) = 2。。。???

pt/total 表示P(t);特征t出线的概率;

(1 - pt/total)表示P(t');特征t不出现的概率

http://www.360doc.com/content/10/0520/14/1472642_28554810.shtml

3 mi, mutual infomation

互信息衡量的是某个词和类别之间的统计独立关系,某个词t和某个类别Ci传统的互信息定义如下:

  互信息是计算语言学模型分析的常用方法,它度量两个对象之间的相互性。在过滤问题中用于度量特征对于主题的区分度。互信息的定义与交叉嫡近似。互信息本来是信息论中的一个概念,用于表示信息之间的关系, 是两个随机变量统计相关性的测度,使用互信息理论进行特征抽取是基于如下假设:在某个特定类别出现频率高,但在其他类别出现频率比较低的词条与该类的互信息比较大。通常用互信息作为特征词和类别之问的测度,如果特征词属于该类的话,它们的互信息量最大。由于该方法不需要对特征词和类别之问关系的性质作任何假设,因此非常适合于文本分类的特征和类别的配准工作。

double itc = Math.log(tf / one / (pt / total * one / total));
// double itc = Math.log(tf * total / one * pt);
avgItc += itc * (one / total);

其中,

pt表示P(t),包含该特征的文档个数

tf/one表示类中包含该特征的文档个数, pt/total表示特征出线的概率, one/total表示类的大小

4 chi,

5 sd, standard deviation. st = Math.sqrt(st / (tfs.length - 1) ); 其中为什么要减去1? 似乎和标准差的定义不符合。。

6 是df * idf? 应该是tf * idf吧?

7 df * idf * sd? 同上, 应该是tf * idf * sd? 而且sd的求法有问题?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: