關於k 均值演算法

2021-07-05 18:24:17 字數 3008 閱讀 5862



同時也參考了

k-means演算法是最簡單的一種聚類演算法。演算法的目的是使各個樣本與所在類均值的誤差平方和達到最小(這也是評價k-means演算法最後聚類效果的評價標準)

k-means聚類演算法的一般步驟:

初始化。輸入基因表達矩陣作為物件集x,輸入指定聚類類數n,並在x中隨機選取n個物件作為初始聚類中心。設定迭代中止條件,比如最大迴圈次數或者聚類中心收斂誤差容限。

進行迭代。根據相似度準則將資料物件分配到最接近的聚類中心,從而形成一類。初始化隸屬度矩陣。

更新聚類中心。然後以每一類的平均向量作為新的聚類中心,重新分配資料物件。

反覆執行第二步和第三步直至滿足中止條件。

#include

#include

#include

#include

#define

k 3  

using

namespace

std;  

//存放元組的屬性資訊  

struct

tuple;  

//計算兩個元組間的歐幾裡距離  

float

getdistxy(tuple

t1, tuple

t2)     

//根據質心,決定當前元組屬於哪個簇, 其中means陣列儲存到額是每個簇的質心

//這個函式大概是讓每乙個元素與所有的質心通過距離比較,計算它應該屬於哪個簇。返回簇的索引

intclusteroftuple(tuple

means,tuple

tuple)  

}  return

label;     }

//獲得給定簇集的平方誤差  

float

getvar(vector

clusters, tuple

means)  

}  //cout<<"sum:"var;   }

//獲得當前簇的均值(質心)  

tuple

getmeans(vector

cluster)  

t.attr1 = meansx / num;  

t.attr2 = meansy / num;  

return

t;  

//cout<<"sum:"<}  

void

kmeans(vector

tuples)  

intlable=0;  

//根據預設的質心給簇賦值。遍歷,分別求出每個元素所屬於的簇,並壓入相應的簇的陣列

for(i=0;i!=tuples.size();++i)  

//輸出剛開始的簇  

for(lable=0;lable

cout

<}  

float

oldvar=-1;  

//該函式求出對於所有簇,假如說k=3,也就是3個簇平方誤差之和。

float

newvar=getvar(clusters,means);  

//第一次newval和oldval都是在while迴圈外獲得的,但是第二次就是在迴圈內部獲得的。

//從迴圈內跳出到執行while判決,則說明上次的簇的質心和簇都已經建立完畢

//如果判斷為假,說明還要繼續進入迴圈,修改簇的質心和簇。

while(abs(newvar - oldvar) >= 1) //當新舊函式值相差不到1即準則函式值不發生明顯變化時,演算法終止  

oldvar = newvar;  

newvar = getvar(clusters,means); //計算新的準則函式值  

for (i = 0; i

< k; i++) //清空每個簇  

//根據新的質心獲得新的簇  

for(i=0;i!=tuples.size();++i)  

//輸出當前的簇  

for(lable=0;lable

cout

<}  

}  }  

intmain(void)  

intcount=0;  

vector

tuples;  

tuple

tuple;  

//從檔案流中讀入資料  

while(!infile.eof())  

}  //int k;  

//cout<<"請輸入期望的簇的個數:"  

//cin>>k;  

//coutfor(vector

::size_type

ix=0;ix!=tuples.size();++ix)  

cout

<<"("

<<<","

<<<")"

<<"    ";  

cout

cout

<<"請**結果";

intb; cin>>b;

if (0 == b) 

return 0;  

}

同時也參考了
其中上文的例子生動有趣,順便也調侃了一下中國足球,當然這又是後話了。
所謂聚類問題,就是給定乙個元素集合d,其中每個元素具有n個可觀察屬性,使用某種演算法將d劃分成k個子集,要求每個子集內部的元素之間相異度盡可能低,而不同子集的元素相異度盡可能高。其中每個子集叫做乙個簇。
k均值演算法的計算過程非常直觀:

1、從d中隨機取k個元素,作為k個簇的各自的中心。

2、分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。

3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。

4、將d中全部元素按照新的中心重新聚類。

5、重複第4步,直到聚類結果不再變化。

6、將結果輸出。

希望能夠幫助讀者快速的理解k-均值演算法

K 均值演算法

動態聚類方法是模式識別中一種普遍採用的方法,它具有以下3個要點 1 選定某種距離度量作為樣本間的相似性度量 2 確定某個評價聚類結果質量的準則函式 3 給定某個初始分類,然後用迭代演算法找出使準則函式取極值的最好的聚類結果 k means演算法 輸入 聚類個數k,以及包含 n個資料物件的資料庫。輸出...

K均值演算法

假設需要聚成k個類 演算法先會隨機從資料集中選取k個點,把他們當做k個聚類的中心點 依次計算資料集中的每乙個點與各個中心點的距離,離哪個中心點近,就劃分到那個中心點對應的聚類下 計算分到同一類簇下,所有點的均值,更新中心點,重複 直至達到迭代結束條件 import numpy as np impor...

k均值演算法

1 撲克牌手動演練k均值聚類過程 30張牌,3類 實驗總牌數為30,分三類進行三輪迭代。第一輪 抽取聚類中心為 3 4 7.聚類結果為 第二輪 經過求平均後,重新確定聚類中心為 2 4 10 第三輪 對上類再進行求平均,選定聚類中心為2 5 10 最終聚類中心穩定在2 5 10,以此為小中大劃分。2...