K-means算法实现matlab 下载本文

内容发布更新时间 : 2024/6/5 15:15:26星期一 下面是文章的全部内容请认真阅读。

K_means算法的C语言算法实现

1. 算法思想

K-means算法是一种动态聚类方法,这种方法先选择若干样本作为聚类的中心,在按某种聚类准则(通常采用最小距离原则)使各种样本向各个中心积聚,从而得到初始的分类,然后,判断分类的合理性,如果不合理,就修改分类,如此反复的修改聚类的迭代运算,直到合理为止。

2. 算法步骤

(1)适当选择c个类的初始中心;

(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类,

(3)利用均值等方法更新该类的中心值;

(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

3.MATLAB程序 1)一维样本分类

%function [samp1,samp2]=kmeans(samp); % 作为调用函数时去掉注释符

samp=[11.1506 6.7222 2.3139 5.9018 11.0827 5.7459 13.2174 13.8243 4.8005 0.9370 12.3576]; %样本集 [l0 l]=size(samp);

%利用均值把样本分为两类,再将每类的均值作为聚类中心 th0=mean(samp); n1=0;n2=0; c1=0.0;

c1=double(c1); c2=c1; for i=1:l

if samp(i)

c1=c1+samp(i);n1=n1+1; else

c2=c2+samp(i);n2=n2+1; end

end

c1=c1/n1;c2=c2/n2; %初始聚类中心

t=0;

cl1=c1;cl2=c2;

c11=c1;c22=c2; %聚类中心 while t==0

samp1=zeros(1,l); samp2=samp1; n1=1;n2=1;

for i=1:l

if abs(samp(i)-c11)

cl1=cl1+samp(i);n1=n1+1; c11=cl1/n1; else

samp2(n2)=samp(i); cl2=cl2+samp(i);n2=n2+1; c22=cl2/n2; end

end

if c11==c1 && c22==c2 t=1; end

cl1=c11;cl2=c22; c1=c11;c2=c22;

end %samp1,samp2为聚类的结果。 2)二维样本分类 %文件名为Main.m clear all; close all;

Data=[0 0 1 1 1 2 2 3 6 6 7 7 7 8 8 8 8 9 9 9 0 1 0 1 2 1 2 2 6 7 6 7 8 6 7 8 9 7 8 9;]; [DataRow,DataColumn]=size(Data); Step=10;

NumKind=2;

Center=Data(:,1:NumKind);

[KindData,KindNum]=Clustering(Center,Data);

NewCenter=CaculateCenter(KindData,KindNum,DataRow); while (sum(sum(NewCenter~=Center))) & Step Center=NewCenter;

[KindData,KindNum]=Clustering(Center,Data);

NewCenter=CaculateCenter(KindData,KindNum,DataRow); Step=Step-1; end

for i=1:NumKind

KindData(:,1:KindNum(i),i) end

if DataRow~=2

disp('The result can not display on the two-dimensional figure ') else

XMin=min(Data(1,:));

YMin=min(Data(2,:));

YMax=max(Data(2,:)); XMax=max(Data(1,:));

KindDisplay(KindData,KindNum,XMin,XMax,YMin,YMax) End

文件名为CaculateCenter.m

function NewCenter=CaculateCenter(KindData,KindNum,DataRow) TotalKindNum=length(KindNum);

NewCenter=zeros(DataRow,TotalKindNum); for i=1:TotalKindNum

Temp=KindData(:,1:KindNum(i),i);

NewCenter(:,i)=sum(Temp')'/KindNum(i); End

文件名为Clustering.m

function [KindData,KindNum]=Clustering(Center,Data) [DataRow,DataColumn]=size(Data);

[CenterRow,CenterColumn]=size(Center);

KindData=zeros(DataRow,DataColumn,CenterColumn); KindNum=linspace(0,0,CenterColumn); for i=1:DataColumn

Distance=linspace(0,0,CenterColumn);

for j=1:CenterColumn for k=1:DataRow

Distance(j)=Distance(j)+(Data(k,i)-Center(k,j)).^2; end

end

Distance=sqrt(Distance);

[X,Y]=min(Distance);

KindData(:,KindNum(Y)+1,Y)=Data(:,i); KindNum(Y)=KindNum(Y)+1; End

文件名Display.m

function KindDisplay(KindData,KindNum) [DataRow,DataColumn]=size(Data); if DataRow~=2

文件名为:KindDisplay.m

function KindDisplay(KindData,KindNum,XMin,XMax,YMin,YMax) figure

TotalKindNum=length(KindNum); for i=1:TotalKindNum

Temp=KindData(:,1:KindNum(i),i); plot(Temp(1,:),Temp(2,:),'*') axis([XMin,XMax,YMin,YMax]) hold on