聚類(Clustering)

  • 簡介

相對於決策樹、樸素貝葉斯、SVM等有監督學習,聚類算法屬於無監督學習。html

有監督學習一般根據數據集的標籤進行分類,而無監督學習中,數據集並無相應的標籤,算法僅根據數據集進行劃分。算法

因爲具備出色的速度和良好的可擴展性,Kmeans聚類算法算得上是最著名的聚類方法。dom

 

  • 基本思想

在沒有標籤的數據集中,全部的數據點都是同一類的。學習

  

在這張圖中,雖然數據都爲同一類,可是能夠直觀的看出,數據集存在簇或聚類。這種數據沒有比標籤,但能發現其結構的狀況,稱做非監督學習。優化

最基本的聚類算法,也是目前使用最多的聚類算法叫作K-均值(K-Means)。spa

假設一組數據集爲下圖:3d

      

他們應該有兩個簇,其中簇的中心以下圖:code

      

在K-Means算法中,首先隨便畫出聚類中心,它能夠是不正確的:htm

(假設上方綠點爲中心1,下方綠點爲中心2)blog

      

K-Means算法分爲兩個步驟:

一、分配

二、優化

 

進行第一步,對於上圖的數據集,首先找出在全部紅色點中,距離中心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
>>> import numpy 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.]])
相關文章
相關標籤/搜索