首頁  >  文章  >  後端開發  >  十種聚類演算法的完整 Python 操作範例

十種聚類演算法的完整 Python 操作範例

王林
王林轉載
2023-04-13 09:40:101177瀏覽

十種聚類演算法的完整 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()

執行此範例將建立合成的聚類資料集,然後建立輸入資料的散佈圖,其中點由類別標籤(理想化的叢集)著色。我們可以清楚地看到兩個不同的資料組在兩個維度,並希望一個自動的聚類演算法可以偵測這些分組。

十種聚類演算法的完整 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()

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

十種聚類演算法的完整 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()

執行此範例符合訓練資料集上的模型,並預測資料集中每個範例的群集。然後建立一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個合理的分組。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。

十種聚類演算法的完整 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-均值算法相当的结果。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。

十種聚類演算法的完整 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()

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。

在这种情况下,找到了合理的集群。

十種聚類演算法的完整 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 的混合生成的。

十種聚類演算法的完整 Python 操作範例

使用高斯混合聚类识别出具有聚类的数据集的散点图

三.总结

在本教程中,您发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了:

  • 聚类是在特征空间输入数据中发现自然组的无监督问题。
  • 有许多不同的聚类算法,对于所有数据集没有单一的最佳方法。
  • 在 scikit-learn 机器学习库的 Python 中如何实现、适合和使用顶级聚类算法。

以上是十種聚類演算法的完整 Python 操作範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除