- Scikit Learn 教程
- Scikit Learn - 首頁
- Scikit Learn - 簡介
- Scikit Learn - 建模過程
- Scikit Learn - 資料表示
- Scikit Learn - 估計器 API
- Scikit Learn - 約定
- Scikit Learn - 線性建模
- Scikit Learn - 擴充套件線性建模
- 隨機梯度下降
- Scikit Learn - 支援向量機
- Scikit Learn - 異常檢測
- Scikit Learn - K 近鄰
- Scikit Learn - KNN 學習
- 樸素貝葉斯分類
- Scikit Learn - 決策樹
- 隨機決策樹
- Scikit Learn - 整合方法
- Scikit Learn - 聚類方法
- 聚類效能評估
- 使用 PCA 進行降維
- Scikit Learn 有用資源
- Scikit Learn - 快速指南
- Scikit Learn - 有用資源
- Scikit Learn - 討論
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 聚類學習到的聚類中心的影像。
接下來,下面的 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)