matlab调用kmeans_K_Means算法的MATLAB实现
% K-Means聚類算法
clc
clear all
close all
m=200;% 產生m個樣本點
k=3;% 選擇K個中心點
eps=1e-7; % 迭代結束的閾值
X=100*rand(1,m);% 樣本點X坐標
Y=100*rand(1,m);% 樣本點Y坐標
% 顯示聚類前二維點
figure,subplot(1,2,1),plot(X,Y,'ro'),title('聚類前二維點');xlabel('X軸');ylabel('Y軸');
% type_num存放k類樣本點
for i=1:k
eval(['type_',num2str(i),'=[];']);
end
% 顏色列表,由于顏色只有六種,k最好不大于6
color_list={'m','g','b','y','r','k'};
% 存放初始中心點
cp=zeros(k,2);
for i=1:k
cp(i,:)=[X(i) Y(i)];
end
% 存放第i個點到第j個點的距離
len=zeros(m,3);
% 計算樣本點到k個中心點的距離
% 若某個樣本i到某個中心點j的距離最小,則把樣本點歸到j類
% m類分完后,計算每一類均值向量作為新的聚類中心
% 若新的聚類中心與原來的聚類中心之差小于設定的閾值
% 結束迭代
times=0;% 記錄迭代次數
error=zeros(1,k);
while(1)
for i=1:m
for j=1:k
len(i,j)=sqrt((cp(j,1)-X(i))^2+(cp(j,2)-Y(i))^2);
end
% 離第num類中心點距離最小,就把它放到type_num中
flag=find(len(i,:)==min(len(i,:)));
eval(['type_',num2str(flag),'(size((type_',num2str(flag),'),1)+1,:)=[X(i) Y(i)];']);
end
times=times+1;% 迭代次數加1
% 存放新的中心點
for i=1:k
cp(i+times*k,:)=eval(['[mean(type_',num2str(i),'(:,1)) mean(type_',num2str(i),'(:,2))]']);
tmp=cp(i+(times-1)*k,:)-cp(i+times*k,:);
error(i)=sum(tmp.^2);
end
if max(error)
break
end
end
% 顯示聚類后結果
cpx=cp(1+(times-1)*k:k+(times-1)*k,1);
cpy=cp(1+(times-1)*k:k+(times-1)*k,2);
subplot(1,2,2)
for i=1:k
eval(['plot(type_',num2str(i),'(:,1),','type_',num2str(i),'(:,2),[color_list{ceil(6*rand)},''o''])']);
text(cpx(i),cpy(i),['第',num2str(i),'類中心點'])
hold on;
end
plot(cpx,cpy,'r*');
title(['聚類后二維點(迭代',num2str(times),'次)']);xlabel('X軸');ylabel('Y軸');
總結
以上是生活随笔為你收集整理的matlab调用kmeans_K_Means算法的MATLAB实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心理正常与异常的区分_心理正常与心理异常
- 下一篇: 二层交换配置完ping失败_设置完端口聚