K means聚類演算法及其MATLAB實現

2021-07-29 19:15:43 字數 3910 閱讀 9101

參考:

k-means屬於無監督學習方法

k表示類別數,means表示均值,k一般由人工來指定,或通過層次聚類(hierarchical clustering)的方法獲得資料的類別數量作為選擇k值的參考

選擇較大的k可以降低資料的誤差,但會增加過擬合的風險。

k-mean演算法如下:

(1)隨機選取k個初始質心

(2)分別計算所有樣本到這k個質心的距離

(3)如果樣本離質心si最近,那麼這個樣本屬於si點群;如果到多個質心的距離相等,則可劃分到任意組中

(4)按距離對所有樣本分完組之後,計算每個組的均值(最簡單的方法就是求樣本每個維度的平均值),作為新的質心

(5)重複(2)(3)(4)直到新的質心和原質心相等,演算法結束

k-mean演算法的一些特點、與em估計的關係:

(1)定義畸變函式j=∑(所有點到質心距離),j是非凸函式,所以最後得到的結果並不是全域性最小值,也就是說k-means演算法對質心的初始位置選取比較敏感。可以選取不同的處置跑多遍k-means,然後選取最小的j對應的μ和c

(2)通過不斷交替更新【質心μ】和【每個樣本類別c】,有種座標上公升(coordinate ascent的思想)

(3)k-means演算法也有種e-m估計的思想,因為e-m的e步是估計隱變數,對應k-means的第一步估計質心,然後確定類別變數(隱變數);m步是通過調整其他引數,即重新確定質心μ,來使得j最小化

距離的度量:

常用的距離度量方法包括:歐幾里得距離和余弦相似度。兩者都是評定個體間差異的大小的。歐幾里得距離度量會受指標不同單位刻度的影響,所以一般需要先進行

標準化(歸一化)

,同時距離越大,個體間差異越大;空間向量余弦夾角的相似度度量不會受指標刻度的影響,余弦值落於區間[-1,1],值越大,差異越小。但是針對具體應用,什麼情況下使用歐氏距離,什麼情況下使用余弦相似度?

從幾何意義上來說,n維向量空間的一條線段作為底邊和原點組成的三角形,其頂角大小是不確定的。也就是說對於兩條空間向量,即使兩點距離一定,他們的夾角余弦值也可以隨意變化。感性的認識,當兩使用者評分趨勢一致時,但是評分值差距很大,余弦相似度傾向給出更優解。舉個極端的例子,兩使用者只對兩件商品評分,向量分別為(3,3)和(5,5),這兩位使用者的認知其實是一樣的,但是歐式距離給出的解顯然沒有余弦值合理。

k-mean演算法實現過程如下:

(1)先產生三組不同的高斯分布資料,做為原始資料,如下圖:

(2)當聚類中心數n取不同的值,聚類結果不同,如下:

n=2時

n=3時

n=4時

n=5時

另外:即使n相同的情況下,每次聚類的結果也會不同,因為初始質點的選取是隨機的

matlab實現如下:

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);

%最後顯示聚類後的資料

figure;

hold on;

for i=1:m

if pattern(i,n)==1

plot(pattern(i,1),pattern(i,2),'r*');

plot(center(1,1),center(1,2),'ko');

elseif pattern(i,n)==2

plot(pattern(i,1),pattern(i,2),'g*');

plot(center(2,1),center(2,2),'ko');

elseif pattern(i,n)==3

plot(pattern(i,1),pattern(i,2),'b*');

plot(center(3,1),center(3,2),'ko');

elseif pattern(i,n)==4

plot(pattern(i,1),pattern(i,2),'y*');

plot(center(4,1),center(4,2),'ko');

else

plot(pattern(i,1),pattern(i,2),'m*');

plot(center(4,1),center(4,2),'ko');

endendgrid on;

常用聚類演算法K means及其改進演算法

聚類演算法是將大量資料以相似度為基礎形成若干類,使類內之間的資料最為相似,類間的資料相似度差別盡可能的大,屬於無監督學習。k means聚類演算法以k為引數,把n個物件分為k個簇,以使簇內的具有較高的相似度,且簇間相似度低。e的計算為 輸入 簇的數目k和包含n個物件的資料庫 過程 任選k個物件作為初...

K Means聚類演算法

k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...

聚類演算法 K means

演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...