1. 程式人生 > >聚類(Clustering)

聚類(Clustering)

array label class red 平方和 rom width 好的 clas

  • 簡介

相對於決策樹、樸素貝葉斯、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
>>> 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.]])

聚類(Clustering)