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]);

[cpp] view plaincopy
  1. chiVal:
  2. nrows = matrix.length;                    //行数
  3. ncols = matrix[0].length;                 //列数
  4. rtotal = new double [nrows];              //行和
  5. ctotal = new double [ncols];              //列和
  6. for (row = 0; row < nrows; row++) {
  7. for (col = 0; col < ncols; col++) {
  8. rtotal[row] += matrix[row][col];
  9. ctotal[col] += matrix[row][col];
  10. n += matrix[row][col];         //计算每行之和、每列之和、所有和n
  11. }
  12. }
  13. df = (nrows - 1)*(ncols - 1);      //自由度
  14. if (df <= 0) {
  15. return 0;
  16. }
  17. chival = 0.0;
  18. for (row = 0; row < nrows; row++) {
  19. if (Utils.gr(rtotal[row], 0)) {
  20. for (col = 0; col < ncols; col++) {
  21. if (Utils.gr(ctotal[col], 0)) {//大于0
  22. expect = (ctotal[col] * rtotal[row]) / n;   //该cell的期望值
  23. chival += chiCell (matrix[row][col], expect);
  24. }
  25. }
  26. }
  27. }
  28. return chival;
  29. chiCell:
  30. //freq 【in 第一个参数】
  31. //exptcted【in 第二个参数】
  32. // Cell in empty row and column?
  33. if (Utils.smOrEq(expected, 0)) {  //expteced与0很接近
  34. return 0;
  35. }
  36. // Compute difference between observed and expected value
  37. double diff = Math.abs(freq - expected);
  38. // Return chi-value for the cell
  39. return (diff * diff / expected);

假设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个

%%%   dataset中的最后一列为分类类别,k为要选择的特征个数

function result=chiAttributeEva(dataset,k)

% character_order
character_order=[];
% the count of classes
classes=unique(dataset(:,size(dataset,2)));
n=size(dataset,2)-1;
for i=1:n
    character=dataset(:,i);
    character_value=unique(character,'rows');
    chi_i=0;
    for j=1:length(character_value)
        value_rows_id=find(character==character_value(j));
        value_rows=dataset(value_rows_id,:);
        for m=1;length(classes)
            class_id=find(value_rows(:,size(value_rows,2))==classes(m));
            o_jk=length(class_id);
            o_j=length(value_rows_id);
            o_k=length(find(dataset(:,size(dataset,2)))==classes(m));
            e_jk=o_j*o_k/n;
            chi=(o_jk-e_jk)^2/e_jk;
            chi_i=chi_i+chi;
        end
    end
    character_order(i,:)=[i,chi_i];    
end
character_order=sortrows(character_order,2);
result=character_order(1:k,:);
end

特征选择---文本分类:叉方统计量 卡方相关推荐

  1. 特征选择---文本分类:叉方统计量

    counts:计数. 记录样本集中每个样本的每个属性的在每个类中出现的加权次数 counts[data.numAttributes()][numValues + 1][numClasses + 1] ...

  2. 卡方 python_卡方优度检测 (Python 实现) --基于jupyter

    卡方独立性检验 import numpy as np from scipy.stats import chi2_contingency # 列联表分析 from scipy.stats import ...

  3. 特征选择--文本分类: 信息增益

    counts:计数. 记录样本集中每个样本的每个属性的在每个类中出现的加权次数 counts[data.numAttributes()][numValues + 1][numClasses + 1] ...

  4. 卡方 python_Python卡方拟合优度检验得到最优分布

    给定一组数据值,我试图得到描述数据的最佳理论分布.经过几天的研究,我想出了下面的python代码.在import numpy as np import csv import pandas as pd ...

  5. 2×3卡方检验prism_卡方独立性检验原理

    这篇文章主要讲了两个部分,一个是卡方检验的推导,一个是卡方检验应该取多少样本量. 卡方独立性检验是为了检验两个变量是否独立,我们先来回顾一下卡方独立性检验的流程: 1.统计列联表,计算观察值: 表一 ...

  6. 卡方分布的期望和方差_卡方独立性检验原理

    这篇文章主要讲了两个部分,一个是卡方检验的推导,一个是卡方检验应该取多少样本量. 卡方独立性检验是为了检验两个变量是否独立,我们先来回顾一下卡方独立性检验的流程: 1.统计列联表,计算观察值: 表一 ...

  7. 数学建模拓展内容:卡方检验和Fisher精确性检验(附有SPSS使用步骤)

    卡方检验和Fisher精确性检验 卡方拟合度检验 卡方独立性检验 卡方检验的前提假设 Fisher精确性检验 卡方拟合度检验 卡方拟合度检验概要:卡方拟合度检验也被称为单因素卡方检验,用于检验一个分类 ...

  8. [026]文本分类之SVM

    1 基础知识 1. 1 样本整理 文本分类属于有监督的学习,所以需要整理样本.根据业务需求,确定样本标签与数目,其中样本标签多为整数.在svm中其中如果为二分类,样本标签一般会设定为-1和1,而在朴素 ...

  9. 利用SVM 实现文本分类的实例

    原文来自:http://blog.csdn.net/zhzhl202/article/details/8197109 之前做过一些文本挖掘的项目,比如网页分类.微博情感分析.用户评论挖掘,也曾经将li ...

  10. python 特征选择卡方_特征选择

    2020-01-10 皮尔逊相关系数 image.png 衡量线性相关性,检查数据集里目标和数值特征之间皮尔逊相关系数的绝对值.根据这个准则保留前n个特征.def cor_selector(X, y, ...

最新文章

  1. 猎豹MFC--TH_双管道--对管道的操作就想对文件的操作一样
  2. 2020-11-22(操作系统——页面置换算法)
  3. 谈计算机知识对学生的作用,浅谈计算机在教学中的作用
  4. 3分钟,看回归分析模型怎么做
  5. Royal TS 一款非常好用的SSH客户端,XShell的完美代替品
  6. 我学到的5件事,指导2,500名有抱负的开发人员
  7. delphi query 存储为dbf_Delphi 代码审计项目实战 1
  8. VS2010快捷键总结
  9. python 西门子触摸屏通讯_PLC通过以太网与触摸屏通讯
  10. 业务系统+电子签章开放平台,快速构建个性化的电子签署应用
  11. 第六章、坐标轴的定制
  12. 三位代表中国科技圈的85后技术男,他们眼中的AI是什么?
  13. 初中生怎样学习编程语言?
  14. 数据库巡检 java_美团MySQL数据库巡检系统的设计与应用
  15. myBase Desktop 6.x 用户手册
  16. oracle hint 强制索引
  17. 超级表格迎来深度用户:苏河汇,一个天使投资机构
  18. ue4 Android打包示例
  19. 自学shell编程——第1讲(基础概念、变量、符号、字符串处理)
  20. 怎样建设自组织的团队

热门文章

  1. Unity 3D 实战核心技术详解
  2. 自定义一个序列化表单的方法2+提示语
  3. Servlet技术 - Servlet应用
  4. c# ThreadPoold使用心得
  5. Candy leetcode java
  6. linux 如何查看 块设备_理解Linux操作系统中的块设备
  7. JFrame的层次结构究竟是什么样的,什么又是ContentPane()
  8. 公众号获取用户手机号_微信公众号如何选取种子用户
  9. 三维模型 检索 代码_文章导读|一种基于拉普拉斯算子和联合贝叶斯模型的三维形状检索方法...
  10. webpack 打包第三方库_webpack提取第三方库的正确姿势