当前位置: 首页 > article >正文

【机器学习】简单易懂的聚类算法K-Means

文章目录

    • 概述
      • 算法原理
      • 算法步骤
      • K-Means++ 初始化
      • 算法局限性
      • 应用场景
      • 评估指标
    • scikit-learn 实现k-means算法
      • 步骤 1: 导入必要的库
      • 步骤 2: 准备数据集
      • 步骤 3: 文本向量化
      • 步骤 4: 应用K-means聚类
      • 步骤 5: 分析结果
      • 步骤 6: 评估模型
    • 相关文献

概述

K-Means 是一种广泛使用的聚类算法,其目的是将数据集分成 K 个聚类,其中每个数据点都属于最近的均值(质心)所代表的聚类。K-Means 算法的执行过程简单明了,但也有一些局限性。下面详细介绍 K-Means 算法的原理和步骤:

算法原理

K-Means 算法通过迭代的方式寻找数据的聚类中心,使得每个数据点到其聚类中心的距离之和最小。这里的“距离”通常是指欧几里得距离,但也可以使用其他距离度量。

算法步骤

  1. 选择初始质心

    • 随机选择 K 个数据点作为初始的聚类中心(质心)。
  2. 分配数据点到最近的质心

    • 对于数据集中的每个点,计算其与各个质心的距离,并将其分配给最近的质心,形成 K 个聚类。
  3. 重新计算质心

    • 对于每个聚类,计算所有属于该聚类的数据点的均值,并更新该聚类的质心。
  4. 重复步骤 2 和 3

    • 直到满足某个停止条件,如质心的变化小于某个阈值、达到预设的迭代次数,或者数据点的分配不再发生变化。
  5. 输出聚类结果

    • 算法结束后,每个数据点都被分配到一个聚类中,每个聚类由其质心代表。

K-Means++ 初始化

K-Means++ 是一种改进的初始化方法,用于选择更好的初始质心,从而提高聚类的质量:

  1. 从数据集中随机选择第一个质心。
  2. 对于数据集中的每个点,计算其到已选择的最近质心的距离。
  3. 选择下一个质心,其概率与到最近质心的距离的平方成正比。

算法局限性

  • 对初始质心敏感:不同的初始质心可能导致不同的聚类结果。
  • 对异常值敏感:异常值可以严重影响聚类中心的位置。
  • 假设聚类是凸形的:K-Means 假设聚类的形状是凸形的,且大小相似,这在现实世界的数据集中并不总是成立。
  • 需要预先指定 K 值:K-Means 需要用户预先指定聚类的数量 K,这在实际应用中可能难以确定。

应用场景

尽管存在局限性,K-Means 由于其简单和高效,在许多领域都有广泛的应用,包括市场细分、社交网络分析、图像分割、文档聚类等。

评估指标

评估 K-Means 聚类效果的常用指标包括:

  • Within-Cluster Sum of Squares (WCSS):簇内误差平方和,即每个点到其质心的距离的平方和。
  • 轮廓系数 (Silhouette Coefficient):衡量聚类的紧密度和分离度。

K-Means 算法因其直观和易于实现而受到欢迎,但在使用时需要考虑其局限性,并可能需要尝试不同的 K 值和初始化方法以获得最佳结果。

scikit-learn 实现k-means算法

在Python中使用scikit-learn库进行文本聚类是一个常见的任务,尤其是当你想要根据某些特征(如词汇频率)来自动组织文档时。下面是如何使用K-means算法通过scikit-learn对文本数据进行聚类的一个示例。

首先,确保你的环境中已安装了scikit-learn。如果没有安装,可以通过运行pip install -U scikit-learn来安装。

步骤 1: 导入必要的库

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd

步骤 2: 准备数据集

这里我们创建一个简单的文本数据列表作为示例。在实际应用中,这可以是任何文本数据源,比如文件、数据库或API调用的结果。

documents = [
    "I love programming in Python",
    "Python is the best for data science",
    "Java is also a good programming language",
    "JavaScript is widely used for web development",
    "Web developers often use HTML, CSS, and JavaScript"
]

步骤 3: 文本向量化

使用TF-IDF(Term Frequency-Inverse Document Frequency)方法将文本转换为数值型数据,这是机器学习模型可以处理的形式。

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)

步骤 4: 应用K-means聚类

选择合适的聚类数量(例如,这里假设我们想要找到3个不同的群组)。然后训练模型并预测每个文档所属的类别。

num_clusters = 3
model = KMeans(n_clusters=num_clusters, init='k-means++', max_iter=100, n_init=10)
model.fit(X)

步骤 5: 分析结果

查看每个文档被分配到哪个集群,以及这些集群的中心点是什么。

order_centroids = model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names_out()

for i in range(num_clusters):
    print(f"Cluster {i}:")
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind])
    print()

步骤 6: 评估模型

可以使用轮廓系数(Silhouette Coefficient)来评估聚类的质量。值范围从-1到1,值越大表示聚类效果越好。

predictions = model.predict(X)
print("Silhouette Score: ", silhouette_score(X, predictions))

以上就是使用scikit-learn中的K-means进行文本聚类的基本流程。这个过程包括准备数据、向量化文本、应用聚类算法、分析结果和评估模型性能。希望这段代码对你有所帮助!如果你有任何具体的问题或者需要进一步的帮助,请随时提问。

相关文献

【机器学习】机器学习入门篇


http://www.kler.cn/news/359476.html

相关文章:

  • 每日回顾:简单用C写 选择排序、堆排序
  • 基于Android Studio购物商城app+web端实现(前后端分离)一
  • Thread类的基本用用法
  • 基于Multisim旗升降自动控制系统电路(含仿真和报告)
  • python全栈开发《47.索引与切片之字符串》
  • Django-应用及分布式路由
  • 深入解析JavaScript中的箭头函数及其在React中的应用(箭头函数与传统函数的区别、如何在不同上下文中使用箭头函数)
  • 【前端】如何制作自己的网站(7)
  • echarts设置x轴中文垂直显示,x轴滚动条
  • 随机数生成
  • React 学习计划
  • Modelsim:LPDDR5仿真(含美光仿真模型官方svvcs代码)
  • (linux驱动学习 - 12). IIC 驱动实验
  • .net framework 3.5sp1安装错误进度条不动怎么办
  • 【Python技术】利用akshare定时获取股票实时价,低于5日线钉钉通知报警
  • “第15代”英特尔CPU来袭!命名全面变更,速览
  • 如何删除Maven
  • 一文读懂什么是数据即产品(Data as a Product,DaaP)
  • 程序员如何精进
  • k8s-pod详解