技术 | 10个必知的Python聚类算法

今天这篇文章将为大家介绍如何适应和使用python中的顶级聚类算法。

欢迎大家扫描底部微信,加入FinTech社区,攒人脉,求职招聘,提认知!

聚类或聚类分析是一个无监督学习问题。它经常被用作一种数据分析技术,用于发现数据中有趣的模式,例如基于客户行为的客户组。在金融领域中,聚类算法也有很大的用武之地,例如用户投资推荐、银行用户细分等。

针对一类特定的问题有许多聚类算法可供选择,但没有一种适合所有情况的最佳聚类算法。 相反,探索一系列的聚类算法和每个算法的不同配置是一个好的入门。

在本篇文章中,你将了解如何适应和使用python中的顶级聚类算法。

看完本篇文章后,你将知道:

  • 聚类是在输入数据的特征空间中寻找自然群的一个无监督问题。
     
  • 有许多不同的聚类算法,没有一种适合所有数据集的最佳方法。
     
  • 如何在Python中通过scikit-learn库实现、调整和使用顶级聚类算法。
     

那我们开始吧。

聚类

聚类分析是一种无监督的机器学习任务。它包括自动发现数据中的自然分组。 与有监督学习(如预测建模)不同,聚类算法只解释输入数据并在特征空间中找到自然组或聚类。当没有要预测的类时,而是当实例要被划分为自然组时,聚类技术才适用。

聚类可以作为一种数据分析活动来帮助你了解更多关于问题域的信息,即所谓的模式发现或知识发现。

例如:

  • 系统发育树可以看作是人工聚类分析的结果。
     
  • 将正常数据与异常值或异常值分离可被视为一个聚类问题。
     

根据集群的自然行为来划分集群是一个集群问题,被称为市场分割。

聚类也可以作为特征工程的一种类型,其中现有的和新的示例可以映射并标记为属于数据中已标识的一个聚类。

对已识别集群的评估是主观的,可能需要领域专家,尽管确实存在许多特定于集群的量化度量。通常,聚类算法在学术上是在合成数据集上与预先定义的聚类进行比较的,这是一种算法希望发现的。聚类是一种无监督的学习技术,因此很难评价任何给定方法的输出质量。

聚类算法

聚类算法有很多种。许多算法使用特征空间中实例之间的相似度或距离度量来发现密集的观察区域。因此,在使用聚类算法之前缩放数据通常是很好的做法。

聚类分析的所有目标的核心是被聚类的单个对象之间的相似程度(或不同程度)。聚类方法试图根据提供给它的相似性定义对对象进行分组。

因此,聚类分析是一个迭代过程,在这个过程中,对识别出的聚类的主观评价被反馈到算法配置的更改中,直到达到期望的或适当的结果。

sklearn库提供了一套可供选择的不同聚类算法。下面我们列出了10种比较流行的算法:

  • Affinity Propagation
     
  • Agglomerative Clustering
     
  • BIRCH
     
  • DBSCAN
     
  • K-Means
     
  • Mini-Batch K-Means
     
  • Mean Shift
     
  • OPTICS
     
  • Spectral Clustering
     
  • Mixture of Gaussians
     

每种算法都提供了一种不同的方法来应对在数据分类的挑战。

聚类算法示例

我们将回顾如何在scikit -learn中使用10种流行的聚类算法。

这包括一个拟合模型的示例和一个可视化结果的示例。

这些示例旨在将粘贴复制到你自己的项目中,并将这些方法应用于自己的数据。

库安装

首先,让我们安装库。

不要跳过此步骤,因为你需要确保安装了最新版本。 你可以使用pip Python安装程序安装sklearn,如下所示:

sudo pip install scikit-learn

接下来,让我们确认库已安装,并且使用的是最新版本。

# check scikit-learn version

import sklearn

print(sklearn.__version__)

聚类数据集

我们将使用make_classification()函数创建一个测试二进制分类数据集。

数据集将有1000个示例,每个类有两个输入特性和一个集群。很明显,这些聚类是二维的,因此我们可以用散点图绘制数据,并根据不同的聚类为图中的点上色。

下面列出了创建和汇总综合聚类数据集的代码

# synthetic classification dataset

from numpy import where

from sklearn.datasets import make_classification

from matplotlib import pyplot

# define dataset

X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# create scatter plot for samples from each class

for class_value in range(2):

# get row indexes for samples with this class

row_ix = where(y == class_value)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

运行此示例将创建合成群集数据集,然后创建输入数据的散点图,其中的点由类标签(理想群集)着色。

我们可以清楚地看到两组不同的二维数据,希望有一个自动聚类算法能够检测出这些分组。

接下来,我们可以开始查看应用于此数据集的聚类算法的表现好坏。

Affinity Propagation

关联传播包括找到一组最能概括数据的示例。

我们设计了一种称为“亲和传播”的方法,它将数据点对之间的相似性作为输入度量。 在数据点之间交换实值消息,直到一组高质量的示例和相应的集群的出现。

下面列出了完整的示例。

# affinity propagation clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import AffinityPropagation

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = AffinityPropagation(damping=0.9)

# fit the model

model.fit(X)

# assign a cluster to each example

yhat = model.predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

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

在这种情况下,我们并不能取得好的分类结果。

Agglomerative Clustering

聚集聚类包括合并数据点,直到达到所需的集群数量。

它是更广泛的层次聚类方法类别的一部分,你可以在这里了解更多信息:

https://en.wikipedia.org/wiki/Hierarchical_clustering

它是通过聚集聚类实现的,要优化的主要配置是“n_clusters”集合,这是对数据中的聚类数量的估计。

下面列出了完整的示例。

# agglomerative clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import AgglomerativeClustering

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = AgglomerativeClustering(n_clusters=2)

# fit model and predict clusters

yhat = model.fit_predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

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

在这种情况下,可以找到一个合理的分组。

BIRCH

BIRCH Clustering(BIRCH是平衡迭代还原和使用层次结构)包括构造一个树结构,从中提取聚类质心。

BIRCH以增量和动态的方式对传入的多维度量数据点进行聚类,以尝试使用可用资源(即可用内存和时间限制)生成最佳质量的聚类。

Birch类的实现,要调整的主要配置是“threshold”和“n_clusters”超参数,后者提供集群数量的估计。

下面列出了完整的示例。

# birch clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import Birch

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = Birch(threshold=0.01, n_clusters=2)

# fit the model

model.fit(X)

# assign a cluster to each example

yhat = model.predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,我们得到了一个很好的分组。

DBSCAN

DBSCAN聚类(其中DBSCAN是有噪声应用的基于密度的空间聚类的简称)主要是在域中发现高密度区域,并将这些区域周围的特征空间扩展为聚类。

DBSCAN聚类算法,它依赖于基于密度的聚类概念,该概念旨在发现任意形状的聚类。DBSCAN只需要一个输入参数,并支持用户为其确定适当的值

DBSCAN类的实现,要优化的主要配置是“eps”和“min_samples”超参数。

下面列出了完整的示例。

# dbscan clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import DBSCAN

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = DBSCAN(eps=0.30, min_samples=9)

# fit model and predict clusters

yhat = model.fit_predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,我们可以找到一个合理的分组,尽管可能还需要更多的调整。

K-Means

K-Means聚类可能是最为熟知的聚类算法,它主要是将数据点分配给聚类,以尽量减少每个聚类内的方差。

KMeans的实现,要优化的主要配置是“n_clusters”超参数设置为数据中估计的集群数。

下面列出了完整的示例。

# k-means clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import KMeans

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = KMeans(n_clusters=2)

# fit the model

model.fit(X)

# assign a cluster to each example

yhat = model.predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,可以找到一个合理的分组,尽管每个维度中的等方差使该方法不太适合此数据集。

Mini-Batch K-Means

Mini-Batch K-Means是K-Means的一个改进版本,它使用小批量的样本而不是整个数据集来更新聚类质心,这可以使其对于大型数据集更快,并且可能对统计噪声更为稳健。

我们建议使用小批量优化来进行k-均值聚类。与经典的批处理算法相比,这减少了数量级的计算成本,同时产生比在线随机梯度下降更好的解。

Mini-Batch K-means的实现,要优化的主要配置是将“n_clusters”超参数设置为数据中估计的集群数。

下面列出了完整的示例。

# mini-batch k-means clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import MiniBatchKMeans

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = MiniBatchKMeans(n_clusters=2)

# fit the model

model.fit(X)

# assign a cluster to each example

yhat = model.predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,得到了与标准k-均值算法等价的结果。

Mean Shift

均值漂移聚类是根据特征空间中样本的密度来寻找和调整质心。 对于离散数据,递归均值漂移过程收敛到下垫密度函数的最近平稳点,从而证明了它在检测密度模式中的实用性。

它是通过MeanShift类实现的,要优化的主要配置是“带宽”超参数。

下面列出了完整的示例。

# mean shift clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import MeanShift

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = MeanShift()

# fit model and predict clusters

yhat = model.fit_predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,可以在数据中找到一组合理的集群。

OPTICS

OPTICS集群(OPTICS是用来标识集群结构的排序点的缩写)是上述DBSCAN的一个改进版本。

为了进行聚类分析,我们引入了一种新的算法,该算法并不是显式地生成数据集的聚类,而是创建表示其基于密度的聚类结构的数据库的扩充顺序。这个聚类排序包含的信息相当于与一系列参数设置相对应的基于密度的聚类。

OPTICS的实现,主要的优化配置是“eps”和“min_samples”超参数。

下面列出了完整的示例。

# optics clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.cluster import OPTICS

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = OPTICS(eps=0.8, min_samples=10)

# fit model and predict clusters

yhat = model.fit_predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,我们无法在此数据集上获得合理的结果。

Spectral Clustering

谱聚类是从线性代数中提取的一类聚类方法。

最近在许多领域出现的一种有前景的替代方法是使用光谱方法进行聚类。这里,我们使用从点之间的距离导出的矩阵的前几个特征向量。“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

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = SpectralClustering(n_clusters=2)

# fit model and predict clusters

yhat = model.fit_predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在本例中,找到了合理的聚类。

Gaussian Mixture Model

高斯混合模型概括了一个多变量概率密度函数,它的名字是高斯概率分布的混合。

有关模型的详细信息,请参见:

https://en.wikipedia.org/wiki/Mixture_model

它是通过GaussianMixture实现的,要优化的主要配置是“n_clusters”超参数,用于指定数据中估计的集群数。

下面列出了完整的示例。

# gaussian mixture clustering

from numpy import unique

from numpy import where

from sklearn.datasets import make_classification

from sklearn.mixture import GaussianMixture

from matplotlib import pyplot

# define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

# define the model

model = GaussianMixture(n_components=2)

# fit the model

model.fit(X)

# assign a cluster to each example

yhat = model.predict(X)

# retrieve unique clusters

clusters = unique(yhat)

# create scatter plot for samples from each cluster

for cluster in clusters:

# get row indexes for samples with this cluster

row_ix = where(yhat == cluster)

# create scatter of these samples

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show the plot

pyplot.show()

在这种情况下,我们可以看到集群被完美地识别出来。这并不奇怪,因为数据集是高斯混合生成的。