- 使用 Python 进行机器学习
- 家
- 基本
- Python生态系统
- 机器学习方法
- ML 项目的数据加载
- 通过统计了解数据
- 通过可视化了解数据
- 准备数据
- 数据特征选择
- 机器学习算法 - 分类
- 介绍
- 逻辑回归
- 支持向量机(SVM)
- 决策树
- 朴素贝叶斯
- 随机森林
- 机器学习算法 - 回归
- 随机森林
- 线性回归
- 机器学习算法 - 聚类
- 概述
- K均值算法
- 均值平移算法
- 层次聚类
- ML 算法 - KNN 算法
- 寻找最近的邻居
- 性能指标
- 自动工作流程
- 提高机器学习模型的性能
- 提高 ML 模型的性能(续……)
- 使用 Python 进行机器学习 - 资源
- 使用 Python 进行机器学习 - 快速指南
- 使用 Python 进行机器学习 - 资源
- 使用 Python 进行机器学习 - 讨论
聚类算法 - K-means 算法
K-Means 算法简介
K 均值聚类算法计算质心并迭代,直到找到最佳质心。它假设簇的数量已知。也称为平面聚类算法。通过算法从数据中识别出的簇的数量由 K-means 中的“K”表示。
在该算法中,数据点被分配到一个簇中,使得数据点与质心之间的距离平方和最小。应当理解,簇内较少的变化将导致同一簇内更相似的数据点。
K-Means 算法的工作原理
我们可以借助以下步骤了解 K-Means 聚类算法的工作原理 -
步骤 1 - 首先,我们需要指定该算法需要生成的簇数 K。
步骤 2 - 接下来,随机选择 K 个数据点并将每个数据点分配给一个簇。简单来说,就是根据数据点的数量对数据进行分类。
步骤 3 - 现在它将计算簇质心。
步骤 4 - 接下来,继续迭代以下操作,直到找到最佳质心,即将数据点分配给不再发生变化的簇 -
4.1 - 首先,计算数据点和质心之间的距离平方和。
4.2 - 现在,我们必须将每个数据点分配给比其他簇(质心)更近的簇。
4.3 - 最后通过取该簇所有数据点的平均值来计算簇的质心。
K-means 遵循期望最大化方法来解决问题。期望步骤用于将数据点分配到最近的簇,最大化步骤用于计算每个簇的质心。
在使用 K 均值算法时,我们需要注意以下事项 -
在使用包括 K-Means 在内的聚类算法时,建议对数据进行标准化,因为此类算法使用基于距离的测量来确定数据点之间的相似性。
由于 K 均值的迭代性质和质心的随机初始化,K 均值可能会陷入局部最优,并且可能不会收敛到全局最优。这就是为什么建议使用不同的质心初始化。
Python 中的实现
以下两个实现 K-Means 聚类算法的示例将帮助我们更好地理解它 -
实施例1
这是一个了解 k-means 工作原理的简单示例。在此示例中,我们将首先生成包含 4 个不同 blob 的 2D 数据集,然后应用 k-means 算法来查看结果。
首先,我们将从导入必要的包开始 -
%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns; sns.set() import numpy as np from sklearn.cluster import KMeans
以下代码将生成包含四个斑点的 2D -
from sklearn.datasets.samples_generator import make_blobs X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)
接下来,以下代码将帮助我们可视化数据集 -
plt.scatter(X[:, 0], X[:, 1], s=20); plt.show()
接下来,创建一个 KMeans 对象并提供聚类数量,训练模型并进行预测,如下所示 -
kmeans = KMeans(n_clusters=4) kmeans.fit(X) y_kmeans = kmeans.predict(X)
现在,借助以下代码,我们可以绘制并可视化由 k-means Python 估计器选取的簇中心 -
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=20, cmap='summer') centers = kmeans.cluster_centers_ plt.scatter(centers[:, 0], centers[:, 1], c='blue', s=100, alpha=0.9); plt.show()
实施例2
让我们转向另一个示例,其中我们将在简单数字数据集上应用 K 均值聚类。K-means 将尝试在不使用原始标签信息的情况下识别相似的数字。
首先,我们将从导入必要的包开始 -
%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns; sns.set() import numpy as np from sklearn.cluster import KMeans
接下来,从 sklearn 加载数字数据集并为其创建一个对象。我们还可以找到该数据集中的行数和列数,如下所示 -
from sklearn.datasets import load_digits digits = load_digits() digits.data.shape
输出
(1797, 64)
上面的输出显示该数据集有 1797 个样本,具有 64 个特征。
我们可以像上面示例 1 中那样执行聚类 -
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 均值学习的聚类中心。
以下代码行将把学习到的集群标签与其中找到的真实标签进行匹配 -
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
从上面的输出可以看出,准确率在80%左右。
的优点和缺点
优点
以下是 K-Means 聚类算法的一些优点 -
它非常容易理解和实施。
如果我们有大量变量,K-means 会比层次聚类更快。
在重新计算质心时,实例可以更改集群。
与层次聚类相比,K-means 可以形成更紧密的聚类。
缺点
以下是 K 均值聚类算法的一些缺点 -
预测簇的数量,即 k 的值有点困难。
输出受到初始输入(例如簇数量(k 值))的强烈影响。
数据的顺序将对最终输出产生很大影响。
它对重新缩放非常敏感。如果我们通过归一化或标准化的方式重新调整数据,那么输出将完全改变。最终输出。
如果簇具有复杂的几何形状,则不利于进行聚类工作。
K-Means聚类算法的应用
聚类分析的主要目标是 -
从我们正在使用的数据中获得有意义的直觉。
聚类然后预测将为不同子组构建不同模型的位置。
为了实现上述目标,K-means 聚类表现得足够好。它可用于以下应用程序 -
市场细分
文档聚类
图像分割
图像压缩
客户细分
分析动态数据趋势