K-Means聚类算法-模式识别

K-Means聚类算法-模式识别

ID:47546977

大小:481.55 KB

页数:11页

时间:2020-01-14

K-Means聚类算法-模式识别_第1页
K-Means聚类算法-模式识别_第2页
K-Means聚类算法-模式识别_第3页
K-Means聚类算法-模式识别_第4页
K-Means聚类算法-模式识别_第5页
资源描述:

《K-Means聚类算法-模式识别》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、K-Means聚类算法1.算法原理k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。 k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。这个过程不断重复,直到准则函数收敛。通常,采用平方误差准则,其定义如下: 这里E是数据库中所有对象的平方误差

2、的总和,p是空间中的点,mi是簇Ci的平均值。该目标函数使生成的簇尽可能紧凑独立,使用的距离度量是欧几里得距离,当然也可以用其他距离度量。k-means聚类算法的算法流程如下:输入:包含n个对象的数据库和簇的数目k;输出:k个簇,使平方误差准则最小。步骤:  (1)任意选择k个对象作为初始的簇中心;  (2)repeat;  (3)根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇;  (4)更新簇的平均值,即计算每个簇中对象的平均值;  (5)直到不再发生变化。2.主要代码主程序:clc;clear;closeall;%%聚类算法测试nSample=[500,500,5

3、00];%3维情况dim=3;coeff={[-20.8;-10.9;20.7;],....[10.9;-20.7;-20.8;],...[-20.7;20.8;-10.9;],};data=createSample(nSample,dim,coeff);%%得到训练数据nClass=length(nSample);tlabel=[];tdata=[];fori=1:nClasstlabel=[tlabel;i*ones(nSample(i),1)];tdata=[tdata;data{i}];end%%调用k-means聚类算法[label]=stpKMeans(tdata

4、,nClass);%%绘图result=cell(1,nClass);index=0;fori=1:nClassindex=find(label(:,1)==i);result{i}=tdata(index,:);endfigure;subplot(1,2,1);plot3(data{1}(:,1),data{1}(:,2),data{1}(:,3),'*',...data{2}(:,1),data{2}(:,2),data{2}(:,3),'o',...data{3}(:,1),data{3}(:,2),data{3}(:,3),'x');title('初始数据');sub

5、plot(1,2,2);plot3(result{1}(:,1),result{1}(:,2),result{1}(:,3),'*',...result{2}(:,1),result{2}(:,2),result{2}(:,3),'o',...result{3}(:,1),result{3}(:,2),result{3}(:,3),'x');title('K-Means聚类结果');K-Means核心算法:function[label]=stpKMeans(data,k)%%KMeans聚类算法,参考%http://www.cnblogs.com/William_Fire/a

6、rchive/2013/02/09/2909499.html%%%输入%data原始数据%k聚多少个簇%%%输出%label按照data数据的顺序,每个样本的簇号的列表[n,dim]=size(data);label=zeros(n,1);%任选k个对象作为初始的簇中心seq=stpRandN_K(n,k);nowMeans=data(seq,:);fori=1:klabel(seq(i))=i;enddist=zeros(n,k);while(true)%计算数据到每个簇的欧几里得距离fori=1:ktemp=data;forj=1:dim%先让数据减去第j个特征temp(

7、:,j)=data(:,j)-nowMeans(i,j);end%点乘后再相加球的距离的平方temp=temp.*temp;dist(:,i)=sum(temp,2);end%从k种距离中找出最小的,并计算修改次数(label跟上一次不一样)[~,label2]=min(dist,[],2);editElem=sum(label(:,1)~=label2(:,1));label=label2;%fori=1:n%%根据均值将当前的每个元素重新分簇%minDist=inf;%index=-1;%%从当前的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。