机器学习---推荐系统案例(二)

四、推荐系统---模型训练

1、模型训练代码

模型训练代码参照scala文件:Recommonder.scala

1.Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
2.val conf = new SparkConf().setAppName("recommonder").setMaster("local[*]")
3.val sc = new SparkContext(conf)
4.//加载数据,用\t分隔开
5.val data: RDD[Array[String]] = sc.textFile("./traindata").map(_.split("\t")).sample(false,0.1,100L)
6.
7.//得到第一列的值,也就是label
8.val label: RDD[String] = data.map(_(0))
9.
10.//sample这个RDD中保存的是每一条记录的特征名
11.//-1 Item.id,hitop_id53:1;Item.screen,screen6:1;Item.name,ch_name80:1;Item.author,author1:1
12.val sample: RDD[Array[String]] = data.map(_(1)).map(x => {
13.val arr: Array[String] = x.split(";").map(_.split(":")(0))
14.arr
15.})
16.//将所有元素压平,得到的是所有分特征,然后去重,最后索引化,也就是加上下标,最后转成map是为了后面查询用
17.//dict 是所有数据的所有不重复的特征
18.val allFeaturesMap: Map[String, Long] = sample.flatMap(x =>x).distinct().zipWithIndex().collectAsMap()
19.//得到稀疏向量,为每条数据的features,与dict对比,缺少的特征补成0
20.val sam: RDD[SparseVector] = sample.map((sampleFeatures :Array[String])=> {
21.//index中保存的是,未来在构建训练集时,下面填1的索引号集合
22.val currentOneInfoAllFeatureIndexs: Array[Int] = sampleFeatures.map(feature => {
23.//get出来的元素程序认定可能为空,做一个类型匹配
24.val currentFeatureIndex: Long = allFeaturesMap.get(feature).get
25.//非零元素下标,转int符合SparseVector的构造函数
26.currentFeatureIndex.toInt
27.})
28.//SparseVector创建一个向量
29.new SparseVector(allFeaturesMap.size, currentOneInfoAllFeatureIndexs, Array.fill(currentOneInfoAllFeatureIndexs.length)(1.0))
30.})
31.
32.//mllib中的逻辑回归只认1.0和0.0,这里进行一个匹配转换
33.val trainData: RDD[LabeledPoint] = label.map(x => {
34.x match {
35.case "-1" => 0.0
36.case "1" => 1.0
37.}
38.//标签组合向量得到labelPoint
39.}).zip(sam).map(tuple => new LabeledPoint(tuple._1, tuple._2.toDense))
40.
41.//逻辑回归训练,两个参数,迭代次数和步长,生产常用调整参数
42.val model = new LogisticRegressionWithLBFGS()
43..setNumClasses(2)
44..setIntercept(true)
45..run(trainData)
46.
47.//模型结果权重
48.val weights: Array[Double] = model.weights.toArray
49.//将map反转,weights相应下标的权重对应map里面相应下标的特征名
50.val map: Map[Long, String] = allFeaturesMap.map(_.swap)
51.val pw = new PrintWriter("./model");
52.for(i<- 0 until weights.length){
53.//通过map得到每个下标相应的特征名
54.val featureName = map.get(i)match {
55.case Some(feature) => feature
56.case None => ""
57.}
58.//特征名对应相应的权重
59.val str = featureName+"\t" + weights(i)
60.pw.write(str)
61.pw.println()
62.}
63.pw.flush()
64.pw.close()
65.

2、将数据导入到Redis

将app基本信息表、app历史下载表、app浏览下载表导入到Redis中,供后期dubbo推荐服务使用。

1.import redis
2.
3.# 将特征值模型文件数据存入redis数据库,将用户历史下载数据存入redis,将app基本描述商品词表存入redis数据库
4.pool = redis.ConnectionPool(host='mynode4', port='6379', db=2)
5.r = redis.Redis(connection_pool=pool)
6.
7.f = open('./ModelFile.txt', "rb")
8.while True:
9.    lines = f.readlines(100)
10.    if not lines:
11.        break
12.    for line in lines:
13.        kv = line.decode("utf-8").split('\t')
14.        r.hset("rcmd_features_score", kv[0], kv[1])
15.
16.f = open('./UserItemsHistory.txt', "rb")
17.while True:
18.    lines = f.readlines(100)
19.    if not lines:
20.        break
21.    for line in lines:
22.        kv = line.decode("utf-8").split('\t')
23.        r.hset('rcmd_user_history', kv[0], kv[1])
24.
25.f = open('./ItemList.txt', "rb")
26.while True:
27.    lines = f.readlines(100)
28.    if not lines:
29.    break
30.    for line in lines:
31.        kv = line.decode("utf-8").split('\t')
32.        # line[:-2] 取line 字符串的开头到倒数第二个的位置 数据,含头不含尾,也就是-2 就是将s 字符串中倒数后两个字符删除,常用在从文本读入数据的时候消除换行符的影响
33.        r.hset('rcmd_item_list', kv[0], line[:-2])
34.print('all finished...')
35.f.close()

五、推荐流程-dubbo介绍

dubbo介绍参照文档:dubbo.doc

六、推荐系统-dubbo实现推荐服务

利用dubbo实现推荐服务,核心代码如下:

1.public List<String> getRcmdList(String uid) {
2.
3.  // 获得数据库连接
4.  Jedis jedis = new Jedis("mynode4", 6379);
5.  jedis.select(2);
6.  // 从用户历史下载表来获取最近下载
7.  String downloads = jedis.hget("rcmd_user_history", uid);
8.  String[] downloadList = downloads.split(",");
9.
10.  // 获取所有appID列表
11.  Set<String> appList = jedis.hkeys("rcmd_item_list");
12.
13.  // 存储总的特征分值
14.  Map<String, Double> scoresMap = new HashMap<String, Double>();
15.
16.  // 分别计算所有应用的总权重
17.  for (String appId : appList) {
18.    if(Arrays.asList(downloadList).contains(appId)) {
19.      continue;
20.    }
21.     // 计算关联权重
22.     double relativeFeatureScore = getRelativeFeatureScore(appId, downloadList, jedis);
23.     updateScoresMap(scoresMap, appId, relativeFeatureScore);
24.     // 计算基本权重
25.     double basicFeatureScore = getBasicFeatureScore(appId, jedis);
26.     updateScoresMap(scoresMap, appId, basicFeatureScore);
27.  }
28.
29.  //这里将map.entrySet()转换成list
30.  List<Map.Entry<String, Double>> list = new ArrayList<Map.Entry<String, Double>>(scoresMap.entrySet());
31.  //然后通过比较器来实现排序
32.  Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
33.  //降序排序
34.  public int compare(Map.Entry<String, Double> entry1,
35.      Map.Entry<String, Double> entry2) {
36.     return -entry1.getValue().compareTo(entry2.getValue());
37.    }
38.  });
39.  // 打印分值
40.  for (Map.Entry<String, Double> mapping : list) {
41.     System.out.println(mapping.getKey() + ":" + mapping.getValue());
42.  }
43.
44.  // 取前10个appID返回
45.  List<String> result = new ArrayList<>();
46.  int count = 0;
47.  for (Map.Entry<String, Double> mapping : list) {
48.     count++;
49.     result.add(mapping.getKey());
50.    if(count==10){
51.       break;
52.    }
53.  }
54.
55.  jedis.close();
56.  return result;
57.}

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

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

相关文章

虾皮开通:如何在虾皮上开通跨境电商店铺

在当今的数字时代&#xff0c;跨境电商已经成为了全球贸易的一种重要形式。虾皮&#xff08;Shopee&#xff09;作为东南亚市场份额第一的跨境电商平台&#xff0c;为卖家提供了广阔的销售机会。如果您想在虾皮上开通店铺&#xff0c;以下是一些步骤和注意事项供您参考。 先给…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…

mysql面试:面试常问题概览、定位慢查询(explain命令)、mysql体系结构、支持的存储引擎(InnoDB)、面试回答模板

面试常问题概览 如何定位慢查询 通常页面加载过慢、接口压测响应时间过长&#xff08;超过1s&#xff09;&#xff0c;此时我们应该要定位具体是否里面有mysql的慢查询的因素。 方案一&#xff1a;调试和运维工具 调试工具&#xff1a;Arthas 运维工具&#xff1a;Prometheu…

用数码管慢速动态扫描显示数字“1234“

#include<reg51.h> // 包含51单片机寄存器定义的头文件 void delay(void) //延时函数&#xff0c;延时一段时间 { unsigned char i,j; for(i0;i<250;i) for(j0;j<250;j) ; } void main(void) { while(1) //无限循…

python报错A value is trying to be set on a copy of a slice

加入.copy()即可避免该报错提示 原代码&#xff1a; df5df4.drop_duplicates() print(df5.shape)df5[班型中文名称]df5[班型名称]-A print(df5.head()) 输出结果&#xff1a; 修改后代码&#xff1a; df5df4.drop_duplicates().copy() print(df5.shape)df5[班型中文名称]df…

【PHP手麻系统源码】基于mysql+laravel+vue开发的医院手术麻醉系统源码,实现围术期患者数据的自动采集与共享

手麻系统作为医院信息化系统的一环&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程&#xff0c;可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下&#xff0c;完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

Pycharm报的一些Python语法错误

Pycharm报的一些Python语法错误 1、PEP8:Expected 2 blank less:found 1 意思是&#xff1a;类和上面的行要间隔两行&#xff0c;现在只有一行 解决办法&#xff1a; 间隔2行 2、Remove redundant parentheses 意思是&#xff1a;删除多余的括号 解决&#xff1a;删掉外面括…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”&#xff0c;于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结&#xff1a;一个信号量对应一种资源。信号量的值这种资源的剩余数量&#xff08;信号量的值如果小于…

FATFS文件系统

文件系统是为了存储和管理数据&#xff0c;而在存储设备上建立的一种组织结构。 Windows常用的文件系统&#xff1a; 1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS FAT&#xff1a;File Alloction Table 文件分配表 在小型的嵌入式存储设备大多…

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前&#xff0c;了解这个技术的底层原理是非常重要的&#xff0c;所以本篇文章就先来讲讲什么是CAS机制&#xff0c;CAS机制存在的一些问题以及在Java中怎么使…