機器學習讀書筆記03 聚類(K-Means)


聚類的定義

將物理或抽象對象的集合分成由類似的對象組成的多個類的過程被稱為聚類。由聚類所生成的簇是一組數據對象的集合,這些對象與同一個簇中的對象彼此相似,與其他簇中的對象相異。“物以類聚,人以群分”,在自然科學和社會科學中,存在着大量的分類問題。聚類分析又稱群分析,它是研究(樣品或指標)分類問題的一種統計分析方法。聚類分析起源於分類學,但是聚類不等於分類。聚類與分類的不同在於,聚類所要求划分的類是未知的。聚類分析內容非常豐富,有系統聚類法、有序樣品聚類法、動態聚類法、模糊聚類法、圖論聚類法、聚類預報法等。

K-Means

K-means算法是硬聚類算法,是典型的基於原型的目標函數聚類方法的代表,它是數據點到原型的某種距離作為優化的目標函數,利用函數求極值的方法得到迭代運算的調整規則。K-means算法以歐式距離作為相似度測度,它是求對應某一初始聚類中心向量V最優分類,使得評價指標J最小。算法采用誤差平方和准則函數作為聚類准則函數。
K-means算法是很典型的基於距離的聚類算法,采用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大。該算法認為簇是由距離靠近的對象組成的,因此把得到緊湊且獨立的簇作為最終目標。
k個初始類聚類中心點的選取對聚類結果具有較大的影響,因為在該算法第一步中是隨機的選取任意k個對象作為初始聚類的中心,初始地代表一個簇。該算法在每次迭代中對數據集中剩余的每個對象,根據其與各個簇中心的距離將每個對象重新賦給最近的簇。當考察完所有數據對象后,一次迭代運算完成,新的聚類中心被計算出來。如果在一次迭代前后,J的值沒有發生變化,說明算法已經收斂。

K-Means算法過程

  • 從N個文檔隨機選取K個文檔作為質心
  • 對剩余的每個文檔測量其到每個質心的距離,並把它歸到最近的質心的類
  • 重新計算已經得到的各個類的質心
  • 迭代2~3步直至新的質心與原質心相等或小於指定閾值,算法結束

具體如下:
輸入:k, data[n];

1 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
2 對於data[0]….data[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;
3 對於所有標記為i點,重新計算c[i]={ 所有標記為i的data[j]之和}/標記為i的個數;
4 重復(2)(3),直到所有c[i]值的變化小於給定閾值。

k-means 算法缺點

  • 在 K-means 算法中 K 是事先給定的,這個 K 值的選定是非常難以估計的。
  • 在 K-means 算法中,首先需要根據初始聚類中心來確定一個初始划分,然后對初始划分進行優化。這個初始聚類中心的選擇對聚類結果有較大的影響,一旦初始值選擇的不好,可能無法得到有效的聚類結果,這也成為 K-means算法的一個主要問題。

sklearn中的KMeans

在sklearn中處理kmeans聚類問題,用到的是 sklearn.cluster.KMeans 這個類。
參數:

  • n_clusters:整形,缺省值=8, 生成的聚類數,即產生的質心(centroids)數。
  • max_iter:整形,缺省值=300, 執行一次k-means算法所進行的最大迭代數。
  • n_init:整形,缺省值=10, 用不同的質心初始化值運行算法的次數,最終解是在inertia意義下選出的最優結果。
  • init:有三個可選值:'k-means++', 'random',或者傳遞一個ndarray向量。此參數指定初始化方法,默認值為'k-means++'。

1 ‘k-means++’ 用一種特殊的方法選定初始質心從而能加速迭代過程的收斂,參見 k_init 的解釋獲取更多信息。
2 ‘random’ 隨機從訓練數據中選取初始質心。
3 如果傳遞的是一個ndarray,則應該形如 (n_clusters, n_features) 並給出初始質心。

  • precompute_distances:三個可選值,‘auto’,True 或者 False。預計算距離,計算速度更快但占用更多內存。

1 ‘auto’:如果 樣本數乘以聚類數大於 12million 的話則不預計算距離。This corresponds to about 100MB overhead per job using double precision.
2 True:總是預先計算距離。
3 False:永遠不預先計算距離。

  • tol:float形,默認值= 1e-4, 與inertia結合來確定收斂條件。
  • n_jobs:整形數。指定計算所用的進程數。內部原理是同時進行n_init指定次數的計算。

1 若值為 -1,則用所有的CPU進行運算。若值為1,則不進行並行運算,這樣的話方便調試。
2 若值小於-1,則用到的CPU數為(n_cpus + 1 + n_jobs)。因此如果 n_jobs值為-2,則用到的CPU數為總CPU數減1。

  • random_state:整形或 numpy.RandomState 類型,可選, 用於初始化質心的生成器(generator)。如果值為一個整數,則確定一個seed。此參數默認值為numpy的隨機數生成器。
  • verbose:整形,默認值=0
  • Verbosity mode
  • copy_x:布爾型,默認值=True, 當我們precomputing distances時,將數據中心化會得到更准確的結果。

1 如果把此參數值設為True,則原始數據不會被改變。
2 如果是False,則會直接在原始數據上做修改並在函數返回值時將其還原。但是在計算過程中由於有對數據均值的加減運算,所以數據返回后,原始數據和計算前可能會有細小差別。

屬性:

  • cluster_centers_:向量,[n_clusters, n_features]
  • Coordinates of cluster centers (每個簇中心的坐標??)
  • Labels_:每個點的分類
  • inertia_:float形,每個點到其簇的質心的距離之和。

sklearn官網示例

from sklearn.cluster import KMeans
import numpy as np

X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)

kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)

kmeans.cluster_centers_
array([[ 1.,  2.], [ 4.,  2.]])

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM