天天看點

10 種聚類算法的完整 Python 操作示例

今天給大家分享一篇關于聚類的文章,10種聚類介紹和Python代碼。

聚類或聚類分析是無監督學習問題。它通常被用作資料分析技術,用于發現資料中的有趣模式,例如基于其行為的客戶群。有許多聚類算法可供選擇,對于所有情況,沒有單一的最佳聚類算法。相反,最好探索一系列聚類算法以及每種算法的不同配置。在本教程中,你将發現如何在 python 中安裝和使用頂級聚類算法。

完成本教程後,你将知道:

  • 聚類是在輸入資料的特征空間中查找自然組的無監督問題。
  • 對于所有資料集,有許多不同的聚類算法和單一的最佳方法。
  • 在 scikit-learn 機器學習庫的 Python 中如何實作、适配和使用頂級聚類算法。

教程概述

本教程分為三部分:

  1. 聚類
  2. 聚類算法
  3. 聚類算法示例
  • 庫安裝
  • 聚類資料集
  • 親和力傳播
  • 聚合聚類
  • BIRCH
  • DBSCAN
  • K-均值
  • Mini-Batch K-均值
  • Mean Shift
  • OPTICS
  • 光譜聚類
  • 高斯混合模型

一.聚類

聚類分析,即聚類,是一項無監督的機器學習任務。它包括自動發現資料中的自然分組。與監督學習(類似預測模組化)不同,聚類算法隻解釋輸入資料,并在特征空間中找到自然組或群集。

聚類技術适用于沒有要預測的類,而是将執行個體劃分為自然組的情況。 

—源自:《資料挖掘頁:實用機器學習工具和技術》2016年。

群集通常是特征空間中的密度區域,其中來自域的示例(觀測或資料行)比其他群集更接近群集。群集可以具有作為樣本或點特征空間的中心(質心),并且可以具有邊界或範圍。

這些群集可能反映出在從中繪制執行個體的域中工作的某種機制,這種機制使某些執行個體彼此具有比它們與其餘執行個體更強的相似性。

—源自:《資料挖掘頁:實用機器學習工具和技術》2016年。

聚類可以作為資料分析活動提供幫助,以便了解更多關于問題域的資訊,即所謂的模式發現或知識發現。例如:

  • 該進化樹可以被認為是人工聚類分析的結果;
  • 将正常資料與異常值或異常分開可能會被認為是聚類問題;
  • 根據自然行為将叢集分開是一個叢集問題,稱為市場細分。

聚類還可用作特征工程的類型,其中現有的和新的示例可被映射并标記為屬于資料中所辨別的群集之一。雖然确實存在許多特定于群集的定量措施,但是對所識别的群集的評估是主觀的,并且可能需要領域專家。通常,聚類算法在人工合成資料集上與預先定義的群集進行學術比較,預計算法會發現這些群集。

聚類是一種無監督學習技術,是以很難評估任何給定方法的輸出品質。

—源自:《機器學習頁:機率觀點》2012。

二.聚類算法

有許多類型的聚類算法。許多算法在特征空間中的示例之間使用相似度或距離度量,以發現密集的觀測區域。是以,在使用聚類算法之前,擴充資料通常是良好的實踐。

聚類分析的所有目标的核心是被群集的各個對象之間的相似程度(或不同程度)的概念。聚類方法嘗試根據提供給對象的相似性定義對對象進行分組。

—源自:《統計學習的要素:資料挖掘、推理和預測》,2016年

一些聚類算法要求您指定或猜測資料中要發現的群集的數量,而另一些算法要求指定觀測之間的最小距離,其中示例可以被視為“關閉”或“連接配接”。是以,聚類分析是一個疊代過程,在該過程中,對所識别的群集的主觀評估被回報回算法配置的改變中,直到達到期望的或适當的結果。scikit-learn 庫提供了一套不同的聚類算法供選擇。下面列出了10種比較流行的算法:

  1. 親和力傳播
  2. 聚合聚類
  3. BIRCH
  4. DBSCAN
  5. K-均值
  6. Mini-Batch K-均值
  7. Mean Shift
  8. OPTICS
  9. 光譜聚類
  10. 高斯混合

每個算法都提供了一種不同的方法來應對資料中發現自然組的挑戰。沒有最好的聚類算法,也沒有簡單的方法來找到最好的算法為您的資料沒有使用控制實驗。在本教程中,我們将回顧如何使用來自 scikit-learn 庫的這10個流行的聚類算法中的每一個。這些示例将為您複制粘貼示例并在自己的資料上測試方法提供基礎。我們不會深入研究算法如何工作的理論,也不會直接比較它們。讓我們深入研究一下。

三.聚類算法示例

在本節中,我們将回顧如何在 scikit-learn 中使用10個流行的聚類算法。這包括一個拟合模型的例子和可視化結果的例子。這些示例用于将粘貼複制到您自己的項目中,并将方法應用于您自己的資料。

1.庫安裝

首先,讓我們安裝庫。不要跳過此步驟,因為你需要確定安裝了最新版本。你可以使用 pip Python 安裝程式安裝 scikit-learn 存儲庫,如下所示:

sudo pip install scikit-learn      

接下來,讓我們确認已經安裝了庫,并且您正在使用一個現代版本。運作以下腳本以輸出庫版本号。

# 檢查 scikit-learn 版本
import sklearn
print(sklearn.__version__)      

運作該示例時,您應該看到以下版本号或更高版本。

0.22.1      

2.聚類資料集

我們将使用 make _ classification ()函數建立一個測試二分類資料集。資料集将有1000個示例,每個類有兩個輸入要素和一個群集。這些群集在兩個次元上是可見的,是以我們可以用散點圖繪制資料,并通過指定的群集對圖中的點進行顔色繪制。

這将有助于了解,至少在測試問題上,群集的識别能力如何。該測試問題中的群集基于多變量高斯,并非所有聚類算法都能有效地識别這些類型的群集。是以,本教程中的結果不應用作比較一般方法的基礎。下面列出了建立和彙總合成聚類資料集的示例。

# 綜合分類資料集
from numpy import where
from sklearn.datasets import make_classification
from matplotlib import pyplot
# 定義資料集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 為每個類的樣本建立散點圖
for class_value in range(2):
# 擷取此類的示例的行索引
row_ix = where(y == class_value)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例将建立合成的聚類資料集,然後建立輸入資料的散點圖,其中點由類标簽(理想化的群集)着色。我們可以清楚地看到兩個不同的資料組在兩個次元,并希望一個自動的聚類算法可以檢測這些分組。

10 種聚類算法的完整 Python 操作示例

已知聚類着色點的合成聚類資料集的散點圖

接下來,我們可以開始檢視應用于此資料集的聚類算法的示例。我已經做了一些最小的嘗試來調整每個方法到資料集。

3.親和力傳播

親和力傳播包括找到一組最能概括資料的範例。

我們設計了一種名為“親和傳播”的方法,它作為兩對資料點之間相似度的輸入度量。在資料點之間交換實值消息,直到一組高品質的範例和相應的群集逐漸出現

—源自:《通過在資料點之間傳遞消息》2007。

它是通過 AffinityPropagation 類實作的,要調整的主要配置是将“ 阻尼 ”設定為0.5到1,甚至可能是“首選項”。

下面列出了完整的示例。

# 親和力傳播聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AffinityPropagation
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = AffinityPropagation(damping=0.9)
# 比對模型
model.fit(X)
# 為每個示例配置設定一個叢集
yhat = model.predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,我無法取得良好的結果。

10 種聚類算法的完整 Python 操作示例

資料集的散點圖,具有使用親和力傳播識别的聚類

4.聚合聚類

聚合聚類涉及合并示例,直到達到所需的群集數量為止。它是層次聚類方法的更廣泛類的一部分,通過 AgglomerationClustering 類實作的,主要配置是“ n _ clusters ”集,這是對資料中的群集數量的估計,例如2。下面列出了完整的示例。

# 聚合聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AgglomerativeClustering
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = AgglomerativeClustering(n_clusters=2)
# 模型拟合與聚類預測
yhat = model.fit_predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,可以找到一個合理的分組。

10 種聚類算法的完整 Python 操作示例

使用聚集聚類識别出具有聚類的資料集的散點圖

5.BIRCH

BIRCH 聚類( BIRCH 是平衡疊代減少的縮寫,聚類使用層次結構)包括構造一個樹狀結構,從中提取聚類質心。

BIRCH 遞增地和動态地群集傳入的多元度量資料點,以嘗試利用可用資源(即可用記憶體和時間限制)産生最佳品質的聚類。

—源自:《 BIRCH :1996年大型資料庫的高效資料聚類方法》

它是通過 Birch 類實作的,主要配置是“ threshold ”和“ n _ clusters ”超參數,後者提供了群集數量的估計。下面列出了完整的示例。

# birch聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import Birch
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = Birch(threshold=0.01, n_clusters=2)
# 适配模型
model.fit(X)
# 為每個示例配置設定一個叢集
yhat = model.predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,可以找到一個很好的分組。

10 種聚類算法的完整 Python 操作示例

使用BIRCH聚類确定具有聚類的資料集的散點圖

6.DBSCAN

DBSCAN 聚類(其中 DBSCAN 是基于密度的空間聚類的噪聲應用程式)涉及在域中尋找高密度區域,并将其周圍的特征空間區域擴充為群集。

…我們提出了新的聚類算法 DBSCAN 依賴于基于密度的概念的叢集設計,以發現任意形狀的叢集。DBSCAN 隻需要一個輸入參數,并支援使用者為其确定适當的值

-源自:《基于密度的噪聲大空間資料庫聚類發現算法》,1996

它是通過 DBSCAN 類實作的,主要配置是“ eps ”和“ min _ samples ”超參數。

下面列出了完整的示例。

# dbscan 聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = DBSCAN(eps=0.30, min_samples=9)
# 模型拟合與聚類預測
yhat = model.fit_predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,盡管需要更多的調整,但是找到了合理的分組。

10 種聚類算法的完整 Python 操作示例

使用DBSCAN叢集識别出具有叢集的資料集的散點圖

7.K均值

K-均值聚類可以是最常見的聚類算法,并涉及向群集配置設定示例,以盡量減少每個群集内的方差。

本文的主要目的是描述一種基于樣本将 N 維種群劃分為 k 個集合的過程。這個叫做“ K-均值”的過程似乎給出了在類内方差意義上相當有效的分區。

-源自:《關于多元觀測的分類和分析的一些方法》1967年

它是通過 K-均值類實作的,要優化的主要配置是“ n _ clusters ”超參數設定為資料中估計的群集數量。下面列出了完整的示例。

# k-means 聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = KMeans(n_clusters=2)
# 模型拟合
model.fit(X)
# 為每個示例配置設定一個叢集
yhat = model.predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,可以找到一個合理的分組,盡管每個次元中的不等等方差使得該方法不太适合該資料集。

10 種聚類算法的完整 Python 操作示例

使用K均值聚類識别出具有聚類的資料集的散點圖

8.Mini-Batch K-均值

Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的樣本而不是整個資料集對群集質心進行更新,這可以使大資料集的更新速度更快,并且可能對統計噪聲更健壯。

...我們建議使用 k-均值聚類的迷你批量優化。與經典批處理算法相比,這降低了計算成本的數量級,同時提供了比線上随機梯度下降更好的解決方案。

—源自:《Web-Scale K-均值聚類》2010

它是通過 MiniBatchKMeans 類實作的,要優化的主配置是“ n _ clusters ”超參數,設定為資料中估計的群集數量。下面列出了完整的示例。

# mini-batch k均值聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MiniBatchKMeans
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = MiniBatchKMeans(n_clusters=2)
# 模型拟合
model.fit(X)
# 為每個示例配置設定一個叢集
yhat = model.predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,會找到與标準 K-均值算法相當的結果。

10 種聚類算法的完整 Python 操作示例

帶有最小批次K均值聚類的聚類資料集的散點圖

9.均值漂移聚類

均值漂移聚類涉及到根據特征空間中的執行個體密度來尋找和調整質心。

對離散資料證明了遞推平均移位程式收斂到最接近駐點的基礎密度函數,進而證明了它在檢測密度模式中的應用。

—源自:《Mean Shift :面向特征空間分析的穩健方法》,2002

它是通過 MeanShift 類實作的,主要配置是“帶寬”超參數。下面列出了完整的示例。

# 均值漂移聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MeanShift
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = MeanShift()
# 模型拟合與聚類預測
yhat = model.fit_predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,可以在資料中找到一組合理的群集。

10 種聚類算法的完整 Python 操作示例

具有均值漂移聚類的聚類資料集散點圖

10.OPTICS

OPTICS 聚類( OPTICS 短于訂購點數以辨別聚類結構)是上述 DBSCAN 的修改版本。

我們為聚類分析引入了一種新的算法,它不會顯式地生成一個資料集的聚類;而是建立表示其基于密度的聚類結構的資料庫的增強排序。此群集排序包含相當于密度聚類的資訊,該資訊對應于範圍廣泛的參數設定。

—源自:《OPTICS :排序點以辨別聚類結構》,1999

它是通過 OPTICS 類實作的,主要配置是“ eps ”和“ min _ samples ”超參數。下面列出了完整的示例。

# optics聚類
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import OPTICS
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = OPTICS(eps=0.8, min_samples=10)
# 模型拟合與聚類預測
yhat = model.fit_predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,我無法在此資料集上獲得合理的結果。

10 種聚類算法的完整 Python 操作示例

使用OPTICS聚類确定具有聚類的資料集的散點圖

11.光譜聚類

光譜聚類是一類通用的聚類方法,取自線性線性代數。

最近在許多領域出現的一個有希望的替代方案是使用聚類的光譜方法。這裡,使用從點之間的距離導出的矩陣的頂部特征向量。

—源自:《關于光譜聚類:分析和算法》,2002年

它是通過 Spectral 聚類類實作的,而主要的 Spectral 聚類是一個由聚類方法組成的通用類,取自線性線性代數。要優化的是“ n _ clusters ”超參數,用于指定資料中的估計群集數量。下面列出了完整的示例。

# spectral clustering
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import SpectralClustering
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = SpectralClustering(n_clusters=2)
# 模型拟合與聚類預測
yhat = model.fit_predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。

在這種情況下,找到了合理的叢集。

10 種聚類算法的完整 Python 操作示例

使用光譜聚類聚類識别出具有聚類的資料集的散點圖

12.高斯混合模型

高斯混合模型總結了一個多變量機率密度函數,顧名思義就是混合了高斯機率分布。它是通過 Gaussian Mixture 類實作的,要優化的主要配置是“ n _ clusters ”超參數,用于指定資料中估計的群集數量。下面列出了完整的示例。

# 高斯混合模型
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.mixture import GaussianMixture
from matplotlib import pyplot
# 定義資料集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定義模型
model = GaussianMixture(n_components=2)
# 模型拟合
model.fit(X)
# 為每個示例配置設定一個叢集
yhat = model.predict(X)
# 檢索唯一群集
clusters = unique(yhat)
# 為每個群集的樣本建立散點圖
for cluster in clusters:
# 擷取此群集的示例的行索引
row_ix = where(yhat == cluster)
# 建立這些樣本的散布
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 繪制散點圖
pyplot.show()      

運作該示例符合訓練資料集上的模型,并預測資料集中每個示例的群集。然後建立一個散點圖,并由其指定的群集着色。在這種情況下,我們可以看到群集被完美地識别。這并不奇怪,因為資料集是作為 Gaussian 的混合生成的。

三.總結

  • 聚類是在特征空間輸入資料中發現自然組的無監督問題。
  • 有許多不同的聚類算法,對于所有資料集沒有單一的最佳方法。
  • 在 scikit-learn 機器學習庫的 Python 中如何實作、适合和使用頂級聚類算法。