内容发布更新时间 : 2025/2/16 0:01:28星期一 下面是文章的全部内容请认真阅读。
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