一文深入理解协同过滤

写在之前…
从这篇文章开始,我的下一个算法职业生涯方向将专注于推荐算法…

看了那么多书和代码,还是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 阅读(...) 评论(...) 编辑 收藏

一文深入理解协同过滤相关推荐

  1. 05-机器学习_(协同过滤推荐算法与应用)---没用

    机器学习算法day03_协同过滤推荐算法及应用 课程大纲 协同过滤推荐算法原理 协同过滤推荐算法概述 协同过滤推荐算法思想 协同过滤推荐算法分析 协同过滤推荐算法要点 协同过滤推荐算法实现 协同过滤推 ...

  2. 从原理到落地,七大维度读懂协同过滤推荐算法

    作者丨gongyouliu 来源 | 大数据与人工智能 导语:本文会从协同过滤思想简介.协同过滤算法原理介绍.离线协同过滤算法的工程实现.近实时协同过滤算法的工程实现.协同过滤算法应用场景.协同过滤算 ...

  3. 推荐系统笔记:基于模型的协同过滤

    1 介绍 基于邻域的协同过滤方法可以看作是机器学习中常用的k-最近邻分类器KNN的泛化. 这些方法是基于实例的方法,因此,除了可选的预处理阶段之外,没有专门为预测预先创建模型. 推荐系统笔记:Intr ...

  4. 矩阵sum_推荐系统——从协同过滤到矩阵分解

    本文简单扼要地介绍推荐算法中的两种经典算法:协同过滤和矩阵分解.内容有以下三部分 协同过滤算法 矩阵分解 协同过滤与矩阵分解的关系 早期的推荐系统以业务理解为核心,通过复杂的规则描述来向用户推荐商品, ...

  5. 协同过滤算法深入解析:构建智能推荐系统的核心技术

    一.前言 二.协同过滤算法简介 三.基于用户的协同过滤 3.1 用户相似度计算 3.2 预测用户评分 四.基于物品的协同过滤 4.1 物品相似度计算 4.2 预测用户评分 五.矩阵分解方法 5.1 奇 ...

  6. 【科研导向】Outer Product-based Neural Collaborative Filtering (ConvNCF)基于外积的神经协同过滤<论文理解代码分析>

    Outer Product-based Neural Collaborative Filtering--IJCAI'18 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二 ...

  7. 【科研导向】Neural Collaborative Filtering 神经协同过滤 <论文理解代码分析>

    Neural Collaborative Filtering--WWW'17 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二.难点问题 未来展望 文章简介 该文由何向南 ...

  8. 一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度

    一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度 提示:最近系统性地学习推荐系统的课程.我们以小红书的场景为例,讲工业界的推荐系统. 我只讲工业界实际有用的技术. ...

  9. Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统

    协同过滤常用于推荐系统,这项技术旨在填补 丢失的user-item关联矩阵 的条目,spark.ml目前支持基于模型的协同过滤(用一些丢失条目的潜在因素在描述用户和产品).spark.ml使用ALS( ...

最新文章

  1. zookeeper watches
  2. SpringMVC处理MYSQL BLOB字段的上传
  3. Modbus和RS485是什么关系
  4. 借钱年利息15%,借款人将房产证抵押并公证,有无风险?
  5. 【bzoj4145】[AMPPZ2014]The Prices 状压dp
  6. flex弹性盒子的兼容性写法
  7. [多媒体] m3u8简介
  8. 计算机中丢失无法开机密码,手把手教你“电脑开机密码忘记了,无法登录”的解决方法...
  9. 宝宝树小时光品牌升级:让宝宝从小爱上阅读
  10. c语言延时函数nop,延时函数怎么写delay
  11. 数据库查询结果随机排序
  12. 计算机财务模型管理实验内容,计算机财务管理实验报告详细分解.doc
  13. 技术管理 - 思维导图(补)
  14. 内存核心频率、工作频率,等效频率、总线频率
  15. 火车进出栈【卡特兰数】【高精度】【压位】【压int位】
  16. fix-下拉出现白条问题
  17. 开课吧java广告,开课吧Java面试题:虚引用与软引用和弱引用的区别
  18. B. Petya and Exam
  19. ubuntu下定时清理文件
  20. WIN10电脑桌面整理及其壁纸应用推荐

热门文章

  1. 32.C#--方法中使用out参数做登录判断
  2. glob及IO重定向
  3. CentOS 7 为firewalld添加开放端口及相关资料
  4. greenplum 安装笔记
  5. Sqlserver 如何获取每组中的第一条记录
  6. mysqldump导入导出mysql数据库
  7. TTThumbsViewController 由 4张 改为 3张的方式 增补
  8. Dos命令删除注册表项
  9. A Class For Executing MSSql Store Procedure
  10. 专插本跨考计算机科学与技术,2021年计算机科学与技术专业-计算机组成原理-考试大纲(专插本).docx...