Scikit Learn - 聚類方法



在這裡,我們將學習 Sklearn 中的聚類方法,這將有助於識別資料樣本中的任何相似性。

聚類方法是最有用的無監督機器學習方法之一,用於查詢資料樣本之間的相似性和關係模式。然後,它們根據特徵將這些樣本聚類到具有相似性的組中。聚類確定當前未標記資料中固有的分組,因此它很重要。

Scikit-learn 庫具有sklearn.cluster來執行未標記資料的聚類。在此模組下,scikit-leran 具有以下聚類方法:

KMeans

此演算法計算質心並迭代直到找到最佳質心。它需要指定聚類數量,因此它假設它們是已知的。該演算法的主要邏輯是透過最小化稱為慣性的標準來聚類資料,將樣本分成 n 個方差相等的組。演算法識別的聚類數量用“K”表示。

Scikit-learn 具有sklearn.cluster.KMeans模組來執行 K 均值聚類。在計算聚類中心和慣性值時,名為sample_weight的引數允許sklearn.cluster.KMeans模組為某些樣本分配更多權重。

親和傳播

此演算法基於不同樣本對之間“訊息傳遞”的概念,直到收斂。它不需要在執行演算法之前指定聚類數量。該演算法的時間複雜度為𝑂(𝑁2𝑇)數量級,這是其最大的缺點。

Scikit-learn 具有sklearn.cluster.AffinityPropagation模組來執行親和傳播聚類。

均值漂移

此演算法主要發現樣本平滑密度中的blob。它透過將點移向資料點的最高密度來迭代地將資料點分配給聚類。它不依賴於名為bandwidth的引數來指示要搜尋的區域的大小,而是自動設定聚類數量。

Scikit-learn 具有sklearn.cluster.MeanShift模組來執行均值漂移聚類。

譜聚類

在聚類之前,此演算法基本上使用資料相似矩陣的特徵值,即譜,在較少的維度上執行降維。當聚類數量很大時,不建議使用此演算法。

Scikit-learn 具有sklearn.cluster.SpectralClustering模組來執行譜聚類。

層次聚類

此演算法透過連續合併或拆分聚類來構建巢狀聚類。此聚類層次結構表示為樹狀圖,即樹。它分為以下兩類:

凝聚層次演算法 - 在這種層次演算法中,每個資料點都被視為一個單獨的聚類。然後它連續地將聚類對聚合在一起。這使用自底向上的方法。

分裂層次演算法 - 在此層次演算法中,所有資料點都被視為一個大聚類。在此過程中,聚類涉及使用自頂向下的方法將一個大聚類劃分為各種小聚類。

Scikit-learn 具有sklearn.cluster.AgglomerativeClustering模組來執行凝聚層次聚類。

DBSCAN

它代表“基於密度的噪聲應用空間聚類”。此演算法基於“聚類”和“噪聲”的直觀概念,即聚類是資料空間中較低密度的密集區域,由較低密度的資料點區域隔開。

Scikit-learn 具有sklearn.cluster.DBSCAN模組來執行 DBSCAN 聚類。此演算法使用兩個重要引數,即 min_samples 和 eps 來定義密集。

引數min_samples的值越高或引數 eps 的值越低,將表明形成聚類所需的較高資料點密度。

OPTICS

它代表“排序點以識別聚類結構”。此演算法還在空間資料中找到基於密度的聚類。它的基本工作邏輯與 DBSCAN 類似。

它解決了 DBSCAN 演算法的一個主要弱點——在密度變化的資料中檢測有意義的聚類的問題——透過以這樣一種方式對資料庫中的點進行排序,即空間上最接近的點成為排序中的鄰居。

Scikit-learn 具有sklearn.cluster.OPTICS模組來執行 OPTICS 聚類。

BIRCH

它代表使用層次結構的平衡迭代減少和聚類。它用於對大型資料集執行層次聚類。它為給定資料構建一棵名為CFT的樹,即特徵特徵樹

CFT 的優點在於,稱為 CF(特徵特徵)節點的資料節點儲存聚類所需的必要資訊,從而進一步避免了在記憶體中儲存整個輸入資料的需要。

Scikit-learn 具有sklearn.cluster.Birch模組來執行 BIRCH 聚類。

比較聚類演算法

下表將對 scikit-learn 中的聚類演算法(基於引數、可擴充套件性和度量)進行比較。

序號 演算法名稱 引數 可擴充套件性 使用的度量
1 K-Means 聚類數量 非常大的 n_samples 點之間的距離。
2 親和傳播 阻尼 它不適用於 n_samples 可擴充套件。 圖距離
3 均值漂移 頻寬 它不適用於 n_samples 可擴充套件。 點之間的距離。
4 譜聚類 聚類數量 n_samples 的中等可擴充套件性水平。n_clusters 的可擴充套件性水平較低。 圖距離
5 層次聚類 距離閾值或聚類數量 大型 n_samples 大型 n_clusters 點之間的距離。
6 DBSCAN 鄰域大小 非常大的 n_samples 和中等 n_clusters。 最近點距離
7 OPTICS 最小聚類成員資格 非常大的 n_samples 和大型 n_clusters。 點之間的距離。
8 BIRCH 閾值、分支因子 大型 n_samples 大型 n_clusters 點之間的歐幾里得距離。

Scikit-learn 數字資料集上的 K-Means 聚類

在此示例中,我們將對數字資料集應用 K 均值聚類。此演算法將識別相似的數字,而無需使用原始標籤資訊。實現是在 Jupyter notebook 上完成的。

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape

輸出

1797, 64)

此輸出顯示數字資料集具有 1797 個樣本和 64 個特徵。

示例

現在,按如下方式執行 K-Means 聚類:

kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape

輸出

(10, 64)

此輸出顯示 K-Means 聚類建立了 10 個具有 64 個特徵的聚類。

示例

fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks = [], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)

輸出

以下輸出顯示了 K-Means 聚類學習到的聚類中心的影像。

clusters centers

接下來,下面的 Python 指令碼將學習到的聚類標籤(由 K-Means 學習)與其中找到的真實標籤進行匹配:

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]

我們還可以藉助以下命令檢查準確性。

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)

輸出

0.7935447968836951

完整的實現示例

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np

from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
   axi.set(xticks=[], yticks = [])
   axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
   mask = (clusters == i)
   labels[mask] = mode(digits.target[mask])[0]
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)
廣告

© . All rights reserved.