为了账号安全,请及时绑定邮箱和手机立即绑定

KMeans聚类算法详解,一步步教你如何分组数据点📈🔍

你好,数据爱好者们!👋

当你深入无监督学习的世界时,你会遇到一些任务,目标是找出没有明确标签的数据中的隐藏模式。这类任务中最常用的技术是聚类。今天,让我们来看看K-Means聚类,并通过一个实际的Python例子来展示它!🚀

此处省略内容

无监督学习到底是什么?🤔

无监督学习是一种机器学习方法,其中模型接收的数据没有任何标签。目标是发现数据中的模式、结构或关系。模型尝试从输入数据中学习,而不需要任何关于预期输出的指示。

例如聚类、异常检测和降维。

此处省略部分内容

你知道什么是分类吗? 🧑‍🤝‍🧑

聚类 是一种无监督学习技术,它根据数据点的相似性来分组数据。最常见的聚类算法是 K-Means,其中 "K" 代表你希望将数据分成的簇的数量。

如图所示,这是一张图片,你可以通过链接查看:图片描述

K-Means 算法 📝

注:K-Means 算法步骤如下

  1. 初始化K个质心:从数据中随机选择K个点作为初始聚类中心。
  2. 将数据点分配给最近的簇:每个数据点被分配到最近的质心,从而形成K个聚类。
  3. 更新质心:分配后,根据每个聚类中数据点的平均位置计算新的质心。
  4. 重复:重复步骤2和3,直到质心不再变动或达到稳定状态。

此处为星号占位符(
(或重复使用 asterisks:
))

我们现在来深入代码 💻

这里是一个用Python实现K-Means聚类的示例。我将一步步地向你解释,解释每个步骤的具体内容!

此处为空

第一步:导入 🧑‍🔬

让我们开始吧!

    import pandas 
    import numpy 
    import matplotlib.pyplot as plt
    import seaborn as sns
    from warnings import filterwarnings
    filterwarnings('ignore')

全屏 退出全屏

我们首先从引入必要的库开始。

  • matplotlibseaborn 用于可视化数据。
  • pandasnumpy 处理数据。
  • filterwarnings 用于过滤代码中的警告。

……

下一步:生成合成数据💡

    首先,我们从 `sklearn.datasets` 导入 `make_blobs` 函数  # 导入函数
    x, y = make_blobs(n_samples=1000, centers=3, n_features=2)  # 生成聚类数据
    plt.scatter(x[:, 0], x[:, 1], c=y)  # 绘制散点图

进入全屏 退出全屏

图片说明

在这里,我们生成一个合成的数据集,包含1000个样本3个聚类中心

  • make_blobs 用于生成具有可分离聚类的二维数据。
  • plt.scatter 用于帮助我们可视化数据点,其中颜色表示实际的聚类。

输出:
散点图显示了三个明显的群体。

等等

第三步:标准化数据 🔄

    从 sklearn.preprocessing 导入 StandardScaler 作为 scaler
    scaler = StandardScaler()
    从 sklearn.model_selection 导入 train_test_split 作为 train_test_split
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
    x_train_scaled = scaler.fit_transform(x_train)
    x_test_scaled = scaler.transform(x_test)

进入全屏,退出全屏

  • 在K-Means中,标准化至关重要,因为它确保所有特征具有相似的度量。
  • train_test_split将数据划分成训练集和测试集。
  • StandardScaler将数据标准化到同一尺度。

    • *

步骤4:肘形法找到最佳K值 🧩

from sklearn.cluster import KMeans
创建一个空列表 wscc

当 k 的值从 1 到 10 遍历时:
    创建一个 KMeans 模型,设置聚类数为 k,初始化方式为 'k-means++'
    使用标准化的训练数据 x_train_scaled 和标签 y_train 来拟合模型
    计算并追加模型的惯性值到 wscc 列表

切换到全屏模式,退出全屏

首先,我们使用肘法来确定最佳的K值。惯性值衡量数据拟合到聚类中的程度。

  • KMeans 对不同 K 值(从 1 到 10)对数据进行聚类。
  • 我们将惯性值存储于列表 wscc 中,以评估“拐点”。

输出结果 (wscc):

    [1499.99, 594.74, 65.69, 58.75, 51.76, 41.96, 37.2, 34.92, 29.05, 27.66]

全屏模式 全屏退出模式


第五步:我们来画个肘曲线吧 📉

    plt.plot(range(1, 11), wscc)
    plt.xticks(range(1, 11))
    plt.xlabel('聚类的数量')
    plt.ylabel('WCSS(组内平方和)')

全屏模式,退出全屏

图片

肘形曲线帮助我们找到最佳的K。

  • 随着 K 的增加,惯性减少得越来越多。
  • 转折点是惯性减少开始变慢的地方,这表明 K 值已经找到了最优点。

    • *

第六步:找到K值的拐点

    从kneed导入KneeLocator()
    kl = KneeLocator(range(1, 11), wscc, curve='convex', direction='decreasing')
    kl.elbow

进入全屏 退出全屏

使用 KneeLocator,我们能找到曲线的拐点。

根据惯性曲线,肘部 方法帮助我们找到最优的 K 值。

显示结果:

    3

进入全屏模式,退出全屏模式

所以,最佳的聚类数量就是3,太棒了!🎉


第七步:轮廓分数评估 🌟

    从 sklearn.metrics 导入 silhouette_score
    轮廓系数 = []

    for k in range(2, 11):
        kmean = KMeans(n_clusters=k, init='k-means++')
        kmean.fit(x_train_scaled)
        得分 = silhouette_score(x_train_scaled, kmean.labels_)
        轮廓系数.append(得分)

    plt.plot(range(2, 11), 轮廓系数)
    plt.xticks(range(2, 11))
    plt.xlabel('聚类数')
    plt.ylabel('轮廓系数')

切换到全屏,退出全屏

图像描述
轮廓得分衡量的是一个聚类内数据点与其它聚类中数据点的接近度,越接近代表聚类效果越好。

  • 得分越高说明聚类越分明。

    • *
总结:动手试试 K-Means!让我们一起探索 K-Means 的力量吧! 🚀
  • K-Means算法 是一种将相似的数据点分组到K个簇中的强大技术。
  • 肘法轮廓系数 是确定最优K的有效方法。
  • 您可以轻松地使用scikit-learn实现K-Means算法、可视化结果,并评估聚类效果。

所以,下次当你遇到未标记的数据时,不妨试试看K-Means聚类,看看它是否适合你的数据集!😎


开心聚会! 🎉


关于我:
🔗领英
💻GitHub

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消