使用 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 KMeans

num_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 PCA

pca = 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知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32完全学习——F407ZGT6点亮LED

一、寄存器描述 我们想要点亮LED,无非就是对于寄存器的一些设置,主要分为两步,首先是需要打开相应GPIO的时钟,这是因为STM32在上电后,每个外设的时钟默认都是关闭的,需要我们手动打开。其次就是对GPIO的一…

Dubbo RPC线程模型

消费端线程模型,提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程…

Python酷库之旅-第三方库Pandas(225)

目录 一、用法精讲 1056、pandas.PeriodIndex.dayofweek属性 1056-1、语法 1056-2、参数 1056-3、功能 1056-4、返回值 1056-5、说明 1056-6、用法 1056-6-1、数据准备 1056-6-2、代码示例 1056-6-3、结果输出 1057、pandas.PeriodIndex.day_of_week属性 1057-1、…

商业物联网详细指南:优势与挑战

物联网是信息技术行业最具前景的领域之一。为什么它如此热门呢?原因在于全球连接性。设备可以像人群一样相互协作。正如我们所知,协作能显著提高生产力。 物联网对普通用户和企业都有益处。许多日常流程可以通过传感器、扫描仪、摄像头和其他设备实现自…

Spring Boot汽车资讯:科技与汽车的新融合

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足,创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

vlan之间的通信(三层交换机)

拓补图&#xff1a; 【实验步骤】 LSW1配置&#xff1a; The device is running! <Huawei> <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]un in e Info: Information center is disabled. [Huawei]sys maluoying [maluoying]vla…

Redis作为分布式锁,得会避坑

日常开发中&#xff0c;经常会碰到秒杀抢购等业务场景。为了避免并发请求造成的库存超卖等问题&#xff0c;我们一般会用到Redis分布式锁。但是使用Redis分布式锁之前要知道有哪些坑是需要我们避过去的。 1. 非原子操作&#xff08;setnx expire&#xff09; 一说到实现Redis…

ETH钱包地址如何获取 如何购买比特币

首先我们要先注册一个交易所 Gate.io&#xff08;推荐&#xff09;: 点我注册 1、注册很简单&#xff0c;通过手机号就可以进行注册了。 2、获取ETH钱包地址 注册好之后&#xff0c;如图所示&#xff0c;点击“统一账户” 3、通过搜索栏搜索ETH&#xff0c;如下图所示 4、点…

基于Python+Django的农业害虫识别系统设计和实现(源码+论文+部署讲解等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringB…

Python多线程爬虫入门:让你的爬虫跑得更快

一、前言 在互联网时代&#xff0c;数据是最有价值的资源之一。而网页爬虫是获取数据的一种非常重要的工具。在这篇文章中&#xff0c;我们将学习如何用 Python 编写一个多线程网页爬虫&#xff0c;适合小白快速上手&#xff01; 二、多线程进程 单线程串行&#xff1a;一步…

使用Web Speech API实现语音识别与合成技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Speech API实现语音识别与合成技术 使用Web Speech API实现语音识别与合成技术 使用Web Speech API实现语音识别与合成技…

NavVis VLX3的精度怎么去进行验证?【上海沪敖3D】

01、精度评价现状 三维捕捉行业还没有建立一个用于估算或验证移动激光扫描系统精度的统一标准。因此&#xff0c;需要高精度交付成果的专业人士很难相信设备所标注的精度规格&#xff0c;也就很难知道基于SLAM的移动激光扫描系统是否适合当前的项目。 NavVis将通过展示一种严格…

爬虫开发工具与环境搭建——环境配置

第二章&#xff1a;爬虫开发工具与环境搭建 第二节&#xff1a;环境配置 在进行爬虫开发之前&#xff0c;首先需要配置好开发环境。一个良好的开发环境不仅能提高开发效率&#xff0c;还能避免因环境不一致带来的问题。以下是环境配置的详细步骤&#xff0c;涵盖了Python开发…

如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐

在日常办公中&#xff0c;我们有时需要将文件夹中的所有文件名整理在Excel表格中&#xff0c;方便管理和查阅。手动复制文件名既费时又易出错&#xff0c;因此本文将介绍两种利用Excel自动提取文件夹中所有文件名的方法&#xff0c;帮助你快速整理文件信息。 方法一&#xff1…

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

SpringCloud框架学习(第三部分:Resilience4j 与 Micrometer)

目录 九、CircuitBreaker断路器 1.前言&#xff08;Hystrix&#xff09; 2.服务雪崩 3.Circuit Breaker 4. Resilience4j 5.案例实战 &#xff08;1&#xff09;熔断&#xff08;服务熔断 服务降级&#xff09; Ⅰ. 按照 COUNT_BASED&#xff08;计数的滑动窗口&#xf…

使用WebVTT和Track API增强HTML5视频的可访问性和互动性

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebVTT和Track API增强HTML5视频的可访问性和互动性 使用WebVTT和Track API增强HTML5视频的可访问性和互动性 使用WebVTT和T…

vue2中引入cesium全步骤

1.npm 下载cesium建议指定版本下载&#xff0c;最新版本有兼容性问题 npm install cesium1.95.0 2.在node_models中找到cesium将此文件下的Cesium文件复制出来放在项目的静态资源public中或者static中&#xff0c;获取去github上去下载zip包放在本地也可以 3.在index.html中引…

VTK知识学习(9)-空间变换

1、前言 在三维空间里定义的三维模型&#xff0c;最后显示时都是投影到二维平面&#xff0c;比如在屏幕上显示。 三维到二维的投影包括透视投影&#xff08;Perspective Projection&#xff09;和正交投影&#xff08;Orthogonale Projection&#xff09;。正交投影也叫平行投…