matab實現2維數據的k-means聚類

思路

  1. 輸入數據:x,y分別對應橫縱座標
  2. 確定分類數k
  3. 給出初始的k個聚類中心
  4. 計算數據到k箇中心的聚類,分別都歸類到距離最近的中心
  5. 歸類後的k組數據取中心點作為新的聚類中心
  6. 迭代直到收斂

具體代碼

<code>clc
clear all
close all
format bank;
x=[1 1.5 3 5 3.5 4.5 3.5];
y=[1 2 4 7 5 5 4.5];
k=2;
m1_newx=1;
m1_newy=1;
m2_newx=5;
m2_newy=7;
temp=0;
k1x=[];
k1y=[];
k2x=[];
k2y=[];
while(temp==0)
cx=[m1_newx m2_newx];
m1_oldx=cx(1);%m1_oldx=m1_newx
m2_oldx=cx(2);%m2_oldx=m2_newx
cy=[m1_newy m2_newy];
m1_oldy=cy(1);%m1_oldy=m1_newy
m2_oldy=cy(2);%m2_oldy=m2_newy
for i=1:length(x)
xx1=(x(i)-m1_oldx)^2;
yy1=(y(i)-m1_oldy)^2;
g=xx1+yy1;
g1=sqrt(g);
xx2=(x(i)-m2_oldx)^2;
yy2=(y(i)-m2_oldy)^2;
g=xx2+yy2;
g2=sqrt(g);
if(g1>g2)
k2x=[k2x x(i)];
k2y=[k2y y(i)];
else
k1x=[k1x x(i)];
k1y=[k1y y(i)];
end
end
m1_newx=mean(k1x);
m2_newx =mean(k2x);
m1_newy=mean(k1y);
m2_newy =mean(k2y);
if(m1_newx ~=m1_oldx && m2_newx ~=m2_oldx && m1_newy ~=m1_oldy && m2_newy ~=m2_oldy)
k1x=[];
k2x=[];
k2y=[];
k1y=[];
else
temp=1;
end
end
for i=1:length(k1x)
t=0:0.01:2*pi;
x=k1x(i)+0.1*cos(t);
y=k1y(i)+0.1*sin(t);
fill(x,y,'r');
hold on;
axis square;
grid on;
end
hold on;
for i=1:length(k2x)
t=0:0.01:2*pi;
x=k2x(i)+0.1*cos(t);
y=k2y(i)+0.1*sin(t);
fill(x,y,'g');
axis square;
hold on;
grid on;
end/<code>

結果展示


matab實現2維數據的k-means聚類


分享到:


相關文章: