ChiMerge 是监督的、自底向上的(即基于合并的)数据离散化方法。它依赖于卡方分析:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。

参考:

1. ChiMerge:Discretization of numeric attributs

2. Chi算法

参考1的要点:

1、 最简单的离散算法是: 等宽区间。 从最小值到最大值之间,,均分为N等份, 这样, 如果 A, B为最小最大值, 则每个区间的长度为w=(B-A) / N, 则区间边界值为 A+W, A+2W, …. A+(N-1)W.

2、 还有一种简单算法,等频区间。区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10,每个区间应该包含大约10%的实例。

3、 以上两种算法有弊端:比如,等宽区间划分,划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频区间可能正好相反,所有工资高于

50000的人都会被划分到50000这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。

4、 C4、CART、PVM算法在离散属性时会考虑类信息,但是是在算法实施的过程中间,而不是在预处理阶段。例如,C4算法(ID3决策树系列的一种),将数值属性离散为两个区间,而取这两个区间时,该属性的信息增益是最大的。

5、 评价一个离散算法是否有效很难,因为不知道什么是最高效的分类。

6、 离散化的主要目的是:消除数值属性以及为数值属性定义准确的类别。

7、 高质量的离散化应该是:区间内一致,区间之间区分明显。

8、 ChiMerge算法用卡方统计量来决定相邻区间是否一致或者是否区别明显。如果经过验证,类别属性独立于其中一个区间,则这个区间就要被合并。

9、 ChiMerge算法包括2部分:1、初始化,2、自底向上合并,当满足停止条件的时候,区间合并停止。

第一步:初始化

根据要离散的属性对实例进行排序:每个实例属于一个区间

第二步:合并区间,又包括两步骤

(1) 计算每一对相邻区间的卡方值

(2) 将卡方值最小的一对区间合并

预先设定一个卡方的阈值,在阈值之下的区间都合并,阈值之上的区间保持分区间。

卡方的计算公式:

参数说明;

m=2(每次比较的区间数是2个)

k=类别数量

Aij=第i区间第j类的实例的数量

Ri=第i区间的实例数量

Cj=第j类的实例数量

N=总的实例数量

Eij= Aij的期望频率

10、卡方阈值的确定:先选择显著性水平,再由公式得到对应的卡方值。得到卡方值需要指定自由度,自由度比类别数量小1。例如,有3类,自由度为2,则90%置信度(10%显著性水平)下,卡方的值为4.6。阈值的意义在于,类别和属性独立时,有90%的可能性,计算得到的卡方值会小于4.6,这样,大于阈值的卡方值就说明属性和类不是相互独立的,不能合并。如果阈值选的大,区间合并就会进行很多次,离散后的区间数量少、区间大。用户可以不考虑卡方阈值,此时,用户可以考虑这两个参数:最小区间数,最大区间数。用户指定区间数量的上限和下限,最多几个区间,最少几个区间。

11、 ChiMerge算法推荐使用.90、.95、.99置信度,最大区间数取10到15之间.

举例:

取鸢尾花数据集作为待离散化的数据集合,使用ChiMerge算法,对四个数值属性分别进行离散化,令停机准则为max_interval=6。(韩家炜 数据挖掘概念与技术 第三版 习题3.12)

下面是我用Python写的程序,大致分两步:

第一步,整理数据

读入鸢尾花数据集,构造可以在其上使用ChiMerge的数据结构,即, 形如 [('4.3', [1, 0, 0]), ('4.4', [3, 0, 0]),...]的列表,每一个元素是一个元组,元组的第一项是字符串,表示区间左端点,元组的第二项是一个列表,表示在此区间各个类别的实例数目;

第二步,离散化

使用ChiMerge方法对具有最小卡方值的相邻区间进行合并,直到满足最大区间数(max_interval)为6

程序最终返回区间的分裂点

__author__ = "Yinlong Zhao (zhaoyl[at]sjtu[dot]edu[dot]cn)"
__date__ = "$Date: 2013/03/25 $"from time import ctimedef read(file):'''read raw date from a file '''Instances=[]fp=open(file,'r')for line in fp:line=line.strip('\n') #discard '\n'if line!='':Instances.append(line.split(','))fp.close()return(Instances)def split(Instances,i):''' Split the 4 attibutes, collect the data of the ith attributs, i=0,1,2,3Return a list like [['0.2', 'Iris-setosa'], ['0.2', 'Iris-setosa'],...]'''log=[]for r in Instances:log.append([r[i],r[4]])return(log)def count(log):'''Count the number of the same recordReturn a list like [['4.3', 'Iris-setosa', 1], ['4.4', 'Iris-setosa', 3],...]'''log_cnt=[]log.sort(key=lambda log:log[0])i=0while(i<len(log)):cnt=log.count(log[i])#count the number of the same recordrecord=log[i][:]record.append(cnt) # the return value of append is Nonelog_cnt.append(record)i+=cnt#count the next diferent item return(log_cnt)def build(log_cnt):'''Build a structure (a list of truples) that ChiMerge algorithm works properly on it '''log_dic={}for record in log_cnt:if record[0] not in log_dic.keys():log_dic[record[0]]=[0,0,0]if record[1]=='Iris-setosa':log_dic[record[0]][0]=record[2]elif record[1]=='Iris-versicolor':log_dic[record[0]][1]=record[2]elif record[1]=='Iris-virginica':log_dic[record[0]][2]=record[2]else:raise TypeError("Data Exception")log_truple=sorted(log_dic.items())return(log_truple)def collect(Instances,i):''' collect data for discretization '''log=split(Instances,i)log_cnt=count(log)log_tuple=build(log_cnt)return(log_tuple)def combine(a,b):'''  a=('4.4', [3, 1, 0]), b=('4.5', [1, 0, 2])combine(a,b)=('4.4', [4, 1, 2])  '''c=a[:] # c[0]=a[0]for i in range(len(a[1])):c[1][i]+=b[1][i]return(c)def chi2(A):''' Compute the Chi-Square value '''   m=len(A);k=len(A[0])R=[]for i in range(m):sum=0for j in range(k):sum+=A[i][j]R.append(sum)C=[]for j in range(k):sum=0for i in range(m):sum+=A[i][j]C.append(sum)N=0for ele in C:N+=eleres=0for i in range(m):for j in range(k):Eij=R[i]*C[j]/Nif Eij!=0:res=res+(A[i][j]-Eij)**2/Eijreturn resdef ChiMerge(log_tuple,max_interval):''' ChiMerge algorithm  '''''' Return split points '''    num_interval=len(log_tuple)while(num_interval>max_interval):               num_pair=num_interval-1chi_values=[]for i in range(num_pair):arr=[log_tuple[i][1],log_tuple[i+1][1]]chi_values.append(chi2(arr))min_chi=min(chi_values) # get the minimum chi value for i in range(num_pair-1,-1,-1): # treat from the last oneif chi_values[i]==min_chi:log_tuple[i]=combine(log_tuple[i],log_tuple[i+1]) # combine the two adjacent intervalslog_tuple[i+1]='Merged'while('Merged' in log_tuple): # remove the merged recordlog_tuple.remove('Merged')num_interval=len(log_tuple)split_points=[record[0] for record in log_tuple]return(split_points)def discrete(path):''' ChiMerege discretization of the Iris plants database '''Instances=read(path)max_interval=6num_log=4for i in range(num_log):log_tuple=collect(Instances,i) # collect data for discretizationsplit_points=ChiMerge(log_tuple,max_interval) # discretize data using ChiMerge algorithm print(split_points)if __name__=='__main__':print('Start: ' + ctime())discrete('c:\\Python33\\iris.data')print('End: ' + ctime())

函数说明:

1. collect(Instances,i)

读入鸢尾花数据集,取第i个特征构造一个数据结构,以便使用ChiMerge算法。这个数据结构 形如 [('4.3', [1, 0, 0]), ('4.4', [3, 0, 0]),...]的列表,每一个元素是一个元组,元组的第一项是字符串,表示区间左端点,元组的第二项是一个列表,表示在此区间各个类别的实例数目

2. ChiMerge(log_tuple,max_interval)

ChiMerge算法,返回区间的分裂点

程序运行结果:

>>> ================================ RESTART ================================
>>>
Start: Mon Mar 25 21:31:40 2013
['4.3', '4.9', '5.0', '5.5', '5.8', '7.1']
['2.0', '2.3', '2.5', '2.9', '3.0', '3.4']
['1.0', '3.0', '4.5', '4.8', '5.0', '5.2']
['0.1', '1.0', '1.4', '1.7', '1.8', '1.9']
End: Mon Mar 25 21:31:40 2013
>>> 

本文出自: http://blog.csdn.net/zhaoyl03/article/details/8689440

ChiMerge 算法: 以鸢尾花数据集为例相关推荐

  1. 感知机算法在鸢尾花数据集上的实践

    感知机算法在鸢尾花数据集上的实践 1 问题背景 2 数据集的微处理 3 导数据,并进行简单可视化 4 模型算法的训练部分 1 问题背景 感知机作为一个比较经典的处理线性二分类的算法,今天想着实践一下, ...

  2. KNN算法实现鸢尾花数据集分类

    KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...

  3. 逻辑回归算法实现鸢尾花数据集的二分类

    1.介绍 前言   为了更好的理解本章内容,请参考下面的网址,自主学习一些矩阵求导运算. https://zhuanlan.zhihu.com/p/158182135机器学习约定规则: 向量对标量求导 ...

  4. 线性回归中,三种梯度下降MGD、BGD与MBGD对比研究(三)——以鸢尾花数据集为例

    上一次,写了MGD.SGD.MBGD的代码实现,现在,我们来康康实例 我们以大名鼎鼎的鸢尾花数据集为例: https://archive.ics.uci.edu/ml/machine-learning ...

  5. Python原生代码实现KNN算法(鸢尾花数据集)

    一.作业题目 Python原生代码实现KNN分类算法,使用鸢尾花数据集. KNN算法介绍: K最近邻(k-Nearest Neighbor,KNN)分类算法,是机器学习算法之一. 该方法的思路是:如果 ...

  6. 数据集特征提取_基于PCA算法实现鸢尾花数据集的特征提取任务

    PCA算法的必要性 多变量大数据集无疑会为研究和应用提供丰富的信息,但是许多变量之间可能存在相关性,从而增加了问题分析的复杂性.如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息, ...

  7. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  8. python KNN分类算法 使用鸢尾花数据集实战

    KNN分类算法,又叫K近邻算法,它概念极其简单,但效果又很优秀. 如觉得有帮助请点赞关注收藏啦~~~ KNN算法的核心是,如果一个样本在特征空间中的K个最相似,即特征空间中最邻近的样本中的大多数属于某 ...

  9. 如何了解Ski-learn提供的离散型数据集的构造——以鸢尾花数据集为例

    一.利用描述函数 #导入鸢尾花数据集 from sklearn.datasets import load_iris # 描述鸢尾花数据集 iris = load_iris() # 输出对iris数据集 ...

最新文章

  1. 软件开发的“黑名单”规则设定:benchmark
  2. I've got so many hongbaos(should it be translated as red bags?)
  3. Redis Cluster Gossip 协议详解
  4. nodejs操作sqlserver数据_nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例...
  5. java编码转换报错_Java中BeanUtils的日期转换 代码报错 怎么解决
  6. POJ2258 ZOJ1947 UVA539 The Settlers of Catan题解
  7. 卫星轨道的估计问题(Matlab)(一):理论基础
  8. Java中常用的设计模式
  9. android 修改imei源码,Android 修改imei、gps等信息分析
  10. php网站友链直显代码,discuz 友情链接 代码
  11. CentOS 编译安装 MySQL5.7
  12. 实战1--航空公司客户价值分析(画图篇)
  13. 360无线wifi 无法连接服务器,360wifi连接上但上不了网的解决方法
  14. 云防护当道,如何绕过云防护来进行渗透测试
  15. 2022广东省安全员A证第四批(主要负责人)判断题及模拟考试
  16. Kickstart无人值守安装
  17. Java web15
  18. 京东程序员压力太大在网页植入骂人代码?官方辟谣!
  19. 剑侠情缘(网络版)---开发回顾 (转载)
  20. 《Ghost Win7 SP1 电脑商装机版 V3.0》64位(电脑疯子作品)

热门文章

  1. .net core IIS/Kestrel上传大文件的解决方法
  2. (超好用)linux/Windows环境下pdf转图片
  3. 分享一些我做笔记的经验(二)
  4. 对啊网初级会计6所有者权益
  5. centos的国内镜像源
  6. 快速掌握numpy.hanning、numpy.outer、numpy.meshgrid函数
  7. Choerodon猪齿鱼微服务后端环境变量方案
  8. EasyDarwin使用udp方式推流实现摄像头直播代码流程分析
  9. 《捕鱼达人3》主程洪志雄专访:引擎3D功能重大突破与创新
  10. oracle10g安装问题总结