推荐系统相关算法

摘要:

   热门推荐

   协同过滤算法

   矩阵分解

   基于内容的推荐(文本,标签,特征/profile)

     基于图的算法

   

内容:

热门推荐:

  热门推荐本质上是一个排行榜,可能会考虑到时间衰减,商品的销量/流行度,好评,差评等因素,对于新用户引导有一定的作用,但是并不是一个个性化的算法

  以下是一些热门排名的公式实现:

 1 def hacker_news_rank(  ):
 2     #参考自http://www.oschina.net/news/43456/how-hacker-news-ranking-algorithm-works
 3     tr = pd.read_csv('../data/train.csv')
 4     item = pd.read_csv('../data/news_info.csv')
 5     item_action_cnt = tr[['user_id','item_id','action_type']].drop_duplicates().groupby(['item_id'],as_index=False).count()[['item_id','action_type']]
 6     item_action_cnt.columns = ['item_id','action_cnt']
 7     item_pop = pd.merge(item[['item_id', 'timestamp']], tr, on='item_id')
 8     item_pop = pd.merge( item_action_cnt,item_pop,on='item_id' )
 9     item_pop['pop'] = item_pop['action_cnt'] / pow( ( item_pop['action_time'] - item_pop['timestamp'] )/3600 ,5.8 ) #5.8等于10.8,优于1.8,2.8
10     item_pop = item_pop[['item_id','pop']].groupby( ['item_id'],as_index=False ).sum()
11     return item_pop

 

1 def top_pop(  ):
2     #参考自《推荐系统实践》p130
3     tr = pd.read_csv('../data/train.csv')
4     tr['pop'] = tr['action_time'].apply(lambda t: 1 / (1.0 + 0.2 * (1487433599 - t))) #0.2优于0.1和0.5
5     item_pop = tr[['item_id', 'pop']].groupby(['item_id'], as_index=False).sum()
6     return item_pop

 

协同过滤算法

  协同过滤算法大概可以分成如下几步:

   1.构建用户评分矩阵,每一行是用户,物品,评分的三元组

   2.构建用户/物品的倒排索引

   3.计算物品/用户的相似度,比如共现相似度,cosine相似度等

   4.预测用户对相似物品的评分,选取top k 进行推荐

以下是一个python版的简单实现:

 1 #可以优化空间,存储成三角矩阵
 2 def get_concur_mat(  ):
 3     path = "../cache/get_concur_mat.pkl"
 4     if os.path.exists(path):
 5         sim_mat = pickle.load(open(path, "rb"))
 6     else:
 7         rat_mat = get_rating_matrix() //用户评分矩阵
 8         sim_mat = pd.DataFrame()
 9         item1_list = []
10         item2_list = []
11         item1_item2_score = []
12         user_groups = rat_mat.groupby( ['user_id'] ) //物品的倒排索引
13         for name,group in user_groups:
14             for pair in permutations(list(group[['item_id','weight']].values), 2):
15                 item1_list.append( pair[0][0] )
16                 item2_list.append( pair[1][0] )
17                 item1_item2_score.append( pair[0][1]*pair[1][1] )
18         sim_mat['item1'] = item1_list
19         sim_mat['item2'] = item2_list
20         sim_mat['score'] = item1_item2_score
21         sim_mat = sim_mat.groupby(['item1', 'item2'], as_index=False).sum()
22         pickle.dump(sim_mat, open(path, 'wb'), True)  # dump 时如果指定了 protocol 为 True,压缩过后的文件的大小只有原来的文件的 30%
23     return sim_mat
24 
25 def get_cosine_sim(  ):
26     path = "../cache/cosine_sim_mat.pkl"
27     if os.path.exists(path):
28         sim_mat = pickle.load(open(path, "rb"))
29     else:
30         concur_mat = get_concur_mat()
31         print('----------------load concur_mat--------------------')
32         rat_mat = get_rating_matrix()
33         print('----------------load rat_mat--------------------')
34         rat_mat['score2'] = rat_mat[['weight']] *  rat_mat[['weight']]
35         item_sum_s2_vector = rat_mat[['item_id','score2']].groupby(['item_id'],as_index=False).sum()
36         item_sum_s2_vector.index = item_sum_s2_vector['item_id']
37         item_sum_s2_dict = item_sum_s2_vector['score2'].to_dict()
38         concur_mat['item1_sum_s2'] = concur_mat['item1'].apply( lambda p:item_sum_s2_dict[p] )
39         concur_mat['item2_sum_s2'] = concur_mat['item2'].apply(lambda p: item_sum_s2_dict[p])
40         concur_mat['sim'] = concur_mat['score'] / (concur_mat['item1_sum_s2'].apply(math.sqrt) * concur_mat['item2_sum_s2'].apply(math.sqrt))
41         print('------------      取前20个最相似的item    ------------------')
42         sim_mat = pd.DataFrame()
43         for item1,group in concur_mat.groupby( ['item1'],as_index=False ):
44             df = group.sort_values( ['sim'],ascending=False ).head( 20 )
45             df['item1'] = [item1] * len(df)
46             sim_mat = sim_mat.append( df )
47             # print('---------------------------')
48         sim_mat = sim_mat[['item1', 'item2', 'sim']]
49         pickle.dump(sim_mat, open(path, 'wb'), True)
50     return sim_mat
View Code

 

 矩阵分解

 举一个电影推荐的例子,用户可能对星爷的无厘头电影和好莱坞大片比较感兴趣,这时协同过滤就不能明确满足用户的这部分需求了。矩阵分解类的算法针对此类问题,引入了隐性因子的概念。那么矩阵分解大概可以分成如下几步:

  1.构建用户评分矩阵,每一行是用户,物品,评分的三元组

    2.设定隐因子数量,迭代次数,正则化参数(单指ALS和SGD优化算法)等,并进行训练

      3.保存用户矩阵,物品矩阵

  4.预测用户对候选物品的评分,选取top k 进行推荐

以下是一个python调用libMF的简单例子:

1 #!/usr/bin/env bash
2 
3 #训练
4 #-l1 0.015,0 -l2 0.01,0.005 -r 0.01 -v 10 -t 10000 -r 0.01
5 bins/mf-train -k 35 -l1 0.015,0 -l2 0,0.05 -t 8000 -r 0.02 data/real_matrix.tr.txt model/libMF_model_l1l2

预测评分

 1  print( ' 预测评分 ' )
 2     rec = pd.DataFrame()
 3     user_list = []
 4     rec_items_list = []
 5     sorted_list = []
 6     n = 0
 7     feat = ["factor_" + str(i) for i in range(num_factor)]
 8     user_mat = user_mat[ ['user_id']+feat ]
 9     item_mat = item_mat[ ['item_id']+feat ]
10     for i in range( len(user_mat) ):
11         recitems = []
12         for j in range( len(item_mat) ):
13             predict = user_mat.ix[i,1:].dot( item_mat.ix[j,1:] )
14             addAndSortTopK( [item_mat.ix[j,0],predict],sorted_list )
15         for item_predict in sorted_list:
16             recitems.append( int(item_predict[0]) )
17         sorted_list.clear()
18         user_list.append( user_mat.ix[i,0] )
19         rec_items_list.append( " ".join( map(str,recitems) ) )
20         n += 1
21         if( n%2==0 ):print(' rec users '+str( n ))
22     rec['user_id'] = user_list
23     rec['item_id'] = rec_items_list

 

基于内容的推荐(文本,标签,特征/profile)

  多维度分析用户对物品的偏好,例如新闻,图书类的会对物品进行文本分析,音乐,博客类的可以通过(UGC)标签引导用户并且记录用户累积偏好;最后电商类推荐搭建用户画像和商品画像,进行精准营销。

实现代码待续~~~

 

 基于图的算法

待续~~~

转载于:https://www.cnblogs.com/arachis/p/recSys.html

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

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

相关文章

冒泡排序的简单理解

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

司机和售票员问题 信号signal注册一例

#include <stdio.h> #include <stdlib.h> #include <signal.h>pid_t pid;void driver_handler(int signo) //司机的信号处理函数 {if (signo SIGUSR1)printf("Lets go!\n");if (signo SIGUSR2)printf("Stop the bus!\n");if (signo …

MSP430F5529 DriverLib 库函数学习笔记(四)UART通信

目录硬知识USCI通信模块USCI的UART模式1. USCI初始化和复位2. 异步通信字符格式3. 异步多机通信模式4. 自动波特率检测5. IrDA编码和解码6. 自动错误检测7. USCI接收使能8. USCI发送使能9. UART波特率的产生10. UART波特率的设置&#xff08;重要&#xff09;&#xff08;1&…

MSP430F5529 DriverLib 库函数学习笔记(四点五)printf打印输出

目录代码实现使相应工程支持打印浮点数实验结果平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP)代码实现 重定向fputc(int ch, FILE *f)直接使用printf的方法只有字符串和%s打印正常&#xff0c;数字打印不出来…

flag

mark, to remember

MSP430F5529 DriverLib 库函数学习笔记(五)定时器A

目录硬知识定时器A 16位定时器原理&#xff08;1&#xff09;时钟源选择和分频器&#xff08;2&#xff09;Timer_A工作模式&#xff08;3&#xff09;捕获/比较模块&#xff08;4&#xff09;Timer_A中断&#xff08;重要&#xff09;定时器A API (机翻)定时器A配置和控制的函…

vim 常用快捷键(整理版)

最常用&#xff1a; x 删除后面的字符 X 删除前一个字符 删除3个字符就是3x dd:删除一行 D 删除到行尾 J:删除换行符&#xff0c;使下一行并上来。 nJ:连接后面的n行 u:撤销上一次操作 U:撤销当前行的所有修改 ctrlr:对撤消的撤消 I 在行首插入 a 在光标后插入 A…

MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波

目录1.通过Timer_A_outputPWM配置产生PWM波初始化函数计算修改占空比的函数整体程序效果2.单定时器产生多路PWM信号初始化函数实验结果3.对称PWM信号的产生初始化程序实验结果平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EX…

Key_EXTI_Config:神舟IV

GPIO 输入上拉&#xff0c;按键按下&#xff0c;pin接地&#xff0c;触发中断 Key_Config 1 void Key_Config(void)2 {3 GPIO_InitTypeDef GPIO_InitStructure;4 5 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);6 7 /* Configure KEY1 Button PC4*/8 RCC_APB2…

Java 将HTML转为XML

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP430F5529 DriverLib 库函数学习笔记(七)定时器B

目录硬知识Timer_B特点及结构Timer_B寄存器定时器B API处理计时器配置和控制的函数参数处理计时器输出的函数参数管理定时器B中断的函数参数平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 硬知识 16位定时器B(…

ruoyi接口权限校验

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)

目录硬知识模数转换概述MSP430单片机ADC12模块介绍MSP430单片机ADC12模块操作ADC12的转换模式采样和转换转换存储器使用片内集成温度传感器ADC12模块寄存器ADC_12A API (机翻)处理初始化和转换的函数参数处理中断的函数参数处理ADC_12A的辅助功能的函数参数上机实战&#xff08…

有意思的鼠标指针交互探究

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

python基本数据类型——str

一、字符串的创建 test str() / "" test str("licheng") / "licheng" 无参数&#xff0c;创建空字符串一个参数&#xff0c;创建普通字符串两个参数&#xff0c;int&#xff08;字节&#xff0c;编码&#xff09;二、字符串的常用方法 #capita…

MSP430F5529 DriverLib 库函数学习笔记(九)SPI

目录硬知识USCI的同步模式SPI概述SPI特性及结构框图同步操作原理与操作USCI寄存器——SPI模式USCI_x_SPI API &#xff08;机翻&#xff09;处理状态和初始化的函数参数处理数据的函数参数管理中断的函数参数DMA相关参数平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5…

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

深入理解Threadlocal

SUN公司早在JDK1.2的时候就为我们提供了java.lang.ThreadLocal,低版本的JDK所提供的get()返回的是Object对象&#xff0c;需要强制类型转换&#xff0c;使用起来不方便&#xff0c;而在JDK1.5引入了泛型&#xff0c;在一定程度地简化ThreadLocal的使用。 我们知道在spring容器中…

HDU 2289 几何+圆台

题意;给定一个圆台杯子的R&#xff0c;r&#xff0c;H和里面水的体积V 求h 二分。。。。。。。。。。。。。。。。。 因为解不出来h。。。。。。。。。。。。 View Code 1 /*2 几何3 圆台体积4 V1/3*pi*h*(r1*r1r2*r2r1*r2)5 6 */7 #include<stdio.h>8 #include<stri…

MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏

目录上机实战SPI 驱动 墨水屏墨水屏介绍电子纸的分类电泳型电子纸技术详解原理结构优势与不足实验电路介绍程序分析引脚初始化SPI模块初始化发送和接收全部源代码main.cmain.h墨水屏相关Paper_Display.cPaper_Display.hInclude.h实验结果现象波形对应平台&#xff1a;Code Comp…