8.最佳电影聚类分析

将使用电影简介作为原始数据,将总共 100 部流行电影进行聚类分析。IMDb 也称为互联网电影数据库(www.imdb.com),是一个在线的数据库,它提供有关电影、电子游戏和电视节目的大量详细信息。它聚集了电影和电视节目的评论以及简介,并有几个精选影片清单。原始数据地址 https://www.imdb.com/list/ls055592025/ 上获取名为 “100部最佳影片(中级清单),可在 https://github.com/brandomr/document_cluster 处进行下载。

解析并清洗了数据,并作为原始数据中缺少简介的几部电影添加了影片介绍。这些简介和电影描述来自维基百科。数据解析完成后,将它们存储在数据框中,并将其保存至 movie_data.csv 文件中:

将在聚类分析中加载并使用该文件中的数据,首先,需要加载并查看电影数据的内容,如下代码所示:

结果:

可以看到以及有了电影标题和响应的内容简介,将其加载到数据框中,然后存储在变量了。前面的实处也给出了一个电影样本及其部分摘要。核心思路是使用这些电影简介作为原始输入来聚类电影并完成分组。将从这些简介中提取特征,并使用无监督的学习算法将它们进行聚类。电影标题则是用于表征数据,当想要可视化并展示聚类及其统计信息时,这些电影标题将会很有用。聚类算法的数据输入是从电影简介中提取的特征。在介绍每个聚类算法之前,将执行前面类似的模范化和特征提取过程:

如出现如下错误:

请修改 normalization.py 文件内容为:

结果:

在规范化之后的文本中保留了文本表示,并提取了基于 TF-IDF 的一元分词和二元分词特征,以保证每个特征至少在 25% 的文档中出现,以及至多 85% 的文档使用词项 min_df 和 max_df。可以看出,对于 100 部电影,共有 100 行数据并且每部电影有 307 个特征,一些示例特征也显示在上述代码段中。接下来,以及准备好了特征和文档,将进行聚类分析。

k-means 聚类

k-means 聚类算法是一种基于质心的聚类模型,它尝试将数据聚类成等方差的组或聚类。该算法尝试将标准或度量——惯量(inertia)最小化,惯量也称为聚类内平方和。这种算法的一个主要缺点是,和其他所有基于质心的聚类模型一样,它需要事先指定聚类 k 的数量。该算法可能是目前最流行的聚类算法,由于其易用性及可扩展大量数据而被广泛使用。

现在,可以使用数学表达式正式的定义 k-means 聚类算法。假设有一个具有 N 个数据或样本的数据集 X,并且希望将它们分组为 K 个聚类,其中 K 是一个用户指定的参数。k-means 聚类算法会将 N 个数据点分离为 K 个不相交的分离聚类 Ck,并且每一个聚类均可以被样例聚类的平均值描述。这些平均值就是聚类的质心 µk,它们不必受质心必须是 X 的 N 个样本中的实际数据点这个条件的限制。该算法选择这些质心并以这样一种方式构建聚类——即惯量或聚类内平方和需要最小化,其数学表达式为:

聚类 Ci 和质心 µ1 中 iε{1,2,...,k}。劳埃德(Lloyd)算法是解决这个问题的一个方案,它是包含以下步骤的迭代过程:

通过从数据集 X 中选取 k 个随机样本,选择 k 个初始质心 µk。

通过将每个数据点或样本分配到离其最近的质心点来更新聚类。在数学上,可以将其表示为 Ck={xn:||xn-µk||<=all||xn-µl||},其中 Ck 表示聚类。

根据步骤 2 获得的每个聚类的新聚类数据点重新计算并更新聚类,在数学上可以表示为:

其中 µk 表示质心。

以上迭代方式重复上述步骤,知道步骤 2 和步骤 3 得到的结果不再发生变化。使用这种方法需要注意一点,那就是即使优化过程中确保是收敛的,它仍然可能存在局部最小值,因此在实际使用中,该算法会在多个时期和不同迭代次数中运行多次,并且如果需要的话,可以从多个迭代结果中取平均值。收敛和局部最小的发生高度依赖于步骤 1 中最开始质心的初始化。一种方式是进行多次迭代,并进行多次随机初始化,然后取平均值。另一种方法是使用 scikit-learn 中的 kmeans + 方案,它在初始化质心时质心彼此原理,这被证明是十分有效的。

g该代码段使用之前实现的 k-means 函数,根据电影简介中的 TF-IDF 特征对电影进行聚类,使用聚类分析的结果为每个电影分配聚类别标签,并将其存储在 'Cluster' 列的 movie_data 数据帧中。可以看到,在分时中国将 k 设置成了 5.以下代码段可以查看 5 个聚类的电影总数:

结果:

可以看到,正如前面所说的,共有 5 个聚类标签,从 0 到 4 ,并且对每个标签都有一些电影属于该聚类,该聚类中的电影数为上一列表中每个数组中的第二个元素。接下来,将会定义一些函数来提取详细的聚类分析情况,显示结果并可视化聚类。首先定义一个函数,从聚类分析中提取重要信息:

上述函数非常简单明了。所做的是提取每个聚类的关键特征,这些特征对于定义聚类很重要。它还能够检索每个聚类的电影标题,并将所有内容存储在字典中。

接下来,将定义一个使用此数据结构并能够清晰展示结构的函数:

在分析 k-means 聚类算法结构之前,还需要定义一个函数来实现聚类可视化。因为要处理的是多为特征空间和非结构化文本数据。如果直接可视化数字特征向量,那么这可能没什么意义。目前有一些技术,如主成分分析(PCA)或多为缩放(MDS)可以减少纬度,可以在二维或三维图中可视化这些聚类。再具体实现中,将使用 MDS 来可视化聚类。

MDS 是一种减少非线性纬度的方法,可以在降低纬度系统中更好地显现结果。它的核心思想史使用一个距离矩阵,以便获得各种数据点之间的距离。在这里,将使用余弦相似度。MDS 尝试使用向量空间中的高维特征构建数据的低维表示,这样使得在高维特征空间中使用余弦相似度获得的各种数据点的距离在使用较低纬表示时仍然大致相同。

MDS 的 scikit-learn 实现有两类算法:度量和非度量算法。在这里,将使用度量算法,因为将使用基于余弦相似度的距离度量来构建各种电影之间的输入相似度矩阵。在数学上,MDS 可以定义为:假设 S 是在特征矩阵上使用余弦相似度获得的各种数据点(电影)之间的相似度矩阵,X 是 n 个输入数据点(电影)的坐标,差异性(disparity),其通常是相似度值的一些最佳变换,甚至可能是原始相似值本身。MDS 的目标函数称为应力函数,其定义为 sumi

函数的代码比较长,但是注释相当清楚的说明了函数的每一步。首先使用文档之间的余弦相似度建立相似度矩阵,获得余弦距离,然后使用 MDS 将高维特征空间转换为二维。然后,使用 matplotlib 会话聚类结果,并使用一些必要的格式来展现效果更好。该函数是一个通用函数,可以用于任何具有动态聚类数量的聚类算法。在显示结果中,每个聚类都会拥有自己的颜色、符号和标签,以区分图例框中的特征值。实际的额可视化结果将绘制每部电影机器具有自己颜色和符号的聚类标签。

现在,可以使用上述函数来分析 k-means 算法的聚类结果。以下代码段描述了 k-means 聚类的详细分析结果:

结果:

制作图像:

上面的输出显示了每个聚类及其中电影的关键特征。每个聚类尤其主题描述,主题通过最主要的特征定义该聚类。可以看到流行的电影,如《教父》、《教父2》 和《宾虚》等电影在同一类中,它们都涉及 “家庭” “爱” “战争” 等。诸如《星球大战》、《指环王》、《鹿猎人》、《角斗士》、《阿甘蒸煮》等电影与 “杀人” “士兵” “军队” “战争” 等主题的电影汇聚在一起。考虑到用于聚类的数据只是每部电影简介的几个段落,得出的结果绝对会非常有趣。

近邻传播聚类

k-means 算法虽然非常流行,但是有一个缺点,就是用户必须预先定义聚类数量。如果实际情况中有更多或更少的聚类呢?有一些观察聚类质量并计算最佳 k 值的方法。有兴趣的可以查看肘部法则(elbow method)和轮廓系数(silhouette coefficient),它们是确定最佳 k 值的流行方法。在这里,将讨论另一种算法,它基于数据的固有属性来构建聚类,无需对聚类数量进行任何预先假设。近邻传播(Affinity Propagation,AP)算法基于特聚类个数据点中的 “消息传递” 的概念,并且不需要关于聚类数量的预先假设。

AP 算法通过在数据点之间传递消息直至达到收敛而创建聚类。整个数据集由少数作为样本代表的样本表示。这些样本类似于你从 k-means 或 k-medoids 算法中获得的质心。在数据点之间发送的小时表示一个数据点是否适合作为样本代表表示其他数据点。它在每次迭代中不断更新直到收敛,最终的样本是每个聚类的代表。请记住,这种方法的一个缺点是计算强度较大,因为消息在整个数据集中间的每一对数据点之间传递,在应用于大量数据时,可能需要相当穿的时间才能达到收敛。

现在,可以定义 AP 算法的步骤(由维基百科和 scikit-learn 提供)。假设有一个具有 n 个数据点的数据集 X,X={x1,x2,...,xn},假设 sim(x,y) 是衡量两点 x 和 y 之间相似度的相似度函数。在这个过程中,将再次使用余弦相似度。AP 算法通过执行两个消息传递步骤完成迭代过程,如下所示:

聚类分析 MySQL_8.最佳电影聚类分析相关推荐

  1. python层次聚类分析_SPSS聚类分析:系统聚类分析

    一.概念:(分析-分类-系统聚类) 系统聚类法常称为层次聚类法.分层聚类法,也是聚类分析中使用广泛的一种方法.它有两种类型,一是对研究对象本身进 行分类,称为Q型聚类:另一是对研究对象的观察指标进行分 ...

  2. 文本聚类分析算法_聚类分析算法综述

    前 言 聚类是人类认识未知世界的一种重要的认知手段.在生产和生活中,人们往往面对非常复杂的事和物,如果能够把相似的东西归为一类,有明显区别的事物分属在不同的类别中,处理起来就大为简便.所谓" ...

  3. python导入数据聚类分析实例_聚类分析实战解析与总结 - 数据分析

    聚类分析是没有给定划分类别的情况下,根据样本相似度进行样本分组的一种方法,是一种非监督的学习算法.聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化 ...

  4. python聚类分析案例_python 聚类分析实战案例:K-means算法(原理源码)

    K-means算法: 关于步骤:参考之前的博客 关于代码与数据:暂时整理代码如下:后期会附上github地址,上传原始数据与代码完整版, 各种聚类算法的对比:参考连接 Kmeans算法的缺陷 1.聚类 ...

  5. R语言聚类分析--cluster, factoextra

    R语言聚类分析–cluster, factoextra 本文转载自"R语言中文社区",己获授权,宏基因组公众号编辑对内容进行测试.修改及补充. 原文链接:https://mp.we ...

  6. 【模糊数学】编程实现文献“研究生招生中的模糊聚类分析方法”

    模糊数学是一门很有用的应用型数学,之前做手势识别时,曾看到过NUS使用模糊数学做的手势检测.本文是"模糊数学"课程作业的总结,使用matlab编程实现,在此记录下来以备之后的学习. ...

  7. 基因表达聚类分析之初探SOM - 自组织特征图

    之前的培训有老师提出要做SOM分析,最后卡在code plot只能出segment plot却出不来line plot.查了下,没看到解决方案.今天看了下源码,设置了一个参数,得到趋势图.也顺便学习了 ...

  8. 基因表达聚类分析之初探SOM

    之前的培训有老师提出要做SOM分析,最后卡在code plot只能出segment plot却出不来line plot.查了下,没看到解决方案.今天看了下源码,设置了一个参数,得到趋势图.也顺便学习了 ...

  9. kmeans及模型评估指标_聚类分析的过程和两个常用的聚类算法

    聚类分析过程 一般聚类分析的数据源是需要相对干净的,即需要做统一的特征清洗.特征变换过程,即空值.非法值.异常值.类别变量等的处理.主要过程如下: 数据采集:我们可以认为是统一的ETL过程,这里涉及埋 ...

最新文章

  1. Transformer 代码完全解读!
  2. 伽卡他卡电子教室 百度百科_创建百度百科的好处
  3. PyTorch基础-猫狗分类实战-10
  4. 【Python】import pandas时,报错 pandas Missing required dependencies ['numpy'] 原因分析
  5. BOA+CGI+SQLite 随笔
  6. 818. Race Car
  7. hive三种调用方式
  8. 新手如何学习C语言/C++,教你一年时间是拿到年薪50万
  9. [leetcode]468. Validate IP Address验证有效IP地址
  10. dsp调音一次多少钱_DSP调音到底调的是什么?什么是EQ?
  11. 求矩阵四叉树的四进制和十进制Morton码
  12. 网友对各种杀软的评价诗歌
  13. 抖音视频怎么下载MP4格式怎么转换为MP3
  14. 树莓派3b no wireless interfaces found 的解决办法 360wifi和树莓派结合
  15. 苹果发布会总结:全新 iMac、iPad Pro、 紫色 iPhone 12 和 AirTag 登场
  16. 做玫瑰花的方法 用纸_用纸折玫瑰花的方法简单又快速
  17. 《调色师手册:电影和视频调色专业技法(第2版)》——调色所需的其他硬件...
  18. 织梦安装会错版、乱码、二级目录安装问题
  19. 运维安全-网络与基础架构图
  20. 某款PC Camera试玩儿

热门文章

  1. Q1营业额同比增近50%,创维能否做好家电和汽车的双选题?
  2. system V消息队列的使用
  3. OO系统分析员之路--用例分析系列(7)--用例规约的编写--业务规则和实体描述
  4. PHP json 类型
  5. STM32 TFTLCD 任意大小字体显示,32*32,48*48,64*64,可以显示大字体
  6. Win系统的Hyper-V虚拟机上安装一个图形界面的Linux系统
  7. 让奥迪耐克微软们集体翻车的Woke-washing,套路到底有多深?
  8. c语言eof不起作用,c语言中EOF的用法
  9. 26岁才学java_26岁学java编程晚不晚
  10. 音视频开发 ● android录音到播放的整个过程