基于用户的协同过滤算法,基本思想为当需要根据一个用户的信息对他进行针对性的推荐时,可以从用户库中计算出该用户的最邻用户,也就是信息、喜好最相近的用户,通过最邻用户的喜好来对当前用户来进行推荐。
以电影推荐为示例,一般分为两个步骤,第一步是计算出当前用户的最邻用户,第二步是将最邻用户看过而当前用户没有看过的电影推荐给用户。本课题在计算最邻用户时,采用的也是权重算法,根据用户之间的性别、年龄、喜好分类、相同电影的评分以及观影历史的喜好标签分类分别计算分数,然后按照一定权重计算总分,而在计算喜好分类、相同电影的评分以及观影历史的喜好标签分类的分数时,则是根据两个用户的数据计算皮尔森相关系数。皮尔森相关系数是指两个变量之间的关系程度,介于-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