协同过滤算法实现步骤

  • 1.表示用户行为矩阵,即统计用户购买某种商品类型的数量
 public double[] getNumByCustomer(Customer customer){List<OrderItem> list =orderItemDao.findByCustomerAndAliveAndState(customer.getId(),1,2);double [] vectore =new double[totalNum];int index=0;for(ProductType type:productTypes){for(OrderItem orderItem:list){if(orderItem.getProduct().getProductType().id==type.id){vectore[index]=vectore[index]+orderItem.getNum();}}return vectore;}
  • 2.用余弦距离计算每个用户与其它用户的行为相似度
    下面代码是两个用户之间的相似度,进行遍历就可以获取全部相似度
 public double countSimilarity(double [] a,double [] b){double total=0;double alength=0;double blength=0;for(int i=0;i<a.length;i++){total=total+a[i]*b[i];alength=alength+a[i]*a[i];blength=blength+b[i]*b[i];}double down=Math.sqrt(alength)*Math.sqrt(blength);double result=0;if(down!=0){result =total/down;}return result;}
  • 3.取相似度最高的前n个用户,组成相似用户集合
    对Map按值进行排序
 public List<Map.Entry<Long,Double>> getMaxSimilarity(Customer customer){Map<Long,Double> result =new HashMap<Long,Double>();double vector[] =(double [])users.get(customer.getId());for(Map.Entry<Long,Object> entry:users.entrySet()){if(entry.getKey()!=customer.getId()){double [] temp =(double[])entry.getValue();double similarity =countSimilarity(temp,vector);              result.put(entry.getKey(),similarity);}}List<Map.Entry<Long,Double>> list = new LinkedList<Map.Entry<Long,Double>>( result.entrySet() );Collections.sort( list, new Comparator<Map.Entry<Long,Double>>(){public int compare( Map.Entry<Long,Double> o1, Map.Entry<Long,Double> o2 ){return (o2.getValue()).compareTo( o1.getValue() );}} );return list;}
  • 4.获得相似用户集合购买的商品,并统计相似用户购买的商品的数量,进行排序
  public Map<Long,ProductNumModel> getProducts(List<Map.Entry<Long,Double>> list){List<Customer> simCustomers =new ArrayList<Customer>();System.out.println("相似度高的3个用户  ");for(int i=0;i<list.size()&&i<3;i++){Long id =list.get(i).getKey();Customer customer =customerDao.findByIdAndAlive(id,1);simCustomers.add(customer);}Map<Long,ProductNumModel> map =new HashMap<Long,ProductNumModel>();for(Customer customer:simCustomers){Map<Long,ProductNumModel> hashSet =getCustomerProduct(customer);for(Map.Entry<Long,ProductNumModel> entry:hashSet.entrySet()){ProductNumModel model=null;if(map.containsKey(entry.getKey())){model=map.get(entry.getKey());model.num+=entry.getValue().num;}else{model=new ProductNumModel();model.product=entry.getValue().product;model.num=entry.getValue().num;}map.put(entry.getKey(),model);}}return map;}
  • 总的调用函数,将前面函数连接,并把结果存到文件中。如果文件不存在,则用算法计算,如果文件内容存在,则直接读取文件的内容。开定时任务,每天或者一周将商品推荐文件删除,则会自动更新商品推荐内容
   public Map<String,Object> getAllSimilarity(Customer customer) throws IOException {changeCustomerToVector();for(Map.Entry<Long,Object> entry:users.entrySet()){double [] temp=(double [])entry.getValue();}InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("cxtx.properties");Properties p = new Properties();try {p.load(inputStream);} catch (IOException e1) {e1.printStackTrace();}String folderPath = p.getProperty("recommendFile");File file=new File(folderPath);if(!file.exists()){file.createNewFile();}FileInputStream fileInputStream=new FileInputStream(file);Map<String,Object> map =new HashMap<String,Object>();com.alibaba.fastjson.JSONObject jsonObject = null;try {if(fileInputStream!=null){jsonObject = com.alibaba.fastjson.JSON.parseObject(IOUtils.toString(fileInputStream, "UTF-8"));}} catch (IOException e) {map.put("msg","JSON 格式不正确");map.put("content","");return map;}Object content=null;if(jsonObject==null){ //如果文件中没有,则计算每个用户的推荐产品FileWriter fileWriter=new FileWriter(file,true);BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);Map<Long,Object> temp =new HashMap<Long,Object>();for(Customer c:customers){List<Map.Entry<Long,Double>> list =this.getMaxSimilarity(c);Map<Long,ProductNumModel> result =getProducts(list);List<Product> list1=sortProduct(result);temp.put(c.getId(),list1);}JSONObject object=new JSONObject(temp);bufferedWriter.write(object.toString());bufferedWriter.flush();if(object!=null){content= object.get(customer.getId()+"");}}else{if(null!=jsonObject.get(customer.getId()+"")){content=jsonObject.get(customer.getId()+"");}}map.put("msg","获取成功");map.put("content",content);return map;}
  • 注意的地方:

1.用户相似度计算时,要考虑分母为0的情况;同时要防止数值太大,超过了double能表示的范围,可以做一些处理,例如除以最大的某个商品销售量,来表示某个维度的向量值,或者减去某个值等等

2.余弦值越接近1,表明两个向量越相似,即计算出来的值越大,用户行为越相似

3.最后获得推荐的商品数量可以较多或较少,要根据一定策略进行排序,例如相似用户的购买数量,而不是商品总的销售量,因为不相似用户的数据,容易产生干扰。

JAVA_协同过滤算法商品推荐相关推荐

  1. 基于协同过滤算法的推荐

    2019独角兽企业重金招聘Python工程师标准>>> 基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子 ...

  2. SpringBoot+Vue+Element-UI实现协同过滤算法商品推荐系统

    文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclip ...

  3. 协同过滤算法智能推荐原理与实践

    数据挖掘的一个经典案例就是尿布与啤酒的例子.尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产品放到相邻货架销售的时候,会大大提高两者销量.很多时候看似不相关的两种产品,却会存在这某种神秘的隐含关系 ...

  4. 02 机器学习算法库Mahout - 协同过滤算法实现推荐功能

     (原文地址:http://blog.csdn.net/codemosi/article/category/2777041,转载麻烦带上原文地址.hadoop hive hbase mahout ...

  5. springboot java基于协同过滤算法商品推荐系统vue

    互时动态更新该页面的 Web 应用 springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生 ...

  6. Python基于用户协同过滤算法电影推荐的一个小改进

    之前曾经推送过这个问题的一个实现,详见:Python基于用户协同过滤算法的电影推荐代码demo 在当时的代码中没有考虑一种情况,如果选出来的最相似用户和待测用户完全一样,就没法推荐电影了.所以,在实际 ...

  7. 个性化智能推荐(协同过滤算法)技术研究

    个性化智能推荐(协同过滤算法)技术研究 一.  协同过滤推荐(Collaborative Filtering简称 CF)        协同过滤技术是目前推荐系统中最成功和应用最广泛的技术,在理论研究 ...

  8. 【机器学习项目实战】Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 电子商务网站数量迅速上升,将电子商务网站浏览者变为实际消费者,满 ...

  9. 基于协同过滤算法的商品推荐购物电商系统

    一.介绍 商品推荐是针对用户面对海量的商品信息而不知从何下手的一种解决方案,它可以根据用户的喜好,年龄,点击量,购买量以及各种购买行为来为用户推荐合适的商品.在本项目中采用的是基于用户的协同过滤的推荐 ...

最新文章

  1. python字符串压缩字_gzip如何在Python中压缩字符串?
  2. drcom linux怎么运行,drcom for linux
  3. nginx重定向到其他url方法_高级开发必须掌握Nginx之四,if、set、return
  4. python 将布尔数组取反的方法 True False(b=(a==False))
  5. Linux安装wireshark并配置权限
  6. vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...
  7. iOS开发--开发者帐号
  8. 蓝桥杯 C语言 试题 基础练习 Sine之舞
  9. Hexo博客-NexT主题自定义主页配置方法
  10. PHP实现用户扫描二维码后提示扫码成功的操作
  11. WPF 加载PDF文件
  12. 1038: 绝对值最大
  13. 钉钉一行代码_利用Python快速搭建钉钉和邮件数据推送系统
  14. python3的各种经典案例,总共299个案例,直接可以运行(中:100个案例)
  15. Excel笔记(持续更新)
  16. web页面嵌入音乐播放器代码
  17. 一个所谓的“文字创作者”的焦虑
  18. 从高考到程序员的成长之路
  19. P1506 拯救oibh总部题解
  20. 拯救低效率,强烈推荐这4款实用的Windows软件

热门文章

  1. 最简单的幻灯片制作,分分钟完成高逼格成片
  2. 解析力評測(1) MTF和SFR
  3. Web前端-JavaScript--对象
  4. 几何光学类毕业论文文献有哪些?
  5. 海康威视产品的token更新
  6. 如何修改MySQL实例的UUID#olivia丶长歌#
  7. es6箭头函数_【知识点】ES6箭头函数、箭头函数与普通函数的区别
  8. 如何利用计算机隐藏文件,如何查找隐藏的计算机文件夹
  9. 看linux centos版本信息,Linux CentOS查看操作系统版本信息
  10. 10计算机管理员权限获得,Win10永久获取管理员权限的方法