kmeans演算法及其實現

2021-07-10 10:08:17 字數 3186 閱讀 7087

k

均值演算法能夠使聚類域中所有樣品到聚類中心距離平方和最小。其原理為:先取

k個初始聚類中心,計算每個樣品到這

k個中心的距離,找出最小距離,把樣品歸入最近的聚類中心,修改中心點的值為本類所有樣品的均值,再計算各個樣品到新的聚類中心的距離,重新歸類,修改新的中心點,直到新的聚類中心和上一次聚類中心差距很小時結束。此演算法結果受到聚類中心的個數和聚類中心初次選擇影響,也受到樣品的幾個性質及排列次序的影響。如果樣品的幾何性質表明它們能形成幾塊孤立的區域,則演算法一般可以收斂。

①產生二維高斯資料,設定聚類中心數n

②隨機取n個點作為聚類中心。

③計算其餘樣品到這n個聚類中心的距離,將他們歸到最近的類,到所有的樣品都歸完類。

④計算各個類樣品的平均值作為該類新的聚類中心,再計算所有樣品到新的聚類中心的距離,把他們歸到最近的類,如此反覆,直到聚類中心不再變化為止。

1.3kmeans

演算法程式設計實現

clear all;close all;clc;

% 第一組資料

mu1=[0 0 ]; %均值

s1=[.1 0 ;0 .1]; %協方差

data1=mvnrnd(mu1,s1,100); %產生高斯分布資料

%第二組資料

mu2=[1.25 1.25 ];

s2=[.1 0 ;0 .1];

data2=mvnrnd(mu2,s2,100);

% 第三組資料

mu3=[-1.25 1.25 ];

s3=[.1 0 ;0 .1];

data3=mvnrnd(mu3,s3,100);

% 顯示資料

plot(data1(:,1),data1(:,2),'b+');

hold on;

plot(data2(:,1),data2(:,2),'r+');

plot(data3(:,1),data3(:,2),'g+');

grid on;

% 三類資料合成乙個不帶標號的資料類

data=[data1;data2;data3];

n=3;%設定聚類數目

[m,n]=size(data);

pattern=zeros(m,n+1);

center=zeros(n,n);%初始化聚類中心

pattern(:,1:n)=data(:,:);

for x=1:n

center(x,:)=data( randi(300,1),:);%第一次隨機產生聚類中心

endwhile 1

distence=zeros(1,n);

num=zeros(1,n);

new_center=zeros(n,n);

for x=1:m

for y=1:n

distence(y)=norm(data(x,:)-center(y,:));%計算到每個類的距離

end[~, temp]=min(distence);%求最小的距離

pattern(x,n+1)=temp;

endk=0;

for y=1:n

for x=1:m

if pattern(x,n+1)==y

new_center(y,:)=new_center(y,:)+pattern(x,1:n);

num(y)=num(y)+1;

endend

new_center(y,:)=new_center(y,:)/num(y);

if norm(new_center(y,:)-center(y,:))<0.1

k=k+1;

endendif k==n

break;

else

center=new_center;

endend

[m, n]=size(pattern);

%最後顯示聚類後的資料

高斯數對

可以看到聚類數目

n對聚類有一定影響,同時在

n相同的情況下每次的聚類結果也不完全一樣,說明初始的聚類中心對聚類結果也有一定影響。

kmeans演算法思想及其python實現

第十章 利用k 均值聚類演算法對未標註的資料進行分組 聚類演算法可以看做是一種無監督的分類方法,之所以這麼說的原因是它和分類方法的結果相同,區別它的類別沒有預先的定義。簇識別是聚類演算法中經常使用的乙個概念,使用這個概念是為了對聚類的結果進行定義。聚類演算法幾乎可以用於所有的物件,並且簇內的物件越相...

常用排序演算法及其實現

1.插入排序 遍歷陣列 n 將每個元素插入到前面子串行的合適位置 插入時採取前面的部分元素後移,再將本元素填在適當位置的方法 模擬 12 30 9 100 1 3 10 12 30 9 100 1 3 10 9 12 30 100 1 3 10 9 12 30 100 1 3 10 1 9 12 3...

常用排序演算法及其實現

1.插入排序 遍歷陣列 n 將每個元素插入到前面子串行的合適位置 插入時採取前面的部分元素後移,再將本元素填在適當位置的方法 模擬 12 30 9 100 1 3 10 12 30 9 100 1 3 10 9 12 30 100 1 3 10 9 12 30 100 1 3 10 1 9 12 3...