同時也參考了
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...