机器学习.docx
- 文档编号:7959073
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:178.43KB
机器学习.docx
《机器学习.docx》由会员分享,可在线阅读,更多相关《机器学习.docx(14页珍藏版)》请在冰豆网上搜索。
机器学习
K-means算法的实现及其应用
一、K-means算法介绍
K-means算法接受输入量k,然后将n个数据对象划分为k个聚类以便使得所获得的聚类满足:
同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
简单的聚类方法通过已经存在的聚类通过贪心式交互得到一个较好的全局最优解,如自下而上聚类方法(每个数据点都是一个独立的聚类,然后这些聚类通过递归方法逐步合并成适当的聚类),然而这些方法与优化目标之间的关系并不明确,K-means方法则是一个确定的优化目标构造出的算法。
二、算法实现
假设已知数据集
,明确的知道要将其分为
类,假设每个类有一个中心,记为
,设
为标号集,
即若
的元素
现在假设元素都靠近其所在的类的类中心,则有以下目标函数:
令
,即
,若
取得极小值则有:
,
从而求得
,其中
为
中元素的个数,即聚类中心为聚类中元素的重心。
由此可以构造K-means算法如下:
Step1:
初始化,聚类中心
,标号集
;
Step2:
分类:
Step3:
更新计算聚类中心:
Step4:
迭代Step2-Step3,直至收敛。
三、实验及其结果分析
为了更好的分析和研究K-means算法的实现过程,我们进行如下实验(程序见附录1和附录2)。
实验1:
首先利用matlab程序随机生成300个位于
之间的二维数对,再利用K-means算法将上述数对分为两类(其程序见附录1),并用红色和蓝色的点区分分成的两类,用
表示聚类之后的中心点,结果如图1所示:
(b)
(a)
图1
结果及其分析:
从图1的(a)中我们可以看出利用K-means将上述数对分成了两类并标出其聚类后的中心点;同时从(b)图我们可以知道离群点对聚类中心的位置有明显的影响。
实验2:
利用matlab随机生成600个二维数对,并使得其中的300个落在以(0,0)为圆心的单位圆中,另外300个落入以(2,2)为圆心的单位圆中,利用K-means算法将这600个二维数对分为两类,结果如图2(a)所示;同时在保证相同的实验数据的基础上,对其增加了30个干扰点后,再利用K-means算法对其进行分类,同样分成两类,结果如图2(b)所示:
(b)
(a)
图2
结果及其分析:
对比上述两图,我们可以看出K-means算法对增加了30个干扰点之后的数据进行分类,其分类效果显然不够好,由此我们可以得出如下结论:
离群点对聚类中心的位置有明显的影响。
实验3:
利用matlab随机生成600个二维数对,并使得其中的300个落在以(0,0)为圆心的单位圆中,另外300个落入以(0,0)为圆心,长半径为3,短半径为2的圆盘中,利用K-means算法将其分为2类,结果如图3所示:
图3
结果及其分析:
从图3可以清晰的看出,K-means算法对于此类数组的分类效果同样也是不好的。
四、K-means算法修正
修正一:
从上述三个实验的结果可以看出,在实验2中增加了30个干扰点(离群点)后,K-means算法对其分类失效,这是因为在K-means算法中采用了2-范数来计算距离,这样会导致计算出的重心与实际重心存在较大的误差。
为了减小误差,使得对数据尽可能好的分类,可以采用1-范数计算距离来代替2-笵数计算距离,或是采用中值代替均值计算新的聚类中心,即
为了研究修正后的K-means算法,我们进行如下实验(程序见附录3):
实验4:
利用matlab随机生成600个二维数对,并使得其中的300个落在以(0,0)为圆心的单位圆中,另外300个落入以(2,2)为圆心的单位圆中,同时在此数据基础上,对其增加了30个干扰点(其数据同实验2的数据)。
对于上述数据,分别为以1-范数计算距离的修正和采用中值计算聚类中心的修正来对其分类,结果如图4所示:
图4
结果及其分析:
由于采用以1-范数计算距离的修正对分类效果并没有起到明显的改善,故在此没有展示其实验结果;而对于采用了中值计算聚类中心的修正,我们可以对比实验2中的图2(b)和图4,显然我们可以看出图4相比较图2(b),其分类效果得到了改善。
实验5:
利用matlab随机生成600个二维数对,并使得其中的300个落在以(0,0)为圆心的单位圆中,另外300个落入以(0,0)为圆心,长半径为3,短半径为2的圆盘中(该数据同实验3)。
鉴于在实验4中,采用以1-范数计算距离的修正对分类效果并没有起到明显的改善,所以在本次实验中我们采用中值计算聚类中心的修正来对其分类,结果如图5所示:
图5
结果及其分析:
从图5中我们可以看出而实验5中结果产生的原因是由于没有考虑数据点自身的结构特征与其他数据点之间关系所引起的,并且K-means算法只考虑类内间距最小性并没有考虑类间间距的最大性,即只考虑了类内数据的相似性的最大性并没有考虑类间数据的差异性的最大性,所以单纯的改变聚类中心的选取方法,而没有对相关性(距离)进行本质的重新的定义,并不能对实验3的实验结果很好的改进。
修正二:
在计算过程中可能会出现某个
,
,从而使得计算聚类中心的步骤失效,所以要在Step3步骤前进行检测,并将当前分类中距离聚类中心最远的点作为新的聚类中心。
即:
Step3:
检查标号集是否为空:
重新计算聚类中心:
五、K-means算法的应用
K-means算法作为一种较为简单的聚类算法,可以应用于许多问题。
鉴于图像分割也可以理解为一种聚类,因此我们可以利用K-means算法对图像进行分割。
我们将图像的灰度值作为特征向量,然后对原图像采用K-means算法进行分割,得到的效果如图6所示(程序见附录4):
其中(a)为原图像,(b)和(c)分别为k=3和k=4时用K-means算法进行图像分割后的图像,(d)为采用中值修正后的K-means算法进行分割后的图像。
(a)
(b)
(d)
(c)
图6
结果及其分析:
从图6我们可以看出利用参数不同的K-means算法和中值修正后的K-means算法进行分割后的图像的效果是不同的。
从图6显然我们可以看出同样利用K-means算法进行分割,当k=3时得到的分割效果(如图6(b))不如当k=4时得到的分割效果(如图6(c));同样的,虽然当k=4时,利用K-means算法得到的结果与原图像较为接近,但与利用中值修正后的K-means算法进行分割后的图像的效果(如图6(d))相比,还是后者的效果更好,更接近原图像。
综上所述,虽然K-means算法可以解决一些基本的聚类问题,但由于其对某些数据进行分类时,效果不是很好(如实验2和3),因此我们需要对其改进,故引入了中值修正后的K-means算法,同时通过实验4、5和6的结果,我们也可以看出中值修正后的K-means算法确实优于原来的K-means算法,更适合解决聚类问题。
六、附录(程序)
附录1
function[idx,C,D,sumD]=kmeans_mean(X,k)
%kmeans2normK-meansclustering.
%X:
n*p的数据矩阵
%k:
将X划分为几类
%startM:
k*p的矩阵,初始类中心
%idx:
n*1的向量,存储每个点的聚类编号
%C:
k*p的矩阵,存储k个聚类的中心位置
%sumD:
1*k的和向量,类间所有点与该类中心的距离之和
%D:
n*k的矩阵,每一点与所有中心的距离
%sumK:
1*k的和向量,记录第k个类中点的个数
[n,p]=size(X);
idx=zeros(n,1);
C=zeros(k,p);
startM=zeros(k,p);
D=zeros(n,k);
%-----------随机生成初始聚类中心
fori=1:
k
bi=ceil(i*n/k*rand);
startM(i,:
)=X(bi,:
);
end
whilesum(abs(startM-C))>0
C=startM;startM(:
)=0;
sumD=zeros(1,k);
sumK=zeros(1,k);%记录第k个类中点的个数
%count=zeros(1,k);%计数器
%sortC=zeros(k,n);
fori=1:
n
%------计算每一点与所有中心的距离------
forj=1:
k
D(i,j)=(X(i,:
)-C(j,:
))*(X(i,:
)-C(j,:
))';
%D(i,j)=sum(abs(X(i,:
)-C(j,:
)));
end
%-----------标号------
mini=inf;
forj=1:
k
ifD(i,j) mini=D(i,j); idx(i)=j; end end sumD(idx(i))=sumD(idx(i))+D(i,idx(i)); sumK(idx(i))=sumK(idx(i))+1; end %---------计算新的聚类中心--------- %=======求解质心======= fori=1: n startM(idx(i),: )=startM(idx(i),: )+X(i,: )/sumK(idx(i));%求解质心 end end 附录2 clearall %------随机生成[-1,1]^2的数 %X=[randn(100,2)+ones(100,2);... %randn(100,2)-ones(100,2)]; %%%------随机生成圆盘内的数 %deg1=(2*rand(300,1)-1)*2*pi; %deg2=(2*rand(300,1)-1)*2*pi; %r1=rand(300,1); %r2=rand(300,1); %X1=[r1.*cos(deg1)r1.*sin(deg1)]; %X2=[(r2+2).*cos(deg2)(r2+2).*sin(deg2)]; %X=zeros(600,2); %fori=1: 300 %X(2*i-1,: )=X1(i,: ); %X(2*i,: )=X2(i,: ); %end %%------随机生成两个圆--------- deg1=(2*rand(300,1)-1)*2*pi; r1=rand(300,1); deg2=(2*rand(30,1)-1)*2*pi; r2=0.1*rand(30,1); deg3=(2*rand(300,1)-1)*2*pi; r3=rand(300,1); X1=[r1.*cos(deg1)r1.*sin(deg1)]; X2=[r2.*cos(deg2)+5r2.*sin(deg2)+5]; X3=[r3.*cos(deg3)+1r3.*sin(deg3)+1]; X=[X1;X3]; %X=[X1;X2;X3]; %[idx,ctrs,D,sumD]=kmeans_mean(X,2); [idx,ctrs,D,sumD]=kmeans_medium(X,2); figure plot(X(idx==1,1),X(idx==1,2),'r.','MarkerSize',12) holdon plot(X(idx==2,1),X(idx==2,2),'b.','MarkerSize',12) plot(ctrs(: 1),ctrs(: 2),'kx',... 'MarkerSize',12,'LineWidth',2) plot(ctrs(: 1),ctrs(: 2),'ko',... 'MarkerSize',12,'LineWidth',2) legend('Cluster1','Cluster2','Centroids',... 'Location','NW') 附录3 function[idx,C,D,sumD]=kmeans_medium(X,k) %kmeans2normK-meansclustering. %X: n*p的数据矩阵 %k: 将X划分为几类 %startM: k*p的矩阵,初始类中心 %idx: n*1的向量,存储每个点的聚类编号 %C: k*p的矩阵,存储k个聚类的中心位置 %sumD: 1*k的和向量,类间所有点与该类中心的距离之和 %D: n*k的矩阵,每一点与所有中心的距离 %sumK: 1*k的和向量,记录第k个类点的个数 [n,p]=size(X); idx=zeros(n,1); C=zeros(k,p); startM=zeros(k,p); D=zeros(n,k); %-----------随机生成初始聚类中心 fori=1: k bi=ceil(i*n/k*rand); startM(i,: )=X(bi,: ); end whilesum(abs(startM-C))>0 C=startM;startM(: )=0; sumD=zeros(1,k); sumK=zeros(1,k);%记录第k个类中点的个数 %count=zeros(1,k);%计数器 %sortC=zeros(k,n); fori=1: n %------计算每一点与所有中心的距离------ forj=1: k %D(i,j)=sqrt(sum((X(i,: )-C(j,: )).^2)); D(i,j)=(X(i,: )-C(j,: ))*(X(i,: )-C(j,: ))'; %D(i,j)=sum(abs((X(i,: )-C(j,: )))); end %-----------标号------ mini=inf; forj=1: k ifD(i,j) mini=D(i,j); idx(i)=j; end end sumD(idx(i))=sumD(idx(i))+D(i,idx(i)); sumK(idx(i))=sumK(idx(i))+1; end %---------计算新的聚类中心--------- %=======质心作为聚类中心======= %fori=1: n %startM(idx(i),: )=startM(idx(i),: )+X(i,: )/sumK(idx(i));%求解质心 %end %=======中位数作为聚类中心======= fori=1: k inds=find(idx==i); tempX=X(inds,: ); %-----------若标号为空则取离所在聚类中心最远的点为新的类中心------ ifnumel(tempX)==0 dist=0; forjj=1: n ifD(jj,idx(jj))>dist dist=D(jj,idx(jj)); end end sumK(idx(jj))=sumK(idx(jj))-1; idx(jj)=i; D(jj,i)=0; sumK(i)=1; tempX=X(jj,: ); end forj=1: p tempXj=tempX(: j); tempXj=sort(tempXj); startM(i,j)=tempXj(round(sumK(i)/2)); end end end 附录4 f=imread('wawa.jpg'); figure imshow(f) img_as_col=double(f(: )); k=4; %cluster_membs=kmeans_men(img_as_col,k); cluster_membs=kmeans_medium(img_as_col,k); labelim=zeros(size(f)); fori=1: k inds=find(cluster_membs==i); meanval=mean(img_as_col(inds)); labelim(inds)=meanval; end figure imshow(uint8(labelim))
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器 学习
![提示](https://static.bdocx.com/images/bang_tan.gif)