KMeans聚类算法模式识别Word文档格式.docx

上传人:b****6 文档编号:21623617 上传时间:2023-01-31 格式:DOCX 页数:9 大小:414.49KB
下载 相关 举报
KMeans聚类算法模式识别Word文档格式.docx_第1页
第1页 / 共9页
KMeans聚类算法模式识别Word文档格式.docx_第2页
第2页 / 共9页
KMeans聚类算法模式识别Word文档格式.docx_第3页
第3页 / 共9页
KMeans聚类算法模式识别Word文档格式.docx_第4页
第4页 / 共9页
KMeans聚类算法模式识别Word文档格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

KMeans聚类算法模式识别Word文档格式.docx

《KMeans聚类算法模式识别Word文档格式.docx》由会员分享,可在线阅读,更多相关《KMeans聚类算法模式识别Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。

KMeans聚类算法模式识别Word文档格式.docx

  

(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类)结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1