基于用户的协同过滤算法java实现,皮尔逊相关系数算法

 基于用户的协同过滤算法,基本思想为当需要根据一个用户的信息对他进行针对性的推荐时,可以从用户库中计算出该用户的最邻用户,也就是信息、喜好最相近的用户,通过最邻用户的喜好来对当前用户来进行推荐。

        以电影推荐为示例,一般分为两个步骤,第一步是计算出当前用户的最邻用户,第二步是将最邻用户看过而当前用户没有看过的电影推荐给用户。本课题在计算最邻用户时,采用的也是权重算法,根据用户之间的性别、年龄、喜好分类、相同电影的评分以及观影历史的喜好标签分类分别计算分数,然后按照一定权重计算总分,而在计算喜好分类、相同电影的评分以及观影历史的喜好标签分类的分数时,则是根据两个用户的数据计算皮尔森相关系数。皮尔森相关系数是指两个变量之间的关系程度,介于-1到1之间,绝对值越大,两个变量之间关联性越高,也就是两个用户之间喜好越相近。通过对用户喜好、评分等数据的皮尔森相关系数计算,加上用户的性别、年龄的关联性,即可算出用户的最邻用户,继而达到协同过滤的效果。

        流程图设计如下:

              设计思路:

/**
 * 基于用户的计算
 * 主要原理为根据用户特性以及观影历史的电影特性找到最邻用户,然后推荐最邻用户的观看历史
 * 计算最邻用户的计算方式为权重法,总分为100,
 * 分数比例:
 * (1)年龄比占5%
 * (2)性别比占5%
 * (3)用户喜好标签的皮尔森相关系数占30%
 * (4)用户观影历史里面电影对应的喜好构成的列表的皮尔森相关系数占30%(每种喜好各自计算比例)
 * (5)相同电影评分的皮尔森相关系数占30%
 * 计算过程
 * (1)用户的年龄比、性别比、用户喜好标签的皮尔森相关系数、用户观影历史里面电影对应的喜好构成的列表的皮尔森相关系数、相同电影评分的皮尔森相关系数
 * (2)查询到最近邻用户
 * (3)他的播放历史中用户没有的歌曲,同时也必须是用户喜欢的类型
 */

此方法中关键点在于皮尔逊相关系数(r)计算。

皮尔逊相关系数可以反映两个变量之间的相关性大小,在自然科学领域中,皮尔逊相关系数广泛用于度量两个变量之间的相关程度,其值介于-1与1之间。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔逊积矩相关系数”。

当r>0时,表示两变量正相关,r<0时,两变量为负相关。 当|r|=1时,表示两变量为完全线性相关,即为函数关系。

当r=0时,表示两变量间无线性相关关系。

当0<|r|<1时,表示两变量存在一定程度的线性相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱。

一般可按三级划分:|r|<0.4为低度线性相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关。

皮尔森系数计算共有四种公式:

本课题采用第四种公式,使用java代码实现:

/**
 * 方法描述: 皮尔森(pearson)相关系数计算
 */
private double getRelate(List<Double> xs, List<Double> ys) {
    int n = xs.size();
    //至少有两个元素
    if (n < 2) {
        return 0D;
    }
    double Ex = xs.stream().mapToDouble(x -> x).sum();
    double Ey = ys.stream().mapToDouble(y -> y).sum();
    double Ex2 = xs.stream().mapToDouble(x -> Math.pow(x, 2)).sum();
    double Ey2 = ys.stream().mapToDouble(y -> Math.pow(y, 2)).sum();
    double Exy = IntStream.range(0, n).mapToDouble(i -> xs.get(i) * ys.get(i)).sum();
    double numerator = Exy - Ex * Ey / n;
    double denominator = Math.sqrt((Ex2 - Math.pow(Ex, 2) / n) * (Ey2 - Math.pow(Ey, 2) / n));
    if (denominator == 0) {
        return 0D;
    }
    return Math.abs(numerator / denominator);
}

代码示例:

电影推荐基于用户的协同过滤算法java实现示例,皮尔逊相关系数算法https://download.csdn.net/download/weixin_47315082/88041059

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林间6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值