public static double getUserSimilar(Map<String, Integer> pm1, Map<String, Integer> pm2) {
int n = 0;// 数量n
int sxy = 0;// Σxy=x1*y1+x2*y2+....xn*yn
int sx = 0;// Σx=x1+x2+....xn
int sy = 0;// Σy=y1+y2+...yn
int sx2 = 0;// Σx2=(x1)2+(x2)2+....(xn)2
int sy2 = 0;// Σy2=(y1)2+(y2)2+....(yn)2
for (Entry<String, Integer> pme : pm1.entrySet()) {
String key = pme.getKey();
Integer x = pme.getValue();
Integer y = pm2.get(key);
if (x != null && y != null) {
n++;
sxy += x * y;
sx += x;
sy += y;
sx2 += Math.pow(x, 2);
sy2 += Math.pow(y, 2);
}
}
// p=(Σxy-Σx*Σy/n)/Math.sqrt((Σx2-(Σx)2/n)(Σy2-(Σy)2/n));
double sd = sxy - sx * sy / n;
double sm = Math.sqrt((sx2 - Math.pow(sx, 2) / n) * (sy2 - Math.pow(sy, 2) / n));
return Math.abs(sm == 0 ? 1 : sd / sm);
}
//获取推荐结果
public static String getRecommend(Map<String, Map<String, Integer>> simUserObjMap,
Map<String, Double> simUserSimMap) {
Map<String, Double> objScoreMap = new HashMap<String, Double>();
for (Entry<String, Map<String, Integer>> simUserEn : simUserObjMap.entrySet()) {
String user = simUserEn.getKey();
double sim = simUserSimMap.get(user);
for (Entry<String, Integer> simObjEn : simUserEn.getValue().entrySet()) {
double objScore = sim * simObjEn.getValue();//加权(相似度*评分)
String objName = simObjEn.getKey();
if (objScoreMap.get(objName) == null) {
objScoreMap.put(objName, objScore);
} else {
double totalScore = objScoreMap.get(objName);
objScoreMap.put(objName, totalScore + objScore);//将所有用户的加权评分作为最后的推荐结果数据
}
}
}
List<Entry<String, Double>> enList = new ArrayList<Entry<String, Double>>(objScoreMap.entrySet());
Collections.sort(enList, new Comparator<Map.Entry<String, Double>>() {//排序
public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
Double a = o1.getValue() - o2.getValue();
if (a == 0) {
return 0;
} else if (a > 0) {
return 1;
} else {
return -1;
}
}
});
for (Entry<String, Double> entry : enList) {
System.out.println(entry.getKey()+"的加权推荐值:"+entry.getValue());
}
return enList.get(enList.size() - 1).getKey();//返回推荐结果
}
协同过滤算法
最新推荐文章于 2024-06-18 15:19:27 发布