counts:计数。 记录样本集中每个样本的每个属性的在每个类中出现的加权次数
counts[data.numAttributes()][numValues + 1][numClasses + 1]
m_ChiSquareds[data.numAttributes]; //记录每个属性的叉方值
for(int i = 0; i < data.numAttributes(); i++)
m_ChiSquareds[i] = chiVal(counts[i]);
假设chiVal的输入有3行3列, 如下:
1 2 3
4 2 1
2 3 3
则计算行和列和总和之后为
1 2 3 6
4 2 1 7
2 3 3 8
7 7 7 21
那么e[0][0]的期望值是多少呢? 已知行和分别为6、7、8, 列和分别为7、7、7的情况下。
e[0][0] = r[0] * c[0] / n, diff[i][j] = | [i][j] - e[i][j] |
那么该cell的chiVal值就是 diff[i][j]^2/e[i][j]
整个矩阵的chiVal就是各cell的chiVal之和
那么, 这个chiVal衡量的是什么东西呢, 如何用来做特征选择?
http://www.blogjava.net/zhenandaci/archive/2008/08/31/225966.html
diff衡量的是观测频度与期望频度的差
diff^2衡量的是方差
diff^2/E, 类似于相对方差
开方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
在文本分类问题的特征选择阶段,我们主要关心一个词t(一个随机变量)与一个类别c(另一个随机变量)之间是否相互独立?如果独立,就可以说词t对类别c完全没有表征作用,即我们根本无法根据t出现与否来判断一篇文档是否属于c这个分类。但与最普通的开方检验不同,我们不需要设定阈值,因为很难说词t和类别c关联到什么程度才算是有表征作用,我们只想借用这个方法来选出一些最最相关的即可。
此时我们仍然需要明白对特征选择来说原假设是什么,因为计算出的开方值越大,说明对原假设的偏离越大,我们越倾向于认为原假设的反面情况是正确的。我们能不能把原假设定为“词t与类别c相关“?原则上说当然可以,这也是一个健全的民主主义社会赋予每个公民的权利(笑),但此时你会发现根本不知道此时的理论值该是多少!你会把自己绕进死胡同。所以我们一般都使用”词t与类别c不相关“来做原假设。选择的过程也变成了为每个词计算它与类别c的开方值,从大到小排个序(此时开方值越大越相关),取前k个就可以(k值可以根据自己的需要选,这也是一个健全的民主主义社会赋予每个公民的权利)。
文本特征选择中, 计算每个属性的叉方值, 取最大的前k个