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 聚类学习到的聚类中心的图像。

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)
广告