Scikit Learn 聚类方法


在这里,我们将研究 Sklearn 中的聚类方法,这将有助于识别数据样本中的任何相似性。

聚类方法是最有用的无监督 ML 方法之一,用于发现数据样本之间的相似性和关系模式。之后,他们根据特征将这些样本聚类为具有相似性的组。聚类决定了当前未标记数据之间的内在分组,这就是它很重要的原因。

Scikit-learn 库有sklearn.cluster执行未标记数据的聚类,在这个模块下 scikit-leran 有以下聚类方法:

KMeans


该算法计算质心并迭代,直到找到最佳质心。它需要指定集群的数量,这就是为什么它假设它们是已知的。该算法的主要逻辑是通过最小化称为惯性的标准来将数据分离样本聚集在 n 组等方差的组中。算法识别的簇数用‘K’表示。

Scikit-learn有sklearn.cluster.KMeans模块来进行K-Means聚类。在计算聚类中心和惯性值时,名为sample_weight的参数允许sklearn.cluster.KMeans模块给某些样本分配更多的权重。

亲和传播


这个算法是基于不同样本对之间的 "信息传递 "概念,直到收敛,它不要求在运行算法之前指定集群的数量。该算法的时间复杂度为?(?2?),这是它的最大缺点。

Scikit-learn有sklearn.cluster.AffinityPropagation模块来执行Affinity Propagation聚类。

均值漂移


该算法主要发现blobs在光滑的样品密度中。它通过将点移向数据点的最高密度来迭代地将数据点分配给集群。而不是依赖名为的参数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


它代表使用层次结构的平衡迭代减少和聚类。它用于在大型数据集上执行层次聚类。它构建了一棵名为CFTi.e.特征 特征树,对于给定的数据。

CFT 的优点是称为 CF(特征特征)节点的数据节点保存了聚类所需的信息,这进一步防止了将整个输入数据保存在内存中的需要。

Scikit-learn 有sklearn.cluster.Birch模块来执行 BIRCH 聚类。

比较聚类算法


下表将给出 scikit-learn 中聚类算法的比较(基于参数、可扩展性和度量)。

序号算法名称参数可扩展性使用的指标
1K-Means集群数量非常大的 n_samples点之间的距离。
2亲和传播Dampingn_samples 不可扩展图距离
3均值偏移带宽它不能用 n_samples 扩展。点之间的距离。
4光谱聚类簇数n_samples 的中等可扩展性。 n_clusters 的小级别可扩展性。图距离
5层次聚类距离阈值或簇数大 n_samples 大型 n_clusters点之间的距离。
6DBSCAN街区规模非常大的 n_samples 和中等的 n_clusters。最近点距离
7OPTICS最小集群成员非常大的 n_samples 和大 n_clusters。点之间的距离。
8BIRCH阈值,分支因子大 n_samples 大型 n_clusters点之间的欧几里得距离。

Scikit-learn Digit 数据集上的 K-Means 聚类

在这个例子中,我们将在数字数据集上应用 K-means 聚类。该算法将在不使用原始标签信息的情况下识别相似的数字。实现是在 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)