在上一節我們對k-means的原理做了初步的**,這裡我們對k-means的演算法做乙個總結。
首先我們看看k-means演算法的一些要點。
1)對於k-means演算法,首先要注意的是k值的選擇,一般來說,我們會根據對資料的先驗經驗選擇乙個合適的k值,如果沒有什麼先驗知識,則可以通過交叉驗證選擇乙個合適的k值。
2)在確定了k的個數後,我們需要選擇k個初始化的質心,就像上圖b中的隨機質心。由於我們是啟發式方法,k個初始化的質心的位置選擇對最後的聚類結果和執行時間都有很大的影響,因此需要選擇合適的k個質心,最好這些質心不能太近。
好了,現在我們來總結下傳統的k-means演算法流程。
輸入是樣本集d
='>d=
,聚類的簇樹k,最大迭代次數n
輸出是簇劃分c
='>c=
1) 從資料集d中隨機選擇k個樣本作為初始的k個質心向量:
'>
2)對於n=1,2,...,n
a) 將簇劃分c初始化為ct=
∅t=1
,2...
k'>ct
=∅ t=1,2...k
b) 對於i=1,2...m,計算樣本x
i'>xi
xi和各個質心向量μj(
j=1,
2,..
.k)'>μj
(j=1,2,...k)
的距離:dij
=||x
i−μj
||22
'>di
j=||xi
−μj||2
,將xi
'>xi
xi標記最小的為dij
'>dij
所對應的類別λ
i'>λi
。此時更新cλi
=cλi
∪'>cλi=cλi∪
cλi=cλi∪
c) 對於j=1,2,...,k,對c
j'>cj
cj中所有的樣本點重新計算新的質心μj=
1|cj
|∑x∈
cjx'>μj=1|cj|∑x∈cjx
μj=1|cj|∑x∈cjx
e) 如果所有的k個質心向量都沒有發生變化,則轉到步驟3)
3) 輸出簇劃分c
='>c=c=
'>程式**如下:
//在矩陣img中隨機分布白點
void myrandfill(mat&img,int
numpoint)
}point getcentroid(std::vector
c) newpc.x /=c.size();
newpc.y /=c.size();
return
newpc;
}void getcluster(const mat&img,mat&imgcopy,
vector
c,point pc,
vec3b color,
intnumofcluster)
//獲取陣列d中最小值的位置
int minpos=(int)(min_element(d.begin(),d.end())-d.begin());
//將距離最小質心 對應顏色賦值給當前畫素
imgcopy.at(i,j)=color[minpos];
//將當前畫素併入對應類的集合
c[minpos].push_back(point(j,i));}}
}}void mykmeans(const mat&img,//
輸入原影象
mat&imgcopy,//
分類後的影象輸出
std::vector*c,//
類別標記陣列,
//陣列中每個元素c[i]表示一類畫素
//從影象中找到符合該類準則的畫素
//儲存在c[i]中,i=1,2,3...k。
point*pc,//
初始質心座標
vec3b*color,//
不同類別的畫素,賦予不同的顏色
int numofclusters)//
預設的類別數
vector
dc;float
sumdistance;
for(int k=0;k<2;k++)
sumdistance=accumulate(dc.begin(),dc.end(),0
); cout
<<"
sum distance=
"countite++;
for(int nc=0;nc)
if(sumdistance==0
)
}cout
<<"
count of iteration=
"}int
main()
;
//與red和blue兩種顏色對應的族類集合為c[0]和c[1]
std::vectorc[2
];
//隨便定義兩個座標點,作為兩個聚類質心的起始位置
point *pc=new point[2
]; pc[
0]=point(100,100);//
c1類畫素的初始質心座標
pc[1]=point(200,350);//
c2類畫素的初始質心座標
cv::circle(imgcopy,pc[0],5,scalar(0,0,255),-1
); cv::circle(imgcopy,pc[
1],5,scalar(255,0,0),-1
); imshow(
"original img
",img);
mykmeans(img,imgcopy,c,pc,color,2);
imshow(
"new centroid position
",imgcopy);
waitkey();
return0;
}
k means聚類分析
k means演算法是machine learning領域內比較常用的演算法之一。首先從n個資料物件任意選擇 k 個物件作為初始聚類中心 而對於所剩下其它物件,則根據它們與這些聚類中心的相似度 距離 分別將它們分配給與其最相似的 聚類中心所代表的 聚類 然 後再計算每個所獲新聚類的聚類中心 該聚類中...
K means聚類分析
主成分分析 pca pca n components 0.9 data pca.fit transform cross 降維x data 500 x.shape 對類別預設為4 km kmeans n clusters 4 km.fit x predict km.predict x 顯示聚類結果 p...
聚類分析 K Means演算法
k means演算法 這是基於劃分的聚類演算法,該演算法效率較高,對大規模資料進行聚類時被廣泛使用。基本思路 把資料集劃分成k 個簇,每個簇內部的樣本非常相似,不同簇之間的差異非常大。k means演算法是乙個迭代演算法,先隨機選擇 k個物件,每個物件代表了起中心,對於剩下的物件,將其賦給最近的簇,...