java转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 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IdentityServer4系列 | 简化模式

一、前言从上一篇关于资源密码凭证模式中,通过使用client_id和client_secret以及用户名密码通过应用Client(客户端)直接获取,从而请求获取受保护的资源,但是这种方式存在client可能存了用户密码这不安全性问题,所以需要做到client…

char截取字符串_字符串的排列(滑动窗口)

题目:给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。示例1:输入: s1 "ab" s2 "eidbaooo"输出: True解释: s2 包含 s1 的排列之…

c++中的全排列函数next_permutation()

全排列函数next_permutation() prev_permutation函数(按降序排序) 计算序列全排列的函数:next_permutation(start,end),此函数求的是当前排列的下一个排列,这里的“下一个”,我们可…

学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

第一部分:Consul 基础1,Consul 介绍官网文档描述:Consul 是一个网络工具,提供功能齐全的服务网格和服务发现。它可以做什么:自动化网络配置,发现服务并启用跨任何云或运行时的安全连接。那么,我…

python能做哪些客户端_Python 实现简单的客户端认证

问题 你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像SSL那样的复杂。 解决方案 可以利用 hmac 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例: import hmac import os def client_authenticate(con…

多线程并发如何高效实现生产者/消费者?

【导读】无需引入第三方消息队列组件,我们如何利用内置C#语法高效实现生产者/消费者对数据进行处理呢?在.NET Core共享框架(Share Framework)引入了通道(Channel),也就是说无需额外通过NuGet包安…

c++牛客网面试题05. 替换空格

class Solution{public:string replaceSpace(string s){int count0,len s.size();//统计空格的个数for(char c : s){if(c )count;} s.resize(len 2 * count);//修改字符串的长度for(int i len-1, j s.size()-1;i<j;i--,j--) {if(s[i]! )s[j]s[i];else{s[j]0;s[j-1]2;s[j-…

js-cookie 无法设置cookie_php操作 cookie

1&#xff0c;设置cookie<?phpsetcookie(key);setcookie(key1,value1);setcookie(key2,value2,time()1*24*60*60);setcookie(key4, value4, time() 1 * 24 * 60 * 60, , , false, true); //一旦cookie的httponly为真&#xff0c;那么只能在服务端获取&#xff0c;js无法操…

.Net orm 开源项目 FreeSql 2.0.0

写在开头2018年11月头脑发热到今天&#xff0c;一晃已经两年&#xff0c;当初从舒服区走向一个巨大的坑&#xff0c;回头一看后背一凉。两年时间从无到有&#xff0c;经历数不清的日夜奋斗&#xff08;有人问花了多长时间投入&#xff0c;答案&#xff1a;全职x2 两年无休息&a…

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符 头文件&#xff1a;#inlude <ctype.h> spunct() 函数用来检测一个字符是否为标点符号或特殊字符&#xff0c;其原型为&#xff1a; int ispunct(int c); 【参数】c 为需要检测的字符。 【返回值】若 c 为标…

js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

文章来自&#xff1a;华为云开发者社区摘要&#xff1a;本文主要讲谈及浏览器的渲染原理、流程以及相关的性能问题。问题前瞻1. 为什么css需要放在头部&#xff1f;2. js为什么要放在body后面&#xff1f;3. 图片的加载和渲染会阻塞页面DOM构建吗&#xff1f;4. dom解析完才出现…

做架构也得讲武德

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「169」篇原创敬上大家好&#xff0c;我是Z哥。今天分享一篇对「架构」这件事的随想。我想&#xff0c;做「架构」是每个热爱技术的技术人在不断追求想进入的领域。…

c++随机数函数rand()

c 语言rand()生成随机数 c语言中rand()函数生成随机数的用法&#xff1a; 详细介绍&#xff1a; (1)使用该函数首先应在开头包含头文件stdlib.h #include<stdlib.h>(C建议使用#include&#xff0c;下同) (2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数…

杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...

最近收到一个很爆炸的消息&#xff0c;国外大神开发出了EGG模拟器(蛋蛋模拟器)&#xff0c;让手机也能玩Switch游戏&#xff0c;一直垂涎Switch游戏体验的我怎么能错过呢&#xff0c;必须一探究竟。据悉&#xff0c;EGG模拟器支持100多款Switch游戏&#xff0c;而且游戏还在持续…

api-hook,更轻量的接口测试工具

前言在网站的开发过程中&#xff0c;接口联调和测试是至关重要的一环&#xff0c;其直接影响产品的核心价值&#xff0c;而目前也有许多技术方案和工具加持&#xff0c;让我们的开发测试工作更加便捷。接口作为数据传输的重要载体&#xff0c;数据格式和内容具有多样性&#xf…

C++11的for循环使用auto的新用法

C11的for循环使用auto的新用法 for(auto a:vec) { cout<<a<<" "; } #include<bits/stdc.h> using namespace std; int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}for(auto a:vec){cout<<a<<" …

如何使用 C# 中的 HashSet

译文链接&#xff1a;https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.htmlHashSet 是一个优化过的无序集合&#xff0c;提供对元素的高速查找和高性能的set集合操作&#xff0c;而且 HashSet 是在 .NET 3.5 中被引入的&#xff0c;在 System.Collect…

python装饰器源代码_13-Python-装饰器

1、装饰器的定义 装饰器的本质就是函数&#xff0c;用来装饰其它函数&#xff0c;就是为其它函数添加附加功能。 装饰器原则如下&#xff1a; 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 2、实现装饰器知识储备 函数即变量 1 defbar():2 print("in the…

算法设计与分析——分治与递归策略——hanoi问题

**汉诺塔问题&#xff1a;**古代有一个梵塔&#xff0c;塔内有三个座A、B、C&#xff0c;A座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上&#xff08;如图&#xff09;。有一个和尚想把这64个盘子从A座移到B座&#xff0c;但每次只能允许移…