请问有人会用R来算chimerge算法吗

评论该主题
作者:您目前是匿名发表 &
作者:,欢迎留言
提示:用户在社区发表的所有资料、言论等仅代表个人观点,与本网站立场无关,不对您构成任何投资建议。用户应基于自己的独立判断,自行决定证券投资并承担相应风险。苹果/安卓/wp
积分 31, 距离下一级还需 14 积分
道具: 彩虹炫, 涂鸦板, 雷达卡, 热点灯, 金钱卡下一级可获得
道具: 显身卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 彩虹炫, 雷达卡, 热点灯, 涂鸦板
,,RChiMerge~@@?!
载入中......
1.Package dprep 要自己安装,安装步骤如下:& 开启R后,Package\Install package(s)\dprep2.我提供两个文件iris.txt & chimerge_demo.R& 没安装dprep,亦可在命令窗口运行,& chimerge_demo.R 已包含细部分解.3.a)iris.txt 放在c碟.& b)运行chimerge_demo.R&&&& File\Open script\chimerge_demo.R&&&& Edit\Run all&&&&
16:11:00 上传
[求助]请问有人会用R来算ChiMerge吗?
!! !~@@”1.,threshold=qchisq(1-alpha,class-1)& #5.991465 ?. "tchisq" &-function(obs){&esp=matrix(0,2,dim(obs)[2])&for (i in 1:2)&&& {&&&&& for (j in 1:dim(obs)[2])&&&&&&&& {&&&&&&&&&& esp[i,j]=(sum(obs[i,])*sum(obs[,j]))/sum(obs)&&&&&&&&&& if (esp[i,j]==0)&&&&&&&&&&&& {&&&&&&&&&&&&&& esp[i,j]=0.1&&&&&&&&&&&& }&&&&&&&& }&&& }&test=sum(((obs-esp)^2)/esp)&print(test)}2.discredata150sl、sw、pl、pw??3.class,class=dim(table(data[,p])) ?~@@4. for (s in 1:(length(z)+5)) &S??
程序中比较重要的function是:& qchisq(), tchisq(), cut(), table()用alpha,degrees of freedom,以 qchisq()算出threshold,& threshold=qchisq(1-alpha,class-1)用tchisq()算出 chi-square,& test[k]=tchisq(d)由于你没安装dprep package,所以程序一开始先给出"tchisq".a=cut(data[,j],breaks=midpoint,include.lowest=TRUE)b=table(a,data[,p])当j=1&& #(sepal length)时b=&&&& a&&&&&& &1 2 3& [4.3,4.35]& 1 0 0& (4.35,4.45] 3 0 0& (4.45,4.55] 1 0 0& (4.55,4.65] 4 0 0& (4.65,4.75] 2 0 0& (4.75,4.85] 5 0 0& (4.85,4.95] 4 1 1& (4.95,5.05] 8 2 0& (5.05,5.15] 8 1 0& (5.15,5.25] 3 1 0& (5.25,5.35] 1 0 0& (5.35,5.45] 5 1 0& (5.45,5.55] 2 5 0& (5.55,5.65] 0 5 1& (5.65,5.75] 2 5 1& (5.75,5.85] 1 3 3& (5.85,5.95] 0 2 1& (5.95,6.05] 0 4 2& (6.05,6.15] 0 4 2& (6.15,6.25] 0 2 2& (6.25,6.35] 0 3 6& (6.35,6.45] 0 2 5& (6.45,6.55] 0 1 4& (6.55,6.65] 0 2 0& (6.65,6.75] 0 3 5& (6.75,6.85] 0 1 2& (6.85,6.95] 0 1 3& (6.95,7.05] 0 1 0& (7.05,7.15] 0 0 1& (7.15,7.25] 0 0 3& (7.25,7.35] 0 0 1& (7.35,7.5]& 0 0 1& (7.5,7.65]& 0 0 1& (7.65,7.8]& 0 0 4& (7.8,7.9]&& 0 0 1对哪个function有疑问,请在command line键入,?qchisq寻求on-line help.靠你自己慢慢学习细细体会了.&
~&&”在这个程序中~我想把class从3改为5但是class=dim(table(data[,p])) 我不知从哪改~请大大交我一下吧…… [此贴子已经被作者于 12:38:09编辑过]
无限扩大经管职场人脉圈!每天抽选10位免费名额,现在就扫& 论坛VIP& 贵宾会员& 可免费加入
加入我们,立即就学扫码下载「就学」app& Join us!& JoinLearn&
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师机器学习(29)
ChiMerge 是监督的、自底向上的(即基于合并的)数据离散化方法。它依赖于:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。
基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
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)
下面是我用写的程序,大致分两步:
第一步,整理数据
读入鸢尾花数据集,构造可以在其上使用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:&&$&&&&&from&time&import&ctime&&&&def&read(file):&&&&&&''&&&&&&Instances=[]&&&&&&fp=open(file,'r')&&&&&&for&line&in&fp:&&&&&&&&&&line=line.strip('\n')&&&&&&&&&&&if&line!='':&&&&&&&&&&&&&&Instances.append(line.split(','))&&&&&&fp.close()&&&&&&return(Instances)&&&&&&def&split(Instances,i):&&&&&&''&&&&&&&log=[]&&&&&&for&r&in&Instances:&&&&&&&&&&log.append([r[i],r[4]])&&&&&&return(log)&&&&&&def&count(log):&&&&&&''&&&&&&&log_cnt=[]&&&&&&log.sort(key=lambda&log:log[0])&&&&&&i=0&&&&&&while(i&len(log)):&&&&&&&&&&cnt=log.count(log[i])&&&&&&&&&&record=log[i][:]&&&&&&&&&&record.append(cnt)&&&&&&&&&&&log_cnt.append(record)&&&&&&&&&&i+=cnt&&&&&&return(log_cnt)&&&&&&def&build(log_cnt):&&&&&&''&&&&&&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):&&&&&&''&&&&&&log=split(Instances,i)&&&&&&log_cnt=count(log)&&&&&&log_tuple=build(log_cnt)&&&&&&return(log_tuple)&&&&&&def&combine(a,b):&&&&&&''&&&&&&&c=a[:]&&&&&&&for&i&in&range(len(a[1])):&&&&&&&&&&c[1][i]+=b[1][i]&&&&&&return(c)&&&&&&def&chi2(A):&&&&&&''&&&&&&&&&m=len(A);&&&&&&k=len(A[0])&&&&&&R=[]&&&&&&for&i&in&range(m):&&&&&&&&&&sum=0&&&&&&&&&&for&j&in&range(k):&&&&&&&&&&&&&&sum+=A[i][j]&&&&&&&&&&R.append(sum)&&&&&&C=[]&&&&&&for&j&in&range(k):&&&&&&&&&&sum=0&&&&&&&&&&for&i&in&range(m):&&&&&&&&&&&&&&sum+=A[i][j]&&&&&&&&&&C.append(sum)&&&&&&N=0&&&&&&for&ele&in&C:&&&&&&&&&&N+=ele&&&&&&res=0&&&&&&for&i&in&range(m):&&&&&&&&&&for&j&in&range(k):&&&&&&&&&&&&&&Eij=R[i]*C[j]/N&&&&&&&&&&&&&&if&Eij!=0:&&&&&&&&&&&&&&&&&&res=res+(A[i][j]-Eij)**2/Eij&&&&&&return&res&&&&&&def&ChiMerge(log_tuple,max_interval):&&&&&&''&&&&&&''&&&&&&&&&&num_interval=len(log_tuple)&&&&&&while(num_interval&max_interval):&&&&&&&&&&&&&&&&&&&&&&&&&num_pair=num_interval-1&&&&&&&&&&chi_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)&&&&&&&&&&&for&i&in&range(num_pair-1,-1,-1):&&&&&&&&&&&&&&&if&chi_values[i]==min_chi:&&&&&&&&&&&&&&&&&&log_tuple[i]=combine(log_tuple[i],log_tuple[i+1])&&&&&&&&&&&&&&&&&&&log_tuple[i+1]='Merged'&&&&&&&&&&while('Merged'&in&log_tuple):&&&&&&&&&&&&&&&log_tuple.remove('Merged')&&&&&&&&&&num_interval=len(log_tuple)&&&&&&split_points=[record[0]&for&record&in&log_tuple]&&&&&&return(split_points)&&&&&&def&discrete(path):&&&&&&''&&&&&&Instances=read(path)&&&&&&max_interval=6&&&&&&num_log=4&&&&&&for&i&in&range(num_log):&&&&&&&&&&log_tuple=collect(Instances,i)&&&&&&&&&&&split_points=ChiMerge(log_tuple,max_interval)&&&&&&&&&&&print(split_points)&&&&&&&&&&if&__name__=='__main__':&&&&&&print('Start:&'&+&ctime())&&&&&&discrete('c:\\Python33\\iris.data')&&&&&&print('End:&'&+&ctime())&&
__author__ = &Yinlong Zhao (zhaoyl[at]sjtu[dot]edu[dot]cn)&
__date__ = &$Date:
from time import ctime
def 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,3
Return a list like [['0.2', 'Iris-setosa'], ['0.2', 'Iris-setosa'],...]'''
for r in Instances:
log.append([r[i],r[4]])
return(log)
def count(log):
'''Count the number of the same record
Return a list like [['4.3', 'Iris-setosa', 1], ['4.4', 'Iris-setosa', 3],...]'''
log_cnt=[]
log.sort(key=lambda log:log[0])
while(i&len(log)):
cnt=log.count(log[i])#count the number of the same record
record=log[i][:]
record.append(cnt) # the return value of append is None
log_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]
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]
def chi2(A):
''' Compute the Chi-Square value '''
k=len(A[0])
for i in range(m):
for j in range(k):
sum+=A[i][j]
R.append(sum)
for j in range(k):
for i in range(m):
sum+=A[i][j]
C.append(sum)
for ele in C:
for i in range(m):
for j in range(k):
Eij=R[i]*C[j]/N
if Eij!=0:
res=res+(A[i][j]-Eij)**2/Eij
return res
def ChiMerge(log_tuple,max_interval):
''' ChiMerge algorithm
'''
''' Return split points '''
num_interval=len(log_tuple)
while(num_interval&max_interval):
num_pair=num_interval-1
chi_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 one
if chi_values[i]==min_chi:
log_tuple[i]=combine(log_tuple[i],log_tuple[i+1]) # combine the two adjacent intervals
log_tuple[i+1]='Merged'
while('Merged' in log_tuple): # remove the merged record
log_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=6
for i in range(num_log):
log_tuple=collect(Instances,i) # collect data for discretization
split_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&&&&&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:92355次
积分:1265
积分:1265
排名:千里之外
转载:190篇
评论:12条
(4)(8)(5)(23)(1)(2)(13)(18)(1)(5)(6)(7)(1)(4)(2)(3)(1)(4)(1)(6)(4)(9)(7)(2)(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(5)(6)(30)(8)}

我要回帖

更多关于 城满财富 请问资金池 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信