slope one 推荐算法python 代码_java和python实现一个加权SlopeOne推荐算法

1 importjava.util.HashMap;2 importjava.util.Map;3 importjava.util.List;4 importjava.util.ArrayList;5 importjava.util.Comparator;6 importjava.util.Collections;7

8 /**

9 * Created by on 2016/12/8.ShiYan10 * 一.计算所有物品对的偏差11 * 二.利用偏差进行预测12 */

13 public classSlopeOne {14 Map> frequency=null;15 Map> deviation=null;16 Map> user_rating=null;17

18 public SlopeOne( Map>user_rating){19 frequency=new HashMap>();20 deviation=new HashMap>();21 this.user_rating=user_rating;22 }23

24 /**

25 * 所有有item间的评分偏差26 */

27 public voidcomputeDeviation(){28 for(Map.Entry>ratingsEntry:user_rating.entrySet()){29 for(Map.EntryratingEntry:ratingsEntry.getValue().entrySet()){30 String item=ratingEntry.getKey();31 int rating=ratingEntry.getValue();32 Map itemFrequency=null;33 if(!frequency.containsKey(item)){34 itemFrequency=new HashMap();35 frequency.put(item,itemFrequency);36 }else{37 itemFrequency=frequency.get(item);38 }39

40 Map itemDeviation=null;41 if(!deviation.containsKey(item)){42 itemDeviation=new HashMap();43 deviation.put(item,itemDeviation);44 }else{45 itemDeviation=deviation.get(item);46 }47

48 for(Map.EntryratingEntry2:ratingsEntry.getValue().entrySet()){49 String item2=ratingEntry2.getKey();50 int rating2=ratingEntry2.getValue();51 if(!item.equals(item2)){52 //两个项目的用户数

53 itemFrequency.put(item2,itemFrequency.containsKey(item2)?itemFrequency.get(item2)+1:0);54 //两个项目的评分偏差,累加

55 itemDeviation.put(item2,itemDeviation.containsKey(item2)?itemDeviation.get(item2)+(rating-rating2):0.0);56 }57 }58 }59 }60

61 for(Map.Entry>itemsDeviation:deviation.entrySet()){62 String item=itemsDeviation.getKey();63 Map itemDev=itemsDeviation.getValue();64 Map itemFre=frequency.get(item);65 for(String itemName:itemDev.keySet()){66 itemDev.put(itemName,itemDev.get(itemName)/itemFre.get(itemName));67 }68 }69 }70

71 /**

72 * 评分预测73 *@paramuserRating 目标用户的评分74 *@paramk 返回前k个75 *@return

76 */

77 public List> predictRating(Map userRating,intk){78 Map recommendations=new HashMap();79 Map frequencies=new HashMap();80 for(Map.EntryuserEntry:userRating.entrySet()){81 String userItem=userEntry.getKey();82 double rating=userEntry.getValue();83 for(Map.Entry>deviationEntry:deviation.entrySet()){84 String item=deviationEntry.getKey();85 Map itemDeviation=deviationEntry.getValue();86 Map itemFrequency=frequency.get(item);87 if(!userRating.containsKey(item) &&itemDeviation.containsKey(userItem)){88 int fre=itemFrequency.get(userItem);89 if(!recommendations.containsKey(item))90 recommendations.put(item,0.0);91 if(!frequencies.containsKey(item))92 frequencies.put(item,0);93 //分子部分

94 recommendations.put(item,recommendations.get(item)+(itemDeviation.get(userItem)+rating)*fre);95 //分母部分

96 frequencies.put(item,frequencies.get(item)+fre);97 }98 }99 }100 for(Map.EntryrecoEntry:recommendations.entrySet()){101 String key=recoEntry.getKey();102 double value=recoEntry.getValue()/frequencies.get(key);103 recommendations.put(key,value);104 }105 //排序,这里还可以使用优先队列返回top_k

106 List> list_map=new ArrayList>(recommendations.entrySet());107 Collections.sort(list_map,new Comparator>(){108 @Override109 public int compare(Map.Entry o1, Map.Entryo2) {110 if(o2.getValue()>o1.getValue())111 return 1;112 else if(o2.getValue()

115 return 0;116 }117 }118 );119 List> top_k=new ArrayList>();120 if(list_map.size()

127 public static voidmain(String[] args){128 Map> userRatings=new HashMap>();129 Map xiMingRating=new HashMap();130 xiMingRating.put("张学友",4);131 xiMingRating.put("周杰伦",3);132 xiMingRating.put("刘德华",4);133 Map xiHaiRating=new HashMap();134 xiHaiRating.put("张学友",5);135 xiHaiRating.put("周杰伦",2);136 Map liMeiRating=new HashMap();137 liMeiRating.put("周杰伦",3);138 liMeiRating.put( "刘德华",4);139 Map liLeiRating=new HashMap();140 liLeiRating.put("张学友",5);141 liLeiRating.put("刘德华",3);142 userRatings.put("xiMing",xiMingRating);143 userRatings.put("xiHai",xiHaiRating);144 userRatings.put("liMei", liMeiRating);145 userRatings.put("liLei",liLeiRating);146

147 SlopeOne slopOne=newSlopeOne(userRatings);148 slopOne.computeDeviation();149 List> top_k=slopOne.predictRating(userRatings.get("liLei"),5);150 for(Map.Entryitem:top_k){151 System.out.println(item.getKey()+" "+item.getValue());152 }153 }154 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值