一文深入理解协同过滤
一文深入理解协同过滤
写在之前…
从这篇文章开始,我的下一个算法职业生涯方向将专注于推荐算法…
看了那么多书和代码,还是peter 的那本<<机器学习实战>>最为经典,说实话很多中国人写的书确实不怎么样…
那么,开始吧.本文代码从赵志勇的那本书上修改而来,估计赵志勇的那篇文章也是从<<机器学习实战>>那本书修改而来,反正总是修改修改…
那就上代码吧!,talk is cheap ,show me the code .
# coding:UTF-8
'''
Date:20180624
@author: luogan
'''import numpy as np
import pandasfrom numpy import mat,eyefrom numpy import linalgdef fetch_data():dat=mat([[4., 3., 0., 5., 0.],[5., 0., 4., 4., 0.],[4., 0., 5., 0., 3.],[2., 3., 0., 1., 0.],[0., 4., 2., 0., 5.]])return datdef cos_sim(x, y):'''余弦相似性input: x(mat):以行向量的形式存储,可以是用户或者商品y(mat):以行向量的形式存储,可以是用户或者商品output: x和y之间的余弦相似度'''numerator = x * y.T # x和y之间的额内积denominator = np.sqrt(x * x.T) * np.sqrt(y * y.T) return (numerator / denominator)[0, 0]def similarity(data):'''计算矩阵中任意两行之间的相似度input: data(mat):任意矩阵output: w(mat):任意两行之间的相似度'''m = np.shape(data)[0] # 用户的数量# 初始化相似度矩阵w = np.mat(np.zeros((m, m)))for i in range(m):for j in range(i, m):if j != i:# 计算任意两行之间的相似度w[i, j] = cos_sim(data[i, ], data[j, ])w[j, i] = w[i, j]else:w[i, j] = 0return wdef user_based_recommend(data, w, user):'''基于用户相似性为用户user推荐商品input: data(mat):用户商品矩阵w(mat):用户之间的相似度user(int):用户的编号output: predict(list):推荐列表'''m, n = np.shape(data)interaction = data[user, ] # 用户user与商品信息# 1、找到用户user没有互动过的商品not_inter = []for i in range(n):if interaction[0, i] == 0: # 没有互动的商品not_inter.append(i)# 2、对没有互动过的商品进行预测#print('not_inter=',not_inter)predict={}dd=np.array(data)ww=np.array(w) if len(not_inter)>0:for i in not_inter:#print('ww[:,user]=',ww[:,user])#print('dd[:,i].T',dd[:,i].T)predict[i]=ww[:,user]@dd[:,i].T#print(predict)return predictdef top_k(predict, k):'''为用户推荐前k个商品input: predict(list):排好序的商品列表k(int):推荐的商品个数output: top_recom(list):top_k个商品'''pp=pandas.Series(predict)pp1=pp.sort_values(ascending=False)#top_recom = []len_result = len(predict)if k>=len_result:return pp1.iloc[:k]else:return pp1def svd(data):u,sigma,vt=linalg.svd(data)sig3=mat(eye(3)*sigma[:3])fea_mat=data.T*u[:,:3]*sig3.Ireturn fea_matdef normalize(w):w=np.array(w)#print(w)dim=len(w)ww=[]for i in range(dim):d=w[i]m=[]for k in range(len(d)):m.append(abs(d[k]))ssm=sum(m)#print('ssm=',ssm)for j in range(len(m)):m[j]=d[j]/ssmww.append(m)return mat(ww)data = fetch_data()print('仅仅采用协同过滤算法')print('only use collaborative')w_initial=similarity(data)
# 3、利用用户之间的相似性进行推荐
#print ("------------ 3. predict ------------" )
predict = user_based_recommend(data, w_initial, 0)
# 4、进行Top-K推荐
#print ("------------ 4. top_k recommendation ------------")
top_recom = top_k(predict, 1)
print ('top_recom=',top_recom)print('采用协同过滤算法+相似度矩阵的归一化')print(' use collaborative and normalize')w_initial=similarity(data) w_initial_normal=normalize(w_initial)predict = user_based_recommend(data, w_initial_normal, 0)
top_recom = top_k(predict, 1)
print ('top_recom=',top_recom)print('采用协同过滤算法+svd矩阵分解')
print('use collaborative and svd')data1=svd(data)
w_svd= similarity(data1)predict = user_based_recommend(data, w_svd, 0)
top_recom = top_k(predict, 1)
print ('top_recom=',top_recom)print('采用协同过滤算法+svd矩阵分解'+'相似度矩阵的归一化')
print('use collaborative and svd and normalize')data1=svd(data)
w_svd= similarity(data1)w_svd_normal=normalize(w_svd)predict = user_based_recommend(data, w_svd_normal, 0)
top_recom = top_k(predict, 1)
print ('top_recom=',top_recom)
仅仅采用协同过滤算法
top_recom= 2 5.103039
4 2.224911
dtype: float64
采用协同过滤算法+相似度矩阵的归一化
top_recom= 2 2.592621
4 1.398861
dtype: float64
采用协同过滤算法+svd矩阵分解
top_recom= 2 2.555181
4 1.241427
dtype: float64
采用协同过滤算法+svd矩阵分解相似度矩阵的归一化
top_recom= 2 1.687669
4 0.818257
dtype: float64
当我们仅仅采用协同过滤,不对结果采用任何处理时,第一个用户的第三的商品的推荐,结果是5.1,对比其他三种算法,可以看出这个结果是有问题的,其他三种算法的推荐值都在2左右.
svd 和相似度矩阵归一化,在某种意义上是等价的,这段时间看了30多篇文献, 协同过滤的变种和技巧方面还有很多种.下次继续更....
结论:
在用协同过滤做推荐时,必须采用归一化或svd,或其他技巧…
posted on 2018-06-24 16:23 luoganttcc 阅读(...) 评论(...) 编辑 收藏
一文深入理解协同过滤相关推荐
- 05-机器学习_(协同过滤推荐算法与应用)---没用
机器学习算法day03_协同过滤推荐算法及应用 课程大纲 协同过滤推荐算法原理 协同过滤推荐算法概述 协同过滤推荐算法思想 协同过滤推荐算法分析 协同过滤推荐算法要点 协同过滤推荐算法实现 协同过滤推 ...
- 从原理到落地,七大维度读懂协同过滤推荐算法
作者丨gongyouliu 来源 | 大数据与人工智能 导语:本文会从协同过滤思想简介.协同过滤算法原理介绍.离线协同过滤算法的工程实现.近实时协同过滤算法的工程实现.协同过滤算法应用场景.协同过滤算 ...
- 推荐系统笔记:基于模型的协同过滤
1 介绍 基于邻域的协同过滤方法可以看作是机器学习中常用的k-最近邻分类器KNN的泛化. 这些方法是基于实例的方法,因此,除了可选的预处理阶段之外,没有专门为预测预先创建模型. 推荐系统笔记:Intr ...
- 矩阵sum_推荐系统——从协同过滤到矩阵分解
本文简单扼要地介绍推荐算法中的两种经典算法:协同过滤和矩阵分解.内容有以下三部分 协同过滤算法 矩阵分解 协同过滤与矩阵分解的关系 早期的推荐系统以业务理解为核心,通过复杂的规则描述来向用户推荐商品, ...
- 协同过滤算法深入解析:构建智能推荐系统的核心技术
一.前言 二.协同过滤算法简介 三.基于用户的协同过滤 3.1 用户相似度计算 3.2 预测用户评分 四.基于物品的协同过滤 4.1 物品相似度计算 4.2 预测用户评分 五.矩阵分解方法 5.1 奇 ...
- 【科研导向】Outer Product-based Neural Collaborative Filtering (ConvNCF)基于外积的神经协同过滤<论文理解代码分析>
Outer Product-based Neural Collaborative Filtering--IJCAI'18 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二 ...
- 【科研导向】Neural Collaborative Filtering 神经协同过滤 <论文理解代码分析>
Neural Collaborative Filtering--WWW'17 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二.难点问题 未来展望 文章简介 该文由何向南 ...
- 一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度
一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度 提示:最近系统性地学习推荐系统的课程.我们以小红书的场景为例,讲工业界的推荐系统. 我只讲工业界实际有用的技术. ...
- Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统
协同过滤常用于推荐系统,这项技术旨在填补 丢失的user-item关联矩阵 的条目,spark.ml目前支持基于模型的协同过滤(用一些丢失条目的潜在因素在描述用户和产品).spark.ml使用ALS( ...
最新文章
- zookeeper watches
- SpringMVC处理MYSQL BLOB字段的上传
- Modbus和RS485是什么关系
- 借钱年利息15%,借款人将房产证抵押并公证,有无风险?
- 【bzoj4145】[AMPPZ2014]The Prices 状压dp
- flex弹性盒子的兼容性写法
- [多媒体] m3u8简介
- 计算机中丢失无法开机密码,手把手教你“电脑开机密码忘记了,无法登录”的解决方法...
- 宝宝树小时光品牌升级:让宝宝从小爱上阅读
- c语言延时函数nop,延时函数怎么写delay
- 数据库查询结果随机排序
- 计算机财务模型管理实验内容,计算机财务管理实验报告详细分解.doc
- 技术管理 - 思维导图(补)
- 内存核心频率、工作频率,等效频率、总线频率
- 火车进出栈【卡特兰数】【高精度】【压位】【压int位】
- fix-下拉出现白条问题
- 开课吧java广告,开课吧Java面试题:虚引用与软引用和弱引用的区别
- B. Petya and Exam
- ubuntu下定时清理文件
- WIN10电脑桌面整理及其壁纸应用推荐
热门文章
- 32.C#--方法中使用out参数做登录判断
- glob及IO重定向
- CentOS 7 为firewalld添加开放端口及相关资料
- greenplum 安装笔记
- Sqlserver 如何获取每组中的第一条记录
- mysqldump导入导出mysql数据库
- TTThumbsViewController 由 4张 改为 3张的方式 增补
- Dos命令删除注册表项
- A Class For Executing MSSql Store Procedure
- 专插本跨考计算机科学与技术,2021年计算机科学与技术专业-计算机组成原理-考试大纲(专插本).docx...