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

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

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.mfbz.cn/a/263804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《成才》期刊投稿方式发表要求

《成才》杂志是国家新闻出版总署批准&#xff0c;面向国内外公开发行的教育期刊&#xff0c;以“大教育视野、新理念成才”为办刊宗旨&#xff0c;全面贯彻党的教育方针&#xff0c;理论联系实际&#xff0c;开展教育科学研究和人才培养研究&#xff0c;交流科技成果&#xff0…

TrustZone之示例用例——加密文件系统

移动设备如智能手机包含大量个人数据。如果设备丢失或被盗&#xff0c;用户会关心这些数据的机密性。这就是为什么大多数最新的设备支持文件系统加密的原因。TrustZone 可以作为保护这些数据的解决方案的一部分。 存储在外部闪存中的数据是加密的。在启动时&#xff0c;设备对用…

React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理

1. 组件 函数式组件&#xff08;适用于【简单组件】的定义&#xff09; 示例&#xff1a; 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么&#xff1f; React解析组件标签&#xff0c;找到了MyComponent组件发现组件是使用函数定义的&#xff0c;随后调用该…

Hive文件存储与压缩

压缩和存储 1、 Hadoop压缩配置 1) MR支持的压缩编码 压缩格式工具算法文件扩展名是否可切分DEFAULT无DEFAULT.deflate否GzipgzipDEFAULT.gz否bzip2bzip2bzip2.bz2是LZOlzopLZO.lzo否LZ4无LZ4.lz4否Snappy无Snappy.snappy否 为了支持多种压缩/解压缩算法&#xff0c;Hadoop…

数据结构 | 查漏补缺

目录 数据的基本单位 冒泡排序 DFS和BFS中文 Prim 比较 中序线索二叉树 顺序栈 链栈 时间复杂度 循环队列 求第K个结点的值 数据的基本单位 数据元素 循环队列sq中&#xff0c;用数组elem[0‥25]存放数据元素&#xff0c;设当前sq->front为20&#xff0c;sq-&g…

【C++11特性篇】模板的新一力将:可变参数模板 [全解析]

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》专…

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析(二)

上一篇中讨论了一般性的原则&#xff0c;这里我们具体讨论通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;的细节。我们将展示目标函数对于所有模型参数的梯度计算方法。 出于简单的目的&#xff0c;我们以一个没有偏置参数的循环神经…

华为鸿蒙开发应用工程师:连接未来,创造无限可能

1. 引言 随着智能设备的不断普及和发展&#xff0c;华为鸿蒙作为下一代全场景分布式操作系统&#xff0c;为开发者提供了全新的应用开发平台。作为一名鸿蒙开发应用工程师&#xff0c;您将扮演连接未来的重要角色&#xff0c;为智能生活创造无限可能。 2. 深度参与全场景应用…

modbus异常错误码说明

异常错误码说明 其中物理离散量输入和输入寄存器只能有I/O系统提供的数据类型&#xff0c;即只能是由I/O系统改变离散量输入和输入寄存器的数值&#xff0c;而上位机程序不能改变的数据类型&#xff0c;在数据读写上表现为只读&#xff0c;而内部比特或者物理线圈和内部寄存器或…

Profinet转485modbus网关解决传输距离及数据丢失问题

Profinet转485modbus网关&#xff08;XD-MDPN100/2000&#xff09;是一款能够解决传输距离及数据丢失问题的设备。在现场应用中&#xff0c;数据的传输距离和数据丢失最为常见的问题。 在现场添加Profinet转485modbus网关&#xff08;XD-MDPN100/2000&#xff09;即可解决传输距…

BDD - Python Behave 入门

BDD - Python Behave 入门 Behave 是什么Behave 的主要特点和组成部分Behave 实践安装 BehaveBehave 项目目录结构创建项目创建 Feature 文件创建步骤定义文件 执行用例执行全部用例执行部分用例 生成报告生成 Json report生成 HTML 报告生成 Junit report生成 Cucumber report…

Modbus-TCP数据帧

Modbus-TCP基于4种报文类型 MODBUS 请求是客户机在网络上发送用来启动事务处理的报文MODBUS 指示是服务端接收的请求报文MODBUS 响应是服务器发送的响应信息MODBUS 证实是在客户端接收的响应信息 Modbus-TCP报文: 报文头MBAP MBAP为报文头&#xff0c;长度为7字节&#xff0c…

postman和Jmeter的区别

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

非隔离恒压ACDC稳压智能电源模块芯片推荐:SM7015

非隔离恒压ACDC稳压智能电源模块芯片是一种用于将交流&#xff08;AC&#xff09;电源转换为直流&#xff08;DC&#xff09;电源的集成电路。这种芯片具有恒压输出功能&#xff0c;能够保持输出电压的稳定&#xff0c;适用于各种需要直流电源的应用场景。 非隔离电源模块通常…

【华为数据之道学习笔记】6-5数据地图的核心价值

数据供应者与消费者之间往往存在一种矛盾&#xff1a;供应者做了大量的数据治理工作、提供了大量的数据&#xff0c;但数据消费者却仍然不满意&#xff0c;他们始终认为在使用数据之前存在两个重大困难。 1&#xff09;找数难 企业的数据分散存储在上千个数据库、上百万张物理表…

2024年,消费品零售企业如何规划大模型和数据技术落地?

导读&#xff1a;品牌商和零售商目前都在做2024年的规划&#xff0c;本次分享基于爱分析过往的研究&#xff0c;带来消费品零售行业2024年宏观趋势和方向&#xff0c;以及如何落地大模型和数据技术。 分享嘉宾&#xff5c;张扬 爱分析联合创始人兼首席分析师 内容来源于爱分析…

【算法刷题】Day22

文章目录 1. 按摩师题干&#xff1a;算法原理&#xff1a;&#xff08;dp&#xff09;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 寻找数组的中心下标题干&#xff1a;算法原理&#xff1a;&#xff08;前缀和&#xff09;代码…

大数据处理与分析

掌握分布式并行编程框架MapReduce掌握基于内存的分布式计算框架Spark理解MapReduce的工作流程、Spark运行原理熟悉机器学习概念 一.MapReduce Hadoop MapReduce是一个软件框架&#xff0c;基于该框架能够容易地编写应用程序&#xff0c;这些应用程序能够运行在由上千个商用机器…

亚马逊品牌分析ABA功能有哪些?亚马逊选品的量化标准有哪些?——站斧浏览器

亚马逊品牌分析ABA功能有哪些&#xff1f; 1、品牌市场份额&#xff08;Share of Voice&#xff09; ABA提供了品牌在特定类别中市场份额的详细数据。这一模块帮助品牌所有者准确评估其品牌在整个市场中的竞争地位和表现。通过了解市场份额&#xff0c;品牌方可以制定更具针对…

2024年金三银四必备面试题之自动化测试面试题及答案大全

1.你如何用Selenium测试&#xff1f; SeleniumMavenTestNGJekins 2.如何解决问题&#xff1f; 先思考&#xff0c;然后百度&#xff0c;考虑网速、电脑配置等原因&#xff0c;这题主要看重解决问题的能力和思维。 3.你是怎么开发测试框架的&#xff1f; SeleniumMavenTestNGJ…
最新文章