KMeans聚类算法模式识别Word文档格式.docx
《KMeans聚类算法模式识别Word文档格式.docx》由会员分享,可在线阅读,更多相关《KMeans聚类算法模式识别Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
(1)任意选择k个对象作为初始的簇中心;
(2)repeat;
(3)根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇;
(4)更新簇的平均值,即计算每个簇中对象的平均值;
(5)直到不再发生变化。
2.主要代码
主程序:
clc;
clear;
closeall;
%%聚类算法测试
nSample=[500,500,500];
%3维情况
dim=3;
coeff={
[-20.8;
-10.9;
20.7;
],....
[10.9;
-20.7;
-20.8;
],...
[-20.7;
20.8;
],};
data=createSample(nSample,dim,coeff);
%%得到训练数据
nClass=length(nSample);
tlabel=[];
tdata=[];
fori=1:
nClass
tlabel=[tlabel;
i*ones(nSample(i),1)];
tdata=[tdata;
data{i}];
end
%%调用k-means聚类算法
[label]=stpKMeans(tdata,nClass);
%%绘图
result=cell(1,nClass);
index=0;
index=find(label(:
1)==i);
result{i}=tdata(index,:
);
figure;
subplot(1,2,1);
plot3(data{1}(:
1),data{1}(:
2),data{1}(:
3),'
*'
...
data{2}(:
1),data{2}(:
2),data{2}(:
o'
data{3}(:
1),data{3}(:
2),data{3}(:
x'
title('
初始数据'
subplot(1,2,2);
plot3(result{1}(:
1),result{1}(:
2),result{1}(:
result{2}(:
1),result{2}(:
2),result{2}(:
result{3}(:
1),result{3}(:
2),result{3}(:
K-Means聚类结果'
K-Means核心算法:
function[label]=stpKMeans(data,k)
%%KMeans聚类算法,参考
%
%
%%输入
%data原始数据
%k聚多少个簇
%%输出
%label按照data数据的顺序,每个样本的簇号的列表
[n,dim]=size(data);
label=zeros(n,1);
%任选k个对象作为初始的簇中心
seq=stpRandN_K(n,k);
nowMeans=data(seq,:
k
label(seq(i))=i;
dist=zeros(n,k);
while(true)
%计算数据到每个簇的欧几里得距离
temp=data;
forj=1:
dim
%先让数据减去第j个特征
temp(:
j)=data(:
j)-nowMeans(i,j);
%点乘后再相加球的距离的平方
temp=temp.*temp;
dist(:
i)=sum(temp,2);
%从k种距离中找出最小的,并计算修改次数(label跟上一次不一样)
[~,label2]=min(dist,[],2);
editElem=sum(label(:
1)~=label2(:
1));
label=label2;
%fori=1:
n
%%根据均值将当前的每个元素重新分簇
%minDist=inf;
%index=-1;
%%从当前的k个均值中找到离元素i最近的一个,将其划分到该簇
%forj=1:
%dist=data(i,:
)-nowMeans(j,:
%dist=dot(dist,dist);
%if(dist<
minDist)
%%修改最近的距离,并记录测试的簇号
%minDist=dist;
%index=j;
%end
%%判断是该元素是否重新划分了簇
%if(index~=label(i))
%editElem=editElem+1;
%label(i)=index;
ifeditElem==0
%表示本次没有修改,那么跳出循环
break;
%重新分簇后,重新计算均值
%计算第k簇的均值
[index]=find(label(:
1)==i);
nowMeans(i,:
)=mean(data(index,:
));
从n个元素中随机抽取K个元素的代码:
function[out]=stpRandN_K(n,k)
%%从1-n中随机选中k个不同的元素
data=1:
n;
index=floor((n-i+1)*rand())+i;
%交换i和index上的数据
temp=data(index);
data(index)=data(i);
data(i)=temp;
out=data(1:
k);
图片聚类测试代码:
rgbdata=imread('
data\\g-1.jpg'
labdata=stpRgb2Lab(rgbdata);
[sm,sn,~]=size(labdata);
sN=sm*sn;
nClass=4;
labdata=reshape(labdata,sN,3);
[label]=stpKMeans(labdata,nClass);
label=reshape(label,sm,sn);
imshow(rgbdata);
holdon;
TX=1:
sn;
TY=1:
sm;
imagesc(TX,TY,label);
3.结果分析
针对给定的参数
K-Means算法三类聚类结果:
图1初始数据和K-Means聚类结果
当初始数据给为如下时:
图2初始数据和K-Means聚类结果
由此可以看到,K-Means算法会把一些偏离中心较远的点分到其它簇内。
4.用于图片的结果
以图片的在Lab颜色空间的三通道作为三个特征,每个像素为一个样本点,进行图片聚类,此时,如果类数为8,则得到:
图3a图片聚类(8类)结果
图3b图片聚类(8类)结果
聚类数量变为15时结果如下:
图4a图片聚类(15类)结果
图4b图片聚类(15类)结果
当聚类为4的时候,结果为:
图5a图片聚类(4类)结果
图5b图片聚类(4类)结果