聚類演算法 聚類演算法中的K Means實現以及驗證

2021-09-30 19:09:53 字數 2678 閱讀 2370

是一篇比較綜合來講聚類演算法的文件。

根據上述的分析來看**的實現:

%分類器,聚類演算法(k-means)

%入參:k,隨機點k的個數,k=2,表示將所有的點分成兩個簇cluster;

%入參:x,表示欲分類的記錄集(x1,x2,x3...,xj)表示j個維度或者特徵

%出參:k,表示每次分類選擇的k點,形式如下:[k01,k02,..k0k;k11,k12,...kik],k表示族數,i表示迴圈選點的次數

function k = cluseringkmeans(k,x)

%icount代表樣本數;

%jcount代表特徵數;

icount=size(x)(1);

jcount=size(x)(2);

%隨機取點

randlist = getrandom(icount,k)

k(:,:)=x(randlist,:)

lastkean=mean(mean(k));

kmeanerr = lastkean - 0;

while abs(kmeanerr)>0,

lastkean=mean(mean(k));

%求所有x的點到l點的距離,然後選擇最小的,放到c中去

for iindex = 1 : icount,

%用來記錄最小的點

minmixvalue=0;

%需要對每個點的到每個k值點的距離進行求解

for kindex = 1 : k,

%如果k(i)與當前取值點是相同的,則距離等於0,這種情況下,不需要對計算

if iindex == randlist(kindex,1),

c(iindex,1)=kindex;

break;

elseif,

tmpmix=x(iindex,:)-k(kindex,:);

mixerr=tmpmix'*tmpmix;

%如果minmixvalue=0代表還沒有賦值,直接使用當前點

if minmixvalue==0,

minmixvalue=mixerr;

endif

if mixerr<=minmixvalue,

c(iindex,1)=kindex;

endif

endif

endfor

endfor

%重新計算k點的均值

for kindex =1 :k,

k(kindex,:) = mean(x(find(c==kindex),:),1);

endfor

%如果兩點的k點已經固定,則退出迴圈

kmeanerr=mean(mean(k))-lastkean;

endwhile;

endfunction

%返回隨機數列表,列表中的隨機數不重複

%入參:itop,表示隨機數從1到itop之間;

%入參:inumbercount表示要生成多少個隨機數

function randlist = getrandom(itop,inumbercount)

randlist = zeros(inumbercount,1);

icernlen = 1 / itop;

for iindex = 1 : inumbercount,

%在itop範圍內,找乙個不重複的index

brepeat=false;

while brepeat == false,

itmpnum = floor(rand(1)/icernlen);

if itmpnum==0,

break;

endif

brepeat=true;

for rindex = 1 : size(randlist)(1),

if itmpnum == randlist(rindex,1),

brepeat = false;

break;

endif

endfor

endwhile

randlist(iindex,1)=itmpnum;

endfor

endfunction

對上述**進行驗證:

x=[0.5,0.4;0.6,0.2;1.2,1.8;1.9,2.0;2.5,2.2;2.8,2.9;2.8,3.2;3.2,4.0;0.8,1.2;1.0,1.1;0.8,1.2;1.8,2.0;1.9,2.2;2.0,2.1]

plot(x(:,1),x(:,2),'o')

hold on

k=cluseringkmeans(1,3,x)

plot(k(:,1),k(:,2),'x')

得到的結果如下圖所示:

從上圖來看,憑我們的直覺也會認為這並不是乙個小的分類。

那麼我們需要多次執行,綜合去尋找乙個比較好的結果。再多試幾次試一下:

看淡橙的點,這個結果就比較符合我們的期望了。聚類演算法的結果,目前還是需要多次執行來尋找乙個最優解。

K mean聚類演算法

k mean演算法屬於非監督類演算法,模型相對簡單。目標函式 j sum dj i 演算法 1 初始化k個點 2 樣本xi,到k個點的距離為 dk xi uk j argmin j dk xi屬於cj 3 更新引數 uk sum xi i sum i 重複2和3,終止條件j的變化很小或者uk變化很小...

聚類及K mean演算法

首先什麼是聚類,和分類有什麼區別,這裡講乙個例子,比如有一群學生考完期末考試,現在要根據他們的成績把他們劃分成幾個小組,讓老師分別進行輔導,這時候,你不知道要劃分幾個小組比較好,但你可以根據他們的成績,比較成績接近的歸到乙個小組,這個過程就是聚類,另一種情況是直接給出了90分段的乙個小組,80分段的...

基本k mean聚類的文字聚類演算法原理和例子

基於質心的劃分方法是研究最多的演算法,包括k mean聚類演算法及其各種變體,這些變體依據初始簇的選擇,物件的劃分 相識度的計算方法 簇中心的計算方法不同而不同。基於質心的劃分方法將簇中所有物件的平均值看做簇的質心,根據乙個資料物件與簇質心的距離,將該物件賦予最近的簇。在這類方法中,需要給定劃分的簇...