數據挖掘|K-means聚類

這一篇本來應該是講關聯分析的,但由於下周有實變函數的考試,/(ㄒoㄒ)/~~所以我寫一個短一點的數據挖掘演算法——K-means聚類。

我們先來看K-means要解決的問題。

如果我們測量了很多未知品種的花?的數據,想根據這些數據對我們測量的花進行分類。但是事先,我們沒有一個確定的分類標準。那我們應該怎麼解決呢?

事實上,同一種花?的數據在數值上都很接近,我們考慮把那些數據離得近的花分成一類。正如下圖,平面上的這些代表花?的點,如果我們把圖畫出來的話,可以很容易看他們應該分成五類,而且可以知道每個花?屬於哪一類。

接下里我們來看這個演算法具體是怎麼實現的。

這個問題在直覺上很容易把握,演算法的關鍵在於引進了質心。我們假設有三個質心(分別對應三個類)。對於某個點,如果它離哪個質心最近,他就屬於哪個類。(當然,這裡的質心也可以叫中心,因為我們用歐幾里得距離衡量長度,這個中心自然和物理裡面的質心具有一樣的計算方法)

演算法的整個過程,就是找到最合適的質心的過程。什麼是最合適的質心呢?我們首先任意指定一些質心。然後,根據距離判斷每個點屬於哪一個質心。從而得到屬於某個質心的所有點。如果這些點的根據距離計算得到的質心恰好和我們事先指定的質心是一個的話,那就說明我們找到了最合適的質心。

下面是具體的迭代過程:

1:選擇K個點作為質心n2:Repeatn3: 將每個點指派到最近的質心,形成K個簇n4: 重新計算每個簇的質心n5:Until 質心不發生改變n

這個圖很清楚的反映了我們初始化的任意質心,經過迭代,很快收斂到真正合適質心的過程。

我們還可以看看sklearn裡面的K-means的一個例子。

sklearn的K-means的原型是這樣的,它被定義成了一個類,裡面的參數如下:

class sklearn.cluster.KMeans(n_clusters=8, init=k-means++, n_init=10, max_iter=300, random_state=None,)n

n_clusters 指定任意的質心的個數nninit 質心初始化的方法,任意指定的參數為random,默認的k-means++是一種特殊的初始化方法,可以提高收斂的速度。nnn_init 程序會多次初始化不同的質心得到不同的結果,並且選擇其中最好的。n_init指的是初始化的次數nnmax_iter 指的是迭代得到最終質心的次數nnrandom_state 相當於隨機數的隨機種子,如果指定了數字,初始化會使用固定的值,那麼會得到相同的結果n

下面我們看一個具體的例子:

首先在X里放上一些點n>>> from sklearn.cluster import KMeansn>>> import numpy as npn>>> X = np.array([[1, 2], [1, 4], [1, 0],n... [4, 2], [4, 4], [4, 0]])nn然後對它們進行聚類,得到質心,以及每個點屬於的類n>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)n>>> kmeans.labels_narray([0, 0, 0, 1, 1, 1], dtype=int32)nn然後我們預測新的點屬於哪一個類n>>> kmeans.predict([[0, 0], [4, 4]])narray([0, 1], dtype=int32)nn最後我們查看得到的質心n>>> kmeans.cluster_centers_narray([[ 1., 2.],n [ 4., 2.]])n

這個例子還是很簡單的。關於K-means的知識遠不止我上面寫的這些,想進一步研究的話,可以參考Introduction to data mining。裡面對於聚類有非常詳細的介紹。

----------------------------------------------------------------------------------

PS:裡面的迭代演算法用的還是不動點原理。hhh~

非商業轉載註明作者即可,商業轉載請聯繫作者授權並支付稿費。本專欄已授權「維權騎士」網站(http://http://rightknights.com)對我在知乎發布文章的版權侵權行為進行追究與維權。

項目聯繫方式:

  • 項目郵箱(@iGuo 的郵箱):zhangguocpp@163.com
  • 項目網站:http://www.xmucpp.com/(修復中)
  • 項目GitHub:Chinas Prices Project at Xiamen Univerisity (CPP@XMU)(修復中)
  • 項目專欄:Chinas Prices Project - 知乎專欄
  • 項目知乎賬戶:@CPP
  • 項目公眾號:xmucpp2016(XMUCPP)

推薦閱讀:

巡洋艦AI時代招你遠征
運營汪別委屈了,教你如何打一場漂亮的「翻身仗」
機器學習基石-- Learning to Answer Yes/No
【機器學習】Cross-Validation(交叉驗證)詳解

TAG:数据挖掘 | Python | 机器学习 |