機器學習A-Z~K平均聚類算法

本文來說講K平均聚類算法(K-Means Clustering),K Means算法是全部聚類算法中最經典的一種,由於它不斷在直覺上容易理解,並且它的計算效率也是很是的高。css

原理

在講K-Means算法前咱們先看看,這個算法能作什麼。下面有一組數據,咱們想要把數據分紅若干個類,在某一類當中,這些數據的彼此之間的距離比較近。對於這個大問題,咱們有兩個小問題。第一個是,咱們如何肯定分的類的個數;第二個問題是,如何在肯定類的個數的狀況下,如何肯定每一個類中包含的元素。那麼K-Means算法就能夠自動幫助咱們找到最佳的聚類的方式。如圖所示,K-Means算法講這些數據分紅了紅藍綠三組。python

那麼咱們就來看看K-Means算法的工做流程。算法

  1. 選擇咱們想要的類的個數K;
  2. 在平面上隨機選擇K個點,做爲初始化類的中心點,不必定在原先數據當中;
  3. 對於數據集中的每一個點,要判斷它屬於咱們以前K箇中心點的哪一類。依據數據中的每一個點對這K個點的距離的大小,找到最短的距離,那麼就是每一個數據點對應的類別,這一步能夠稱做是分配;
  4. 從新計算一些新的中心點,就是應用以前分配的結果從新計算分配好的每一個類當中的中心點;
  5. 從新分配,若是從新分配的結果和以前分配的結果相同,則說明找到最佳的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)。

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聚類算法的相關基礎知識點。

相關文章
相關標籤/搜索