JAVA开源协同过滤算法,经典协同过滤算法:Slope One 的原理及实现(Java)

本文首先介绍了Slope One算法的原理,然后给出了算法的Java版实现。

一. Slope One 算法的原理介绍

用户

对事物A打分

对事物B打分

X

3

4

Y

2

4

Z

4

?

用户Z对事物B的打分可能是多少呢?股票上有个说法是平均值可以掩盖一切异常波动,所以股票上的各个技术指标收拾不同时间段的平均值的曲线图或者柱状图等。同样的,Slope One算法也认为:平均值也可以代替某两个未知个体之间的打分差异,事物A对事物B的平均很差是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是说人们对事物B的打分一般比事物A的打分要高1.5,于是Slope one算法就猜测Z对事物B的打分是4 + 1.5 = 5.5

是不是非常的简单?

加权算法

有n个人对事物A和事物B打分了,R(A->B)表示这n个人对A和对B打分的平均差(A-B),有m个人对事物B和事物C打分 了,R(B->C)表示这m个人对B和对C打分的平均差(B-C),注意都是平均差而不是平方差,现在某个用户对A的打分是ra,对C的打分是 rc,那么A对B的打分可能是:

rb = (n * (ra - R(A->B)) + m * (rc + R(B->C)))/(m+n)

二. Slope One 算法的实现

我自己实现的Slope One:

package com.liangtee.slopeone.recommender.impl;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.liangtee.slopeone.recommender.DataSetModel;

import com.liangtee.slopeone.recommender.Recommender;

import com.liangtee.slopeone.vo.RecommendedItem;

/**

* Weighted Slope One Algorithm

*

* Just for Fun

*

* @author LiangTE

*

*/

public class SlopeOneRecommender implements Recommender {

private static final Logger log = LoggerFactory.getLogger(SlopeOneRecommender.class);

private DataSetModel dataSet = null;

public SlopeOneRecommender(DataSetModel dataSet) {

this.dataSet = dataSet;

}

@Override

public float preferenceOnItem(long userID, long ItemID) throws Exception {

if(!dataSet.containsUser(userID)) {

throw new Exception("not contains this User : " + userID);

}

Set UIDs = dataSet.getUserIDs();

Map targetUserRatings = dataSet.getUserRatings(userID);

Set ratedItems = targetUserRatings.keySet();

Map diffCache = new HashMap();

Map counter = new HashMap();

log.info("Slope One start to work...");

for(long UID : UIDs) {//计算每个用户的差值

if(UID != userID) {

Map ratings = dataSet.getUserRatings(UID);

for(long iid : ratedItems) {// iid = item id

if(ratings.containsKey(ItemID) && ratings.containsKey(iid)) {

float diff = ratings.get(ItemID) - ratings.get(iid);

if(diffCache.containsKey(iid)) {

diffCache.put(iid, diffCache.get(iid)+diff);

} else {

diffCache.put(iid, diff);

}

if(counter.containsKey(iid)) {

counter.put(iid, counter.get(iid)+1);

} else {

counter.put(iid, 1);

}

}

}

}

}

int K = 0;

float total = 0F;

for(long iid : ratedItems) {

if(diffCache.containsKey(iid)) {

float bias = diffCache.get(iid)/counter.get(iid);

float targetUserRating = targetUserRatings.get(iid);

float p = targetUserRating + bias;

total += p;

K++;

}

}

return total/K;

}

开源的Slope one的程序包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值