基于用户的协同过滤算法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

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,针对您的问题,以下是Java实现经典的协同过滤算法使用皮尔逊系数的步骤: 步骤1:加载数据集 首先,我们需要加载一个包含用户偏好数据的数据集。该数据集通常包含用户对物品的评分。例如,以下是一个包含用户对电影的评分数据集: userId movieId rating 1 101 5.0 1 102 3.0 1 103 2.5 2 101 2.0 2 102 2.5 2 103 5.0 3 101 2.5 3 103 3.0 3 104 3.5 步骤2:计算用户之间的相似度 接下来,我们使用皮尔逊系数来计算用户之间的相似度。皮尔逊系数是一种衡量两个变量之间线性相关性的方法。在协同过滤中,我们使用皮尔逊系数来计算用户之间的相似度,从而推荐物品。以下是计算用户之间相似度的Java代码: public static double pearsonCorrelationScore(Map<String, Map<String, Double>> data, String user1, String user2) { Map<String, Double> user1Ratings = data.get(user1); Map<String, Double> user2Ratings = data.get(user2); double sum1 = 0, sum2 = 0, sum1Sq = 0, sum2Sq = 0, pSum = 0; int n = 0; for (String item : user1Ratings.keySet()) { if (user2Ratings.containsKey(item)) { n++; double rating1 = user1Ratings.get(item); double rating2 = user2Ratings.get(item); sum1 += rating1; sum2 += rating2; sum1Sq += Math.pow(rating1, 2); sum2Sq += Math.pow(rating2, 2); pSum += rating1 * rating2; } } if (n == 0) { return 0; } double num = pSum - (sum1 * sum2 / n); double den = Math.sqrt((sum1Sq - Math.pow(sum1, 2) / n) * (sum2Sq - Math.pow(sum2, 2) / n)); if (den == 0) { return 0; } return num / den; } 步骤3:寻找与当前用户最相似的用户 接下来,我们需要找到与当前用户最相似的用户。我们可以使用步骤2中的pearsonCorrelationScore函数来计算用户之间的相似度,并将它们作为键值对存储在一个Map中。以下是Java代码: public static List<String> findSimilarUsers(Map<String, Map<String, Double>> data, String user) { List<String> similarUsers = new ArrayList<>(); Map<String, Double> scores = new HashMap<>(); for (String otherUser : data.keySet()) { if (!otherUser.equals(user)) { double score = pearsonCorrelationScore(data, user, otherUser); if (score > 0) { scores.put(otherUser, score); } } } similarUsers.addAll(scores.keySet()); Collections.sort(similarUsers, (u1, u2) -> scores.get(u2).compareTo(scores.get(u1))); return similarUsers; } 步骤4:推荐物品给用户 最后,我们可以使用与当前用户最相似的用户的历史评分数据来推荐物品给用户。我们可以计算当前用户没有评分的物品的加权评分,并将它们按照评分从高到低排序,以便为用户提供推荐物品。以下是Java代码: public static List<String> getRecommendations(Map<String, Map<String, Double>> data, String user) { List<String> recommendations = new ArrayList<>(); Map<String, Double> scores = new HashMap<>(); Map<String, Double> totals = new HashMap<>(); for (String otherUser : findSimilarUsers(data, user)) { Map<String, Double> otherUserRatings = data.get(otherUser); for (String item : otherUserRatings.keySet()) { if (!data.get(user).containsKey(item)) { double score = pearsonCorrelationScore(data, user, otherUser) * otherUserRatings.get(item); scores.put(item, scores.getOrDefault(item, 0.0) + score); totals.put(item, totals.getOrDefault(item, 0.0) + pearsonCorrelationScore(data, user, otherUser)); } } } for (String item : scores.keySet()) { double score = scores.get(item); double total = totals.get(item); recommendations.add(item + ": " + (total > 0 ? score / total : 0)); } Collections.sort(recommendations, (r1, r2) -> Double.compare(Double.parseDouble(r2.split(": ")[1]), Double.parseDouble(r1.split(": ")[1]))); return recommendations; } 以上就是Java实现经典的协同过滤算法使用皮尔逊系数的步骤。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林间6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值