[置顶] 使用聚类算法来对用户进行兴趣小组推荐
2018-02-09 23:14
477 查看
接上一篇文章,这篇文章讲的是我如何实现聚类部分的代码。
聚类部分,老师的要求是:提出一个能够应用聚类算法的应用需求并实现该应用,包括从MongoDB
数据库中整理数据集;在数据集上应用聚类算法;对聚类结果进行展示。
由此可见,主题可以任选,开放形式。由于之前我组员做的graphx已经实现了对小组推荐友情小组,因此,轮到我做聚类算法时,我就想到可以对豆瓣用户之前加入小组的历史记录,来推荐他们可能感兴趣的小组。
下面是我的课堂报告。有个小插曲,本来这个主题不该轮到我们组做报告的(因为组数太多了得留机会给其他组),可是几个组上台作报告之后,老师可能觉得都没啥亮点,于是私下里转头跟我说:“你准备好了吗?要不下面一组就你上去吧,插个队。”于是本来已在台下放飞自我的我又上台去做报告了哈哈。这次报告老师也是打的最高评价哦。
在标注矩阵中,频度代表标签ti标注小组j的次数。标注矩阵的物理含义是m个标签和n个小组之间的关联。
cij的度量越大,说明标签ti和tj共同出现的几率越高,即标签ti和标签tj之间的关系就越密切。
在公式中,分母加1是为了防止分母为0的情况。这个度量的物理含义代表:若该标签在m个小组内出现的频率越高,以及在整个小组集合中的共现频率越低,这个标签的aij值就越大,说明标签ti在整个小组集合中越重要。
标签聚类的结果是将语义相近的标签聚成一个簇,这些不同的簇恰恰代表了不同主题,因此以标签簇为中介更能明确反映用户的兴趣
小组与标签的关系,在之前爬取的group表中就已经有了。算法中数据的输入,还需要用户与标签的关系,可以根据爬取的member表中的用户与小组的关系,推出用户与标签的关系。
代码实现部分主要就是RDD的转换,对上述公式进行代码实现,还使用了 Spark MLlib 中自带的 KMeans 函数对之前公式得到的标签向量组进行聚类。最后根据“小组和标签簇的相关度”、“用户和标签簇的相关度”计算出用户对小组的兴趣度,并倒序排序,得出对用户推荐的小组。代码部分的PPT较多,这里就不放上来了。
如果p点的LOF越接近1,说明p的其邻域点密度差不多,p可能和邻域同属一簇;如果这个比值越小于1,说明p的密度高于其邻域点密度,p为密集点;如果这个比值越大于1,说明p的密度小于其邻域点密度,p越可能是异常点。
LOF算法代码部分的PPT,我也在这里省略了。(因为csdn的贴图真的好麻烦 >_<)
之后构造一个剔除了离群点的newVectors,传入 KMeans 进行聚类。
当然,我在查阅了Spark的源码之后,发现Spark的kmeans算法中使用的默认算法就是kmeans++。同时,为了维持聚类的稳定性,我还设置了seed为1。因为在源代码中,我发现如果不设置seed,Spark默认使用的是随机生成一个种子,这会导致集群初始化时的随机种子不稳定,使得最终聚类结果也不稳定。
课堂报告到此结束啦。
聚类部分,老师的要求是:提出一个能够应用聚类算法的应用需求并实现该应用,包括从MongoDB
数据库中整理数据集;在数据集上应用聚类算法;对聚类结果进行展示。
由此可见,主题可以任选,开放形式。由于之前我组员做的graphx已经实现了对小组推荐友情小组,因此,轮到我做聚类算法时,我就想到可以对豆瓣用户之前加入小组的历史记录,来推荐他们可能感兴趣的小组。
下面是我的课堂报告。有个小插曲,本来这个主题不该轮到我们组做报告的(因为组数太多了得留机会给其他组),可是几个组上台作报告之后,老师可能觉得都没啥亮点,于是私下里转头跟我说:“你准备好了吗?要不下面一组就你上去吧,插个队。”于是本来已在台下放飞自我的我又上台去做报告了哈哈。这次报告老师也是打的最高评价哦。
在标注矩阵中,频度代表标签ti标注小组j的次数。标注矩阵的物理含义是m个标签和n个小组之间的关联。
cij的度量越大,说明标签ti和tj共同出现的几率越高,即标签ti和标签tj之间的关系就越密切。
在公式中,分母加1是为了防止分母为0的情况。这个度量的物理含义代表:若该标签在m个小组内出现的频率越高,以及在整个小组集合中的共现频率越低,这个标签的aij值就越大,说明标签ti在整个小组集合中越重要。
标签聚类的结果是将语义相近的标签聚成一个簇,这些不同的簇恰恰代表了不同主题,因此以标签簇为中介更能明确反映用户的兴趣
小组与标签的关系,在之前爬取的group表中就已经有了。算法中数据的输入,还需要用户与标签的关系,可以根据爬取的member表中的用户与小组的关系,推出用户与标签的关系。
代码实现部分主要就是RDD的转换,对上述公式进行代码实现,还使用了 Spark MLlib 中自带的 KMeans 函数对之前公式得到的标签向量组进行聚类。最后根据“小组和标签簇的相关度”、“用户和标签簇的相关度”计算出用户对小组的兴趣度,并倒序排序,得出对用户推荐的小组。代码部分的PPT较多,这里就不放上来了。
如果p点的LOF越接近1,说明p的其邻域点密度差不多,p可能和邻域同属一簇;如果这个比值越小于1,说明p的密度高于其邻域点密度,p为密集点;如果这个比值越大于1,说明p的密度小于其邻域点密度,p越可能是异常点。
LOF算法代码部分的PPT,我也在这里省略了。(因为csdn的贴图真的好麻烦 >_<)
之后构造一个剔除了离群点的newVectors,传入 KMeans 进行聚类。
当然,我在查阅了Spark的源码之后,发现Spark的kmeans算法中使用的默认算法就是kmeans++。同时,为了维持聚类的稳定性,我还设置了seed为1。因为在源代码中,我发现如果不设置seed,Spark默认使用的是随机生成一个种子,这会导致集群初始化时的随机种子不稳定,使得最终聚类结果也不稳定。
课堂报告到此结束啦。
相关文章推荐
- Spark中组件Mllib的学习11之使用ALS对movieLens中一百万条(1M)数据集进行训练,并对输入的新用户数据进行电影推荐
- [置顶] 使用Spark Streaming进行豆瓣用户画像分析
- VSftpd使用MySQL存储虚拟用户进行认证 推荐
- 使用话题模型LDA对用户进行旅游城市推荐
- 使用存储过程,分页用户控件,jQuery进行Ajax分页!
- RH9安装SVN+win用户使用---新手入门教程 推荐
- 在PHP中使用正则表达式进行查找替换 推荐
- 推荐:ESRI用户使用Python指南
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测 推荐
- 如何使用SMOD和CMOD进行SD的用户增强
- 当局域网内某台主机使用P2P进行下载时,P2P软件会占用局域网到互联网出口的大量的带宽,导致其他用户网速慢、卡等现象。BT等软件在下载的同时又作为种子为其他人提供下载服务
- Exchange2007—使用Export-Mailbox管理用户邮箱 推荐
- 如何使用SMOD和CMOD进行SD的用户增强
- 重提URL Rewrite(2):使用已有组件进行URL Rewrite 推荐
- 电子商务网站用户体验--根据用户的习惯进行推荐
- 推荐笔记本用户使用的硬盘。。。2.5”战胜台式机硬盘 日立7K320-250GB
- 使用LDAP/SSL进行RequisitePro用户验证及管理
- 使用diskpart命令进行扩充硬盘空间操作说明 推荐
- 使用alert、prompt和confirm语句与用户进行交互
- 英语阅读推荐:创建Silverlight用户控件 & A*路径搜索中使用二叉堆