聚類(Clustering)
- 簡介
相對於決策樹、樸素貝葉斯、SVM等有監督學習,聚類算法屬於無監督學習。
有監督學習通常根據數據集的標簽進行分類,而無監督學習中,數據集並沒有相應的標簽,算法僅根據數據集進行劃分。
由於具有出色的速度和良好的可擴展性,Kmeans聚類算法算得上是最著名的聚類方法。
- 基本思想
在沒有標簽的數據集中,所有的數據點都是同一類的。
在這張圖中,雖然數據都為同一類,但是可以直觀的看出,數據集存在簇或聚類。這種數據沒有比標簽,但能發現其結構的情況,稱作非監督學習。
最基本的聚類算法,也是目前使用最多的聚類算法叫做K-均值(K-Means)。
假設一組數據集為下圖:
他們應該有兩個簇,其中簇的中心如下圖:
在K-Means算法中,首先隨便畫出聚類中心,它可以是不正確的:
(假設上方綠點為中心1,下方綠點為中心2)
K-Means算法分為兩個步驟:
1、分配
2、優化
進行第一步,對於上圖的數據集,首先找出在所有紅色點中,距離中心1比距離中心2更近的點
簡單的方法是找出兩個中心點的垂直平分線,將紅色的點分割為兩部分,分別是距離各自中心更近的點
第二步是優化。首先將聚類中心和第一步分配完的點相連接,然後開始優化:移動聚類中心,使得與聚類中心相連接的線的平方和最短。
多次進行步驟1和2,即先分配再優化,聚類中心將會逐步移動到數據簇的中心。
- 代碼實現
環境:MacOS mojave 10.14.3
Python 3.7.0
使用庫:scikit-learn 0.19.2
sklearn.cluster.KMeans官方庫:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
>>> from sklearn.cluster import KMeans >>> importnumpy as np >>> X = np.array([[1, 2], [1, 4], [1, 0], ... [10, 2], [10, 4], [10, 0]]) #輸入六個數據點 >>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X) #確定一共有兩個聚類中心 >>> kmeans.labels_ array([1, 1, 1, 0, 0, 0], dtype=int32) >>> kmeans.predict([[0, 0], [12, 3]]) #預測兩個新點的聚類分類情況 array([1, 0], dtype=int32) >>> kmeans.cluster_centers_ #輸出兩個聚類中心的坐標 array([[10., 2.], [ 1., 2.]])
聚類(Clustering)