- Scikit Learn 教程
- Scikit Learn - 首页
- Scikit Learn - 简介
- Scikit Learn - 建模过程
- Scikit Learn - 数据表示
- Scikit Learn - 估计器 API
- Scikit Learn - 约定
- Scikit Learn - 线性建模
- Scikit Learn - 扩展线性建模
- 随机梯度下降
- Scikit Learn - 支持向量机
- Scikit Learn - 异常检测
- Scikit Learn - K 近邻
- Scikit Learn - KNN 学习
- 朴素贝叶斯分类
- Scikit Learn - 决策树
- 随机决策树
- Scikit Learn - 集成方法
- Scikit Learn - 聚类方法
- 聚类性能评估
- 使用 PCA 进行降维
- Scikit Learn 有用资源
- Scikit Learn - 快速指南
- Scikit Learn - 有用资源
- Scikit Learn - 讨论
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 聚类学习到的聚类中心的图像。
接下来,下面的 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)