当前位置:
文档之家› 鸢尾花(k-means)算法实现
鸢尾花(k-means)算法实现
最终区间89和区间90的卡方检验值最小,将其合并。
种类
类别1(期望频数)
类别2(期望频数)
类别3(期望频数)
总数
区间89(6)
0(0.000001)
4(4)
2(2)
6
区间90(6.1)
0(0.000001)
4(4)
2(2)
6
总数
0
8
4
12
根据卡方公式计算:
即区间89和区间90的卡方检验值为0.00002;
c(i,1)=3;
end
end
%¾ßÌåÔËÐÐ
h1=[a c];
h2=[b c];
h3=[p,c];
h4=[q,c];
disp('sepal length:');
chime(h1);
disp('End!');
disp('sepal width:');
chime(h2);
disp('End!');
disp('petal length:');
根据要离散的属性对实例进行排序:每个实例属于一个区间;
第二步:递归合并区间。
(1)计算每一对相邻区间的卡方值
预先设定一个卡方的阈值,在阈值之下的区间都合并,阈值之上的区间保持分区间。
卡方的计算公式:
参数说明:m=2(每次比较的区间数是2个),k=类别数;
:第i区间第j类的实例的数量
:第j类的实例数量 ;
ify(i,1)>=x(j,1)&&y(i,1)<=x(j,2)
m(1,y(i,2))=m(1,y(i,2))+1;
elseify(i,1)>=x(j+1,1)&&y(i,1)<=x(j+1,2)
m(2,y(i,2))=m(2,y(i,2))+1;
end
end
fori=1:3
m(3,i)=m(1,i)+m(2,i);
N:总的实例数量 ;
: 的期望频率 ;=(Ni/N)*Cj
(2)将卡方值最小的一对区间合并。
三、
数据描述:鸢尾花共有四个属性,花萼长,花萼宽,花瓣长,花瓣宽。数据共150个样本,分为三个品种:setosa versicolor virginica(刚毛,变色,弗吉尼亚),每个品种50个样本。
以花瓣长度属性为例,区间合并过程:
lenx=lenx-1;
end
x(:,2)
最终以max_interval=6作为终止条件,将150个区间合并成6个区间:
[4.300000000000004.80000000000000]
[4.900000000000004.90000000000000]
[55.40000000000000]
[5.500000000000005.70000000000000]
tx=size(x);%x¾ØÕóµÄÐÐÁÐÖµ
lenx=tx(1,1);%lenx=size£¨x,1£©Çø¼ä¾ØÕóµÄÐÐÊý
whilelenx>6
%Íâ²ãÑ »·£¬ÓÃÓÚ½áÊøÌõ¼þÅж¨
min=9999;
forj=1:lenx-1
%ÄÚ²ãÑ »·£¬ÓÃÓÚÕÒ³ö¾ßÓÐ×îС¿¨·½ÖµµÄÏàÁÚÇø¼ä
%´¦Àí×Ö·û´®
t=size(class);
fori=1:t(1,1)
ifstrcmp(class(i,1),'Iris-setosa')==1
c(i,1)=1;
elseifstrcmp(class(i,1),'Iris-versicolor')==1
c(i,1)=2;
elseifstrcmp(class(i,1),'Iris-virginica')==1
以鸢尾花数据集为目标离散数据,对
一、
基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
算法描述:
将属性A的每个不同值作为一个区间;
对每对相邻区间进行卡方检验;
[5.800000000000007]
[7.100000000000007.90000000000000]
分裂点分别是:4.8,4.9,5.4,5.7,7
四、
ChiMerge.m
%¶ÁÈ¡Îļþ
[a,b,p,q,class]=textread('irisData.txt','%f%f%f%f%s','delimiter',',');
第一趟合并:
每个值都是一个区间,首先计算排序后的第一区间和第二区间的卡方值:
种类
类别1(期望频数)
类别2(期望频数)
类别3(期望频数)
总数
区间1
1(1)
0(0.000001)
0(0.000001)
1
区间2
3(3)
0(0.000001)
0(0.000001)
3
总数
4
0
0
4
根据卡方公式计算:
即区间1和区间2的卡方检验值为0.00004;
fori=1:2
fork=1:3
ans=ans+((m(i,k)-m(i,k+3))^2)/m(i,k+3);
end
end
%ÕÒ³ö×îС¿¨·½Öµ
ifans<=min
min=ans;
key=j;
end
end
%ÏàÁÚÇø¼äºÏ²¢²½Öè
x(key,2)=x(key+1,2);
x(key+1,:)=[];
end
fori=1:3
m(i,7)=m(i,1)+m(i,2)+m(i,3);
end
fori=1:2
fork=4:6
m(i,k)=m(i,7)*m(3,k-3)/m(3,7);%ÆÚÍûƵÂÊ
ifm(i,k)==0
m(i,k)=0.1;
end
end
end
%¼ÆËã³öÕâÁ½¸öÏàÁÚÇø¼äµÄ¿¨·½Öµ
y=sortrows(h,1);%ÅÅÐò²Ù×÷ £¨¶ÔµÚÒ»ÁнøÐÐÉýÐòÅÅÐò£©
ty=size(y);%»ñÈ¡¾ØÕóyµÄÐÐÁÐÊý
leny=ty(1,1);%ÐÐÊý leny=size(y,1)
x=[y(:,1) y(:,1)];%³õʼ»¯Çø¼ä¾ØÕó£¬Ê¹ÓÃyµÄµÚÒ»Áи³Öµ
chime(h3);
disp('End!');
disp('petal width:');
chime(h4);
disp('End!');
chime.m
%½¨Á¢chimeº¯ÊýÓÃÓÚionm=chime(h)
%½øÐÐchimergeºËÐIJÙ×÷£¬½¨Á¢Çø¼ä¾ØÕó£¬È»ºóͨ¹ý¿¨·½¼ìÑéÀëÉ¢»¯Êý¾Ý£¡
ans=0;
m=zeros(3,7);%´Ë£¨¿¨·½±í£©¾ØÕóÓÃÓÚ±£´æ¼ÆË㿨·½ÖµµÄÏà¹ØÊý¾Ý
%ºóÃæ4¸öforÑ »·ÓÃÓÚ¿¨·½±íÊý¾ÝµÄÉèÖà 3*7µÄ0¾ØÕó
fori=1:leny%yÊǾ ¹ýÅÅÐòµÄð°Î²»¨µ¥ÊôÐÔ+Àà±ðÊý¾Ý£¬xÊÇð°Î²»¨Êý¾ÝÇø¼ä
对具有最小卡方值的区间进行合并;
该过程递归地进行,直到满足预先定义的终止标准。
二
ChiMerge是监督的、自底向上的(即基于合并的)数据离散化方法。它依赖于卡方分析:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。在本程序中,满足条件具体表现为max_interval=6。
算法描述:
第一步:初始化。