matlab实现Kmeans聚类算法 1Word文件下载.docx
《matlab实现Kmeans聚类算法 1Word文件下载.docx》由会员分享,可在线阅读,更多相关《matlab实现Kmeans聚类算法 1Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
如上图的红色点所示,是本文随机产生的初始点。
注意观察那两个离得比较近的类,它们几乎要混合在一起,看看算法是如何将它们分开的。
类的初始中心点是随机产生的。
算法会不断迭代来矫正这些中心点,并最终得到比较靠5个中心点的距离,选出一个距离最小的(例如该点与第2个中心点的距离是5个距离中最小的),那么该点就归属于该类.上图是点的归类结果示意图.
经过步骤3后,每一个中心center(i)点都有它的”管辖范围”,由于这个中心点不一定是这个管辖范围的真正中心点,所以要重新计算中心点,计算的方法有很多种,最简单的一种是,直接计算该管辖范围内所有点的均值,做为心的中心点new_center(i).
如果重新计算的中心点new_center(i)与原来的中心点center(i)的距离大于一定的阈值(该阈值可以设定),那么认为算法尚未收敛,使用new_center(i)代替center(i)(如图,中心点从红色点转移到绿色点),转步骤3;
否则,认为算法已经收敛,则new_center(i)就是最终的中心点。
现在,所有的中心都不再移动,即算法已经收敛。
当然,也许这些中心点还没有达。
可以从K=1开始,并且k值不断的增加,通常,随着k的增加,类中的方差会急剧的下降,当k达到一定大的时候,方差的下降会明显减慢(至于慢道何种程度,可以设阈值),此时,就选取到了最佳的k值。
如果初始值没设置好,肯定也不能获得理想的聚类效果。
针对这种情况,这里提供两种方法:
随机的选取多组中心点,在每一组中心点上,都把kmeans算法运行一次。
最后,在选取类间方差最小的一组。
通过设定的选初始值方法(这里提供一种,当然自己也可以去构想其他的方法)
1.在数据集上随机选择一个点,做为第一个中心点;
在数据集上,选取离第一个中心点最远的一个点做为第二个中心点。
3:
在数据集上,选取离第一个和第二个中心最远的点,做为第三个中心。
4:
依此计算后续的中心点
2.数据来源描述
本次数据挖掘实验的数据源来自加州大学计算机与信息院,是用于合成控制图时间序列聚类分析的一组数据。
数据集中一共包含600组数据,每一组数据都有60个分量,也就是数据是60维的。
数据一共可以分成6个聚类,分别是:
3.数据预处理
由于本数据集的数据维数较多,所以本实验采用了结构体来存储60维的数据,并使用指针来进行对数据的操作,以提高速度。
在数据预处理过程中,首先将数据从data文件中读出,后依次存入结构体数组dataset[600]中。
4.k-means聚类算法
k-means算法接受参数k;
然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:
同一聚类中的对象相似度较高;
而不同聚类中的对象相似度较小。
聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。
K-means算法的基本思想是:
以空间中k个点为中心进行聚类,对最靠近他们的对象归类。
通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
(1)算法思路:
首先从n个数据对象任意选择k个对象作为初始聚类中心;
而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;
然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);
不断重复这一过程直到标准测度函数开始收敛为止。
一般都采用均方差作为标准测度函数.k个聚类具有以下特点:
各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
该算法的最大优势在于简洁和快速。
算法的关键在于初始中心的选择和距离公式。
(2)算法步骤:
step.1---初始化距离K个聚类的质心(随机产生)
step.2---计算所有数据样本与每个质心的欧氏距离,将数据样本加入与其欧氏距离最短的那个质心的簇中(记录其数据样本的编号)
step.3---计算现在每个簇的质心,进行更新,判断新质心是否与原质心相等,若相等,则迭代结束,若不相等,回到step2继续迭代。
Matlab代码:
算法流程图
三、实验源代码
1、主程序
clearall
clc
[FHFW]=textread('
C:
\Users\lenvo\Desktop\Ð
Â
½
¨
Î
Ä
¼
þ
Ð
\FEMALE.txt'
'
%f%f'
);
[MHMW]=textread('
\MALE.txt'
Data(1:
50,1)=FH;
Data(51:
100,1)=MH;
50,2)=FW;
100,2)=MW;
C=input('
Ê
ä
È
ë
C£
º
'
)
[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C)
plot(Data(:
1),Data(:
2),'
o'
holdon;
maxU=max(U);
index1=find(U(1,:
)==maxU);
index2=find(U(2,:
line(Data(index1,1),Data(index1,2),'
marker'
*'
color'
g'
line(Data(index2,1),Data(index2,2),'
r'
plot([P([12],1)],[P([12],2)],'
k'
)
holdoff;
2、子程序
function[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
ifnargin<
5
epsm=1.0e-6;
end
4
M=2;
3
plotflag=0;
[N,S]=size(Data);
m=2/(M-1);
iter=0;
Dist(C,N)=0;
U(C,N)=0;
P(C,S)=0;
U0=rand(C,N);
U0=U0./(ones(C,1)*sum(U0));
whiletrue
iter=iter+1;
Um=U0.^M;
P=Um*Data./(ones(S,1)*sum(Um'
))'
;
fori=1:
C
forj=1:
N
Dist(i,j)=fuzzydist(P(i,:
),Data(j,:
));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));
ifnargout>
4|plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
ifnorm(U-U0,Inf)<
epsm
break
U0=U;
ifnargout>
3
res=maxrowf(U);
forc=1:
v=find(res==c);
Cluster_Res(c,1:
length(v))=v;
ifplotflag
fcmplot(Data,U,P,Obj_Fcn);
function[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm)
[N,S]=size(Data);
m=2/(M-1);
iter=0;
C=size(P0,1);
U(C,N)=0;
P(C,S)=0;
Dist(i,j)=fuzzydist(P0(i,:
Um=U.^M;
ifnorm(P-P0,Inf)<
P0=P;
functionf=addr(a,strsort)
ifnargin==1
strsort='
ascend'
sa=sort(a);
ca=a;
la=length(a);
f(la)=0;
fori=1:
la
f(i)=find(ca==sa(i),1);
ca(f(i))=NaN;
ifstrcmp(strsort,'
descend'
f=fliplr(f);
functionellipse(a,b,center,style,c_3d)
style='
b'
3|isempty(center)
center=[0,0];
t=1:
360;
x=a/2*cosd(t)+center
(1);
y=b/2*sind(t)+center
(2);
ifnargin>
plot3(x,y,ones(1,360)*c_3d,style)
else
plot(x,y,style)
functionfcmplot(Data,U,P,Obj_Fcn)
[C,S]=size(P);
str='
po*x+d^v>
<
.h'
figure
(1),plot(Obj_Fcn)
title('
¿
±
ê
¯
ý
Ö
µ
»
Ç
ú
Ï
ß
fontsize'
8)
ifS==2
figure
(2),plot(P(:
1),P(:
rs'
),holdon
v=Data(find(res==i),:
plot(v(:
1),v(:
2),str(rem(i,12)+1))
ellipse(max(v(:
1))-min(v(:
1)),...
max(v(:
2))-min(v(:
2)),...
[max(v(:
1))+min(v(:
2))+min(v(:
2))]/2,'
r:
gridon,title('
2D¾
Û
À
à
á
¹
û
Í
8),holdoff
ifS>
2
figure
(2),plot3(P(:
2),P(:
3),'
plot3(v(:
2),v(:
3),str(rem(i,12)+1))
2))]/2,...
'
(max(v(:
3))+min(v(:
3)))/2)
3D¾
functionD=fuzzydist(A,B)
D=norm(A-B);
functionmr=maxrowf(U,c)
2
c=1;
N=size(U,2);
mr(1,N)=0;
forj=1:
aj=addr(U(:
j),'
mr(j)=aj(c);
四、实验结果
1、FEMALE和MALE
(1)C=2,Z1
(1)=(173,53)T,Z2
(1)=(168,57)T。
聚类中心为(163.322052.5232),(175.256567.6907)
迭代次数为28
(2)C=2,Z1
(1)=(173,53)T,Z2
(1)=(160,58)T。
(3)C=3,Z1
(1)=(173,53)T,Z2
(1)=(168,57)TZ3
(1)=(160,58)T
聚类中心为(168.413957.3300)(176.335169.4859)
(160.176749.1940)
迭代次数为41
(4)C=3,Z1
(1)=(173,53)T,Z2
(1)=(168,57)TZ3
(1)=(161,45)T
迭代次数为41
2、test2
聚类中心为(166.844354.9270),(176.677270.7966)
迭代次数为53
聚类中心为(178.869980.0977)(163.946951.6216)
(174.814464.8963)
迭代次数为56
(174.814464.8963)
迭代次数为56
结论
(一):
初始均值设置的不同会影响迭代的次数以及各次迭代所产生的聚类中心,但它不会影响最后的分类结果。
结论
(二):
数据的输入顺序不同,同样影响迭代次数,而对聚类结果没有太大的影响。
5.分析方法
点估计、区间估计、回归分析、假设检验、聚类分析、判别分析、因素分析和主成分分析等等。
6.获取的模型的描述
首先,准备数据,对数据进行预处理,选用合适的数据结构存储数据元组,然后设定参数,数据的总量N,维度D,聚类类别数量K,然后随机产生K个D维的数据作为质心,计算每个数据与质心距离,并加入所属的簇中,经多次迭代后,质心不变后,得到分类后的结果。
由于初始化质心是随机的,所以每次运行聚类分析花费的时间略有不同,本实验采用结构体来存储数据,聚类的操作多应用指针来实现,在选择所属的簇,并加入簇中,加入的是数据的索引值,提高了效率,在一步中如果使用指针指向数据可以进一步提高效率。
总体上说算法的运行时间还是比较令人满意。