使用 K-means 算法进行豆瓣读书数据的文本聚类分析

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:机器学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:使用 K-means 算法进行豆瓣读书数据的文本聚类分析

文章目录

    • 一、K-means 算法知识讲解
      • 1. K-means 算法原理
      • 2. K-means 算法步骤
      • 3. K-means 算法的优缺点
      • 4. K-means 算法的应用场景
      • 5. K-means 算法的改进
    • 二、数据准备
    • 三、文本向量化
    • 四、K-means 聚类
    • 五、提取关键词
    • 六、可视化聚类结果
    • 七、注意事项
    • 八、结论

在这里插入图片描述

  在数据科学和自然语言处理领域,文本聚类是一种重要的技术,它可以帮助我们从大量文本数据中提取有价值的信息。本文将详细介绍如何使用 K-means 算法对豆瓣读书数据进行聚类分析,并提取每个簇的关键词。我们将通过一个简单的 Python 示例代码来演示整个过程。

一、K-means 算法知识讲解

  K-means 算法是一种广泛使用的聚类算法,旨在将数据集划分为 K 个簇,使得同一簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。以下是对 K-means 算法的详细讲解,包括其原理、步骤、优缺点以及应用场景。

1. K-means 算法原理

K-means 算法的核心思想是通过迭代优化簇的划分,使得每个簇内的数据点到簇中心的距离最小化。具体来说,K-means 的目标是最小化以下目标函数:

J = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 J = \sum_{i=1}^{K} \sum_{x \in C_i} ||x - \mu_i||^2 J=i=1KxCi∣∣xμi2

其中:

  • K K K 是簇的数量。
  • C i C_i Ci 是第 i i i 个簇。
  • x x x 是数据点。
  • μ i \mu_i μi 是第 i i i 个簇的中心(均值)。

2. K-means 算法步骤

K-means 算法通常包括以下几个步骤:

  1. 初始化:随机选择 K 个数据点作为初始簇中心。
  2. 分配步骤:将每个数据点分配到离其最近的簇中心,形成 K 个簇。
  3. 更新步骤:计算每个簇的新中心,即簇内所有数据点的均值。
  4. 迭代:重复执行分配步骤和更新步骤,直到簇中心不再变化或达到预设的迭代次数。

3. K-means 算法的优缺点

优点:

  • 简单易懂:K-means 算法易于实现和理解,适合初学者。
  • 高效性:对于大规模数据集,K-means 算法的计算效率较高,尤其是在使用优化的实现时。
  • 可扩展性:可以处理大规模数据集,适合于在线学习和增量学习。

缺点:

  • 需要预设 K 值:用户需要事先指定簇的数量 K,这在实际应用中可能不容易确定。
  • 对初始值敏感:不同的初始簇中心可能导致不同的聚类结果,容易陷入局部最优解。
  • 对噪声和离群点敏感:K-means 对于噪声和离群点非常敏感,可能会影响聚类效果。
  • 假设簇是球形的:K-means 假设簇是球形且大小相似,这在某些数据集上可能不成立。

4. K-means 算法的应用场景

K-means 算法广泛应用于多个领域,包括但不限于:

  • 市场细分:根据消费者的购买行为将市场划分为不同的细分市场,以便制定针对性的营销策略。
  • 图像压缩:通过将图像中的颜色聚类,减少颜色数量,从而实现图像压缩。
  • 文档聚类:对文本数据进行聚类,以便于信息检索和推荐系统。
  • 社交网络分析:分析用户行为,将用户分为不同的群体,以便进行个性化推荐。

5. K-means 算法的改进

为了克服 K-means 算法的一些缺点,研究人员提出了多种改进方法,例如:

  • K-means++:通过改进初始簇中心的选择,减少对初始值的敏感性,提高聚类效果。
  • 模糊 K-means:允许数据点属于多个簇,以解决硬聚类的局限性。
  • 层次 K-means:结合层次聚类和 K-means 的优点,逐步合并或分裂簇。

二、数据准备

  首先,我们需要获取豆瓣读书的数据。假设我们已经有一个包含书名和描述的 DataFrame。为了方便演示,我们将创建一个示例 DataFrame,如下所示:

data = {'title': ['书名1', '书名2', '书名3', '书名4', '书名5'],'description': ['这是一本关于机器学习的书。','这本书讲述了深度学习的基础。','一本关于数据科学的书籍。','这本书介绍了人工智能的应用。','一本关于统计学的书。']
}
df = pd.DataFrame(data)

在实际应用中,你可以从豆瓣的 API 或爬虫获取更丰富的数据。

三、文本向量化

  文本数据需要转换为数值形式,以便进行聚类分析。我们可以使用 TF-IDF(Term Frequency-Inverse Document Frequency)方法来实现这一点。TF-IDF 是一种常用的文本向量化技术,它可以有效地表示文本的重要性。

在 Python 中,我们可以使用 sklearn 库中的 TfidfVectorizer 来实现:

from sklearn.feature_extraction.text import TfidfVectorizer
import nltk
from nltk.corpus import stopwords# 确保下载了停用词
nltk.download('stopwords')stop_words = set(stopwords.words('chinese'))  # 中文停用词
vectorizer = TfidfVectorizer(stop_words=stop_words)
X = vectorizer.fit_transform(df['description'])

在这里,我们使用了中文的停用词,以避免在向量化过程中引入无意义的词汇。

四、K-means 聚类

  接下来,我们将应用 K-means 算法进行聚类。K-means 是一种常用的聚类算法,它通过迭代的方式将数据分为 K 个簇。我们需要设定簇的数量 num_clusters,并使用 KMeans 类进行聚类:

from sklearn.cluster import KMeansnum_clusters = 2  # 设定簇的数量
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(X)

在这里,我们将数据分为两个簇。你可以根据数据的特点调整这个参数。

五、提取关键词

  聚类完成后,我们需要从每个簇中提取关键词,以便更好地理解每个簇的主题。我们可以通过获取每个簇的中心点,并提取最重要的特征来实现这一点:

def get_top_keywords(cluster_centers, vectorizer, n_words=5):order_centroids = cluster_centers.argsort()[:, ::-1]terms = vectorizer.get_feature_names_out()keywords = []for i in range(cluster_centers.shape[0]):top_keywords = [terms[ind] for ind in order_centroids[i, :n_words]]keywords.append(top_keywords)return keywords# 获取每个簇的关键词
keywords = get_top_keywords(kmeans.cluster_centers_, vectorizer)
for i, cluster_keywords in enumerate(keywords):print(f"Cluster {i}: {', '.join(cluster_keywords)}")

通过上述代码,我们可以输出每个簇的关键词,帮助我们理解每个簇的主题。

六、可视化聚类结果

  最后,我们可以使用 PCA(主成分分析)对聚类结果进行可视化,以便更直观地展示聚类效果:

import matplotlib.pyplot as plt
from sklearn.decomposition import PCApca = PCA(n_components=2)
X_reduced = pca.fit_transform(X.toarray())
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=kmeans.labels_)
plt.title('K-means Clustering of Douban Books')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.show()

通过散点图,我们可以看到不同簇的分布情况,从而更好地理解聚类的效果。

七、注意事项

  1. 库的安装:确保安装所需的库,包括 pandas, sklearn, nltk, matplotlib
  2. 数据集大小:根据你的数据集大小和特征,调整 num_clusters 的值,以获得更好的聚类效果。
  3. 中文处理:处理中文文本时,可能需要使用更复杂的分词工具(如 jieba)来进行分词,以提高向量化的效果。

八、结论

  通过以上步骤,我们成功地使用 K-means 算法对豆瓣读书数据进行了文本聚类分析,并提取了每个簇的关键词。这种方法不仅可以帮助我们理解文本数据的结构,还可以为后续的分析和推荐系统提供基础。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django5 2024全栈开发指南(二):Django项目配置详解

目录 一、基本配置信息二、资源文件配置2.1 资源路由——STATIC_URL2.2 资源集合——STATICFILES_DIRS2.3 资源部署——STATIC_ROOT2.2.4 媒体资源——MEDIA 三、模板配置四、数据库配置4.1 mysqlclient连接MySQL4.2 pymysql连接MySQL4.3 多个数据库的连接方式4.4 使用配置文件…

数据结构-二叉搜索树(Java语言)

目录 1.概念 2.查找search 3.插入insert ​编辑4.删除remove(难点) 5.性能分析 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 : 1.若它的左子树不为空,则左子树上所有节点的值都…

学习笔记:黑马程序员JavaWeb开发教程(2024.11.18)

9.8 Mybatis-基础操作-查询(条件查询) 需要模糊查询,根据要求,我们需要在关键词前后都加上%,但是我们不能使用‘%#{内容}%’的形式,因为#{内容}最终会变成?,而?不能放在‘’之中&#xff…

数据分析-48-时间序列变点检测之在线实时数据的CPD

文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度: 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

C#.Net筑基-模式匹配汇总

01、模式匹配概述 从C#7开始支持的 模式匹配 语法(糖,挺甜),可非常灵活的对数据进行条件匹配和提取,经过多个版本的完善,已经非常强大了。 C# 支持多种模式,包括声明、类型、常量、关系、属性…

Python蓝桥杯刷题1

1.确定字符串是否包含唯一字符 题解:调用count函数计算每一个字符出现的次数,如果不等于1就输出no,并且结束循环,如果等于1就一直循环直到计算到最后一个字符,若最后一个字符也满足条件,则输出yes import…

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框(ToolTip)功能…

计算机编程中的事件驱动编程模型及其在构建响应式用户界面中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机编程中的事件驱动编程模型及其在构建响应式用户界面中的应用 计算机编程中的事件驱动编程模型及其在构建响应式用户界面中…

ROS第九梯:ROS+VSCode+Python+C++自定义消息发布和订阅

首先,Python版本的ROS项目和C++版本的ROS项目前期创建功能包的步骤基本一致,具体可参考第二章。 费一步:新建msg文件 在功能包(data_input)目录下创建一个msg文件夹,并在msg文件夹下创建一个名为Box的msg文件,具体如下图所示: 该msg文件为一个用于描述3D Box的文件,…

selenium元素定位---元素点击交互异常解决方法

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exc…

Front Panel Window Bounds 与 Front Panel Window Bounds 的区别与应用

在LabVIEW中,Front Panel Window Bounds 和 Front Panel WindowBounds 是两个不同的属性节点,用于描述前面板窗口的位置和大小。它们的区别主要体现在它们表示的是窗口的不同部分,具体如下: 1 Window Bounds:调整整个…

H.265流媒体播放器EasyPlayer.js播放器出现加载视频等待画面时长过长的原因排查

在数字媒体时代,用户体验是衡量播放器性能的关键指标之一。EasyPlayer.js网页web无插件播放器作为一款流行的Web视频播放器,其加载速度和响应时间直接影响着用户的观看体验。 1、问题描述 加载视频等待画面时长过长。 2、可能的原因: 检查下…

计算机网络-MSTP基础实验一(单域多实例)

前面我们已经大致了解了MSTP的基本概念和工作原理,但是我自己也觉得MSTP的理论很复杂不结合实验是很难搞懂的,今天来做一个配套的小实验以及一些配置命令。 一、网络拓扑 单域多实例拓扑 基本需求:SW1为VLAN10的网关,SW2为VLAN20的…

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

【langchain4j】AIservices能够实现更加灵活的chain

文章目录 AI service介绍如何工作的AiServices提供的能力支持的返回形式 简单的例子:接收用户消息,并按规定返回接收单个变量接收更多动态变量 advanced RAGChaining multiple AI Services:多个AiSerives合并到一起相关教程:[Lang…

【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)

详细程序逻辑过程 初始化物品栏: 在 Awake 方法中,通过标签找到提示框和信息面板。 循环生成10个背包格子,并为每个格子设置图标和名称。 为每个格子添加 UInterMaager232 脚本,以便处理交互事件。 关闭提示框和信息面板&#…

同步互斥相关习题10道 附详解

PV操作 2016 某系统允许最多10个进程同时读文件F,当同时读文件F的进程不满10个时,欲读该文件的其他文件可立即读,当已有10个进程在读文件F时读,其他欲读文件F的进程必须等待,直至有进程读完后退出方可去读 在实现管…

Postman之数据提取

Postman之数据提取 1. 提取请求头\request中的数据2. 提取响应消息\response中的数据3. 通过正在表达式提取4. 提取cookies数据 本文主要讲解利用pm对象对数据进行提取操作,虽然postman工具的页面上也提供了一部分的例子,但是实际使用时不是很全面&#…

【专题】数据库原理与应用之故障恢复

1. 数据库故障恢复概述 数据库的可恢复性: DBMS能把数据库从被破坏、不正确的状态、恢复到最近一个正确的状态。 恢复管理任务的种类: 一是在未发生故障而系统正常运行时,采取一些必要措施为恢复工作打基础。 二是在发生故障后进行恢复处…