使用聚类算法来对用户进行兴趣小组推荐

    接上一篇文章,这篇文章讲的是我如何实现聚类部分的代码。

    聚类部分,老师的要求是:提出一个能够应用聚类算法的应用需求并实现该应用,包括从MongoDB 数据库中整理数据集;在数据集上应用聚类算法;对聚类结果进行展示。

    由此可见,主题可以任选,开放形式。由于之前我组员做的graphx已经实现了对小组推荐友情小组,因此,轮到我做聚类算法时,我就想到可以对豆瓣用户之前加入小组的历史记录,来推荐他们可能感兴趣的小组。

    下面是我的课堂报告。有个小插曲,本来这个主题不该轮到我们组做报告的(因为组数太多了得留机会给其他组),可是几个组上台作报告之后,老师可能觉得都没啥亮点,于是私下里转头跟我说:“你准备好了吗?要不下面一组就你上去吧,插个队。”于是本来已在台下放飞自我的我又上台去做报告了哈哈。这次报告老师也是打的最高评价哦。








在标注矩阵中,频度代表标签ti标注小组j的次数。标注矩阵的物理含义是m个标签和n个小组之间的关联。

cij的度量越大,说明标签titj共同出现的几率越高,即标签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的源码之后,发现Sparkkmeans算法中使用的默认算法就是kmeans++。同时,为了维持聚类的稳定性,我还设置了seed1。因为在源代码中,我发现如果不设置seedSpark默认使用的是随机生成一个种子,这会导致集群初始化时的随机种子不稳定,使得最终聚类结果也不稳定。







课堂报告到此结束啦。

猜你喜欢

转载自blog.csdn.net/huanghanqian/article/details/79302301