本文來說講K平均聚類算法(K-Means Clustering),K Means算法是全部聚類算法中最經典的一種,由於它不斷在直覺上容易理解,並且它的計算效率也是很是的高。css
在講K-Means算法前咱們先看看,這個算法能作什麼。下面有一組數據,咱們想要把數據分紅若干個類,在某一類當中,這些數據的彼此之間的距離比較近。對於這個大問題,咱們有兩個小問題。第一個是,咱們如何肯定分的類的個數;第二個問題是,如何在肯定類的個數的狀況下,如何肯定每一個類中包含的元素。那麼K-Means算法就能夠自動幫助咱們找到最佳的聚類的方式。如圖所示,K-Means算法講這些數據分紅了紅藍綠三組。python
那麼咱們就來看看K-Means算法的工做流程。算法
下面從具體的例子來說述這個步驟。假設有一組數據,咱們要分配成兩類,即K=2;而後隨機選擇兩個點,分別計算每一個點距離這兩個點的距離。這裏能夠有個比較簡單的計算方式,咱們做出這兩個點的垂直平分線,那麼這個綠線上方的點都是離藍色點比較近,下面的離紅色比較近。app
那麼咱們就把上面的點分做藍組,下面的分爲紅組。目前的步驟至關於已經進行到第三步。接下來第四步,更新每組數據的中心點,那麼咱們就找到了新的中心點能夠進行第五步,依據新的中心點,從新進行分配。less
不斷重複45步驟,直到分配的結果和前一步分配的結果是一致的。dom
K-Means算法能夠以一種算法的方式告訴咱們最佳的聚類的方式,這裏就獲得了左下方紅組,右上方藍組的這樣一個結論。工具
如今看看初始點的選擇對最終K-Meas聚類結果的影響。下面有一個例子,咱們須要用K-Means算法對這組數據進行聚類,選擇K=3。這裏很明顯有三類,咱們這裏就直接選擇最佳的中心點並標記出這三類數據。學習
那麼這裏是咱們肉眼看出來的三個中心點,但若是咱們選擇的不是這最佳的中心點,則須要重複上述的45步,好比選的是下面這三個中心點。spa
那麼這時就須要對中心點進行位移,但因爲這個位移是很是小的,因此新的分類結果和以前並不會有什麼改變,因此算法就這樣結束了。code
這樣獲得的分類結果和以前那個顯然是不一樣的。但這樣就發生了同一組數據,卻產生了兩個不一樣的分類結果。區別就在於選擇了不一樣的初始中心點。咱們很差直接說哪個分類算法更好,須要有一個方法來判斷如何選擇初始中心點。也就是說初始中心點不能隨機進行選擇了。如今有一個K-Means算法的更新版本,叫作K-Means++,它完美的解決了初始化中心點的陷阱,數學上來說叫作局部最小值的一個陷阱。不管在R仍是Python中,這個K-Means++都已經加入了算法當中,所以不用擔憂以後的代碼實現會不會掉入這個陷阱。
上文講到的是選擇中心點的陷阱,那麼如今在談談如何選擇類的個數。從直觀上,上文中的圖像大部分人應該很容易想到分爲3組,也有的人可能想分爲2組,但怎樣選擇纔是最佳的分組方式是個須要好好研究的問題。首先來定義一個數學的量,組內平方和(WCSS)。
來看這個表達式,一共有3項,每一項表明對於每一組的平方和。好比第一項,就是對全部數據點對這一組中心點距離的平方。很顯然,若是每一組的數據蜷縮的越緊,那麼這個平方和就越小。
那麼若是將這組數據分爲1組,那麼這個組內平方和只有一項,那麼這個結果很顯然會很大。若是分爲2組,那麼結果比1組的確定要小,當分爲3組時,獲得的結果會更小。也就是說,隨着分組的個數增長,這個組內平方和會逐漸變小。那麼如今的問題來了,如何選擇最合適的分組的個數?
這裏要介紹一個法則,叫作手肘法則(The Elbow Method)。咱們把隨着分組個數的增長,WCSS的結果的圖像畫出來。
找到最像手肘的這個點,這裏就是3,那麼這個點,就是最佳的分組的個數。這個曲線上能夠看到,從1到2,和2到3時,降低的速率都是比較快的,但從3日後,降低的速率都是很是小的,那麼咱們要找的就是這樣一個點,在到達這個點以前和從這個點開始的降低,速率的變化時最大的。
咱們此次要用到的數據集部分以下,反映的是一個購物商場的購物信息。最後一列Spending Score是購物商場根據客戶的信息打出的客戶的評分,分數越低意味着客戶花的錢越少,越高覺得着客戶花的越多。商場但願經過對客戶的年收入和購物指數來進行分羣。
CustomerID | Genre | Age | Annual Income (k$) | Spending Score (1-100) |
---|---|---|---|---|
0001 | Male | 19 | 15 | 39 |
0002 | Male | 21 | 15 | 81 |
0003 | Female | 20 | 16 | 6 |
0004 | Female | 23 | 16 | 77 |
那麼這個問題的自變量就是第三四列,年收入和購物指數。但它是個無監督學習,所以沒有因變量。這裏咱們要用到的工具是sklearn.cluster中的KMeans類。
首先要計算各個分組的WCSS。這裏咱們計算組數從1到10的狀況。
wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters=i, max_iter=300, n_init=10, init='k-means++', random_state=0) kmeans.fit(X) wcss.append(kmeans.inertia_) plt.plot(range(1, 11), wcss) plt.title('The Elbow Method') plt.xlabel('Number of Clusters') plt.ylabel('WCSS') plt.show()
這裏的KMeans中的參數也解釋下,n_clusters指的是分組數,max_iter指的是每一次計算時最大的循環個數,這裏使用默認值300,n_init表明每個作K平均算法時,會對多少組不一樣的中心值進行計算。init這個參數很是重要,指的是咱們如何選擇初始值,最簡單的是random,即隨機,但爲了不掉入隨機初始值陷阱,這裏使用k-means++。
擬合好後獲得組間距離就是kmeans.inertia_。這樣咱們就能夠畫出對於不一樣的分組數,wcss的圖像。
那麼經過手肘法則,能夠獲得最佳的分組個數是5組,則能夠開始擬合數據。
# Applying the k-means to the mall dataset kmeans = KMeans(n_clusters=5, max_iter=300, n_init=10, init='k-means++', random_state=0) y_kmeans = kmeans.fit_predict(X)
擬合好數據後,獲得的y_means實際上就是0-4五個分組。咱們來將分組後的圖像畫出來看看。
# Visualizing the clusters plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s=100, c='red', label='Careful') plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s=100, c='blue', label='Standard') plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s=100, c='green', label='Target') plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s=100, c='cyan', label='Careless') plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s=100, c='magenta', label='Sensible') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='yellow', label='Centroids') plt.title('Clusters of clients') plt.xlabel('Annual Income (k$)') plt.ylabel('Spending Score (1-100)') plt.legend() plt.show()
獲得的圖像以下,咱們就能夠根據圖像來進行分析,給予不一樣的標籤。
以上,就是K-Means聚類算法的相關基礎知識點。