【Machine Learning】OpenCV中的K-means聚类
在上一篇(【Machine Learning】K-means算法及優(yōu)化)中,我們介紹了K-means算法的基本原理及其優(yōu)化的方向。opencv中也提供了K-means算法的接口,這里主要介紹一下如何在python+opencv的環(huán)境下,使用k-means接口(C++的接口形式相似)。
python版本的k-means算法接口,即cv2.kmeans()。
輸入?yún)?shù):
-samples: 類型必須是np.float32型,每個特征應(yīng)該放置在單獨的一個列中;
-nclusters(K):最終要確定的類別數(shù);
-criteria:迭代終止的條件,3通道參數(shù),分別是(type, max_iter, epsilon):
- 3.a -type: 終止條件的類型,有如下3個flag:?cv2.TERM_CRITERIA_EPS(精度滿足epsilon時,終止迭代);cv2.TERM_CRITERIA_MAX_ITER(最大迭代次數(shù)達到后終止);cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER(二者滿足其一即可終止迭代);
- 3.b -??max_iter:最大迭代次數(shù);
- 3.c -?epsilon:精度;
-attempts: 算法使用不同初始化標(biāo)識執(zhí)行的次數(shù),改算法返回最佳集聚性的標(biāo)簽,該值作為輸出值返回;
-flags:用于指定如何初始化聚類中心,通常有兩種方式:cv2.KMEANS_PP_CENTERS(初始的K個點)和cv2.KMEANS_RANDOM_CENTERS(隨機產(chǎn)生的K個點)。
輸出參數(shù):
-compactness: 集聚性,指每個點到相應(yīng)聚類中心點的距離平方的和;
-labels:聚類的標(biāo)識序列(‘0’, ‘1’......);
-centers:聚類中心的序列。
1、一維特征的聚類
首先,使用如下代碼,創(chuàng)建一個隨機數(shù)組序列,并繪制其分布直方圖:
import numpy as np import cv2 from matplotlib import pyplot as pltx = np.random.randint(25,100,25) y = np.random.randint(175,255,25) z = np.hstack((x,y)) z = z.reshape((50,1)) z = np.float32(z) plt.hist(z,256,[0,256]),plt.show()由此,我們可以得到一個大小為50的數(shù)組‘Z’,值的范圍為0-255。這里,將z轉(zhuǎn)換成列向量,這樣對不止一個特征的聚類會非常有幫助,值的數(shù)據(jù)類型為np.float32。直方分布圖如下:
這里,調(diào)用K-means方程,首先我們要設(shè)定好criteria,這里最大迭代次數(shù)設(shè)定為10,誤差設(shè)定為1.0,且終止條件指定為不管達到誤差還是達到最大迭代次數(shù),都將終止迭代。同時,指定將以上數(shù)據(jù)聚類為2類。具體代碼如下:
# Define criteria = ( type, max_iter = 10 , epsilon = 1.0 ) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)# Set flags (Just to avoid line break in the code) flags = cv2.KMEANS_RANDOM_CENTERS# Apply KMeans compactness,labels,centers = cv2.kmeans(z,2,None,criteria,10,flags)
這里返回了compactness, labels and centers.這里,我們得到64和210兩個中心點(每次運行可能不太一樣,因為數(shù)據(jù)是隨機出來的)。labels的大小和輸入數(shù)據(jù)的大小相同,每個數(shù)據(jù)都將根據(jù)他們所屬類的中心被標(biāo)記為‘0’,‘1’,‘2’ 等等。下面將根據(jù)他們的標(biāo)識,將數(shù)據(jù)按類分離開:
A = z[labels==0] B = z[labels==1]
下面將A類用紅色繪制,B類用藍色繪制,他們的中心均用黃色繪制:
# Now plot 'A' in red, 'B' in blue, 'centers' in yellow plt.hist(A,256,[0,256],color = 'r') plt.hist(B,256,[0,256],color = 'b') plt.hist(centers,32,[0,256],color = 'y') plt.show()
可得到如下結(jié)果:
2、多維特征的聚類
下面考慮二維特征的聚類,按照上面類似的思路,生成數(shù)據(jù),進行聚類,并繪制聚類結(jié)果。代碼如下:
import numpy as np import cv2 from matplotlib import pyplot as pltX = np.random.randint(25,50,(25,2)) Y = np.random.randint(60,85,(25,2)) Z = np.vstack((X,Y))# convert to np.float32 Z = np.float32(Z)# define criteria and apply kmeans() criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) ret,label,center=cv2.kmeans(Z,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)# Now separate the data, Note the flatten() A = Z[label.ravel()==0] B = Z[label.ravel()==1]# Plot the data plt.scatter(A[:,0],A[:,1]) plt.scatter(B[:,0],B[:,1],c = 'r') plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's') plt.xlabel('Height'),plt.ylabel('Weight') plt.show()
聚類結(jié)果如下:
2017.11.17
總結(jié)
以上是生活随笔為你收集整理的【Machine Learning】OpenCV中的K-means聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Machine Learning】K-
- 下一篇: 【Machine Learning】KN