机器学习-SVD(隐语义模型)协同过滤
SVD(隐语义模型)协同过滤
隐语义模型,数学上称为SVD,奇异值分解。该算法最早在文本挖掘领域被提出,用于找到文章的隐含主题,也被称为主题模型。
隐语义模型的核心思想是通过隐含特征(Latent Factor)计算用户和物品的相似性。
SVD是将矩阵A分解成以下形式
A=U∑VT
其中U和V均为单位正交阵,UUT=E, VVT=E, U称为左奇异矩阵,V称为右奇异矩阵,∑仅在对角线上有值,我们称之为奇异值,其他值均为0.
维度:U:m*m V:n*n ∑:m*n
关于相似性的计算存在一些问题
1.物品的人为分类对推荐算法造成影响。分类是人为指定的,不同的分类标准对不同的用户带来预测精度的问题
2.类中物品的相似度是一个消费行为的问题,需要针对不同的用户确定不同的权重,这样做的可能性不大
3.即使能够构建权重和分类,也不能完全确定某个用户对某类产品感兴趣的程度。
因此,我们需要一种针对每类用户的不同消费行为来计算对不同物品的相似度的算法。
假设有一个新用户E,对物品的评分为[5,5,0,0,0,5].现在在现有矩阵中找出与其最相似的用户,并把这个用户感兴趣的物品推荐给新用户。
使用夹角余弦求用户之间的相似度,即选中与新用户之间夹角最小(余弦值)最大的那个。
from numpy import *
import numpy as np# 夹角余弦距离公式
def cosSim(inA, inB):denom = linalg.norm(inA) * linalg.norm(inB)return float(inA * inB.T) / (denom + eps)A = mat([[5, 5, 3, 0, 5, 5], [5, 0, 4, 0, 4, 4], [0, 3, 0, 5, 4, 5], [5, 4, 3, 3, 5, 5]]) # 其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。 U, S, VT = linalg.svd(A) print(S) # 避免除0 eps = 1.0e-6 # 新数据 new = mat([[5,5,0,0,0,5]]) U,S,VT = linalg.svd(A.T) V = VT.T # 对角矩阵(diagonal matrix)是一个主对角线之外的元素皆为0的矩阵,常写为diag Sigma = diag(S) r = 2 # 取前两个奇异值 # 得到金丝猴的U\S\V值 Ur = U[:,:r] Sr = Sigma[:r,:r] Vr = V[:,:r] newresult = new*Ur*linalg.inv(Sr) # 计算User E的坐标值 print(newresult) maxv = 0 # 最大的余弦值 maxi = 0 # 最大值的下标 indx = 0 for vi in Vr: temp = cosSim(newresult, vi) if temp > maxv: maxv = temp maxi = indx indx += 1 print(maxv,maxi)
[[-0.37752201 -0.08020351]]
0.9867908785596432 0
稍微封装下
from numpy import *
# 夹角余弦距离公式
def cosSim(inA, inB):eps = 1.0e-6denom = linalg.norm(inA) * linalg.norm(inB)return float(inA * inB.T) / (denom + eps)# dataSet:训练集
# testVect:测试集
# r:取前r个近似值
# rank:结果排序
# distCalc: 相似度计算函数
def recommand(dataSet, testVect, r=3, rank=1, distCalc=cosSim): m,n = shape(dataSet) limit = min(m, n) if r > limit: r = limit U,S,VT = linalg.svd(dataSet.T) # SVD分解 V = VT.T # 取前r个U\S\V值 Ur = U[:, :r] Sr = diag(S)[:r, :r] Vr = V[:, :r] testresult = testVect * Ur * linalg.inv(Sr) # 计算User E的坐标值 resultarray = array([distCalc(testresult, vi) for vi in Vr]) descindx = argsort(-resultarray)[:rank] # 结果排序,降序 return descindx, resultarray[descindx] # 排序后的索引和值 A = mat([[5, 5, 3, 0, 5, 5], [5, 0, 4, 0, 4, 4], [0, 3, 0, 5, 4, 5], [5, 4, 3, 3, 5, 5]]) # 新数据 new = mat([[5,5,0,0,0,5]]) indx, resultarray = recommand(A, new, r=2, rank=2,distCalc=cosSim) # 索引值 print(indx) # 相似度 print(resultarray)
[0 3]
[0.98679088 0.95536738]
计算后得知,与之相似的用户坐标为0,即[5,5,3,0,5,5].此时可将该用户的第三、五个物品推荐给新用户
与第一个用户的相似度为98.68%, 与第四个用户的相似度为95.53%
SVD取前部分奇异值复原图片
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
# 读取图片
# img_eg = mpimg.imread("/Users/FengZhen/Desktop/image/bing/road.jpeg")
img_eg = mpimg.imread("/Users/FengZhen/Desktop/image/timg.jpeg")
print(img_eg.shape)
# 奇异值分解
# 我们先将图片变成500×2250,再做奇异值分解。从svd函数中得到的奇异值sigma它是从大到小排列的。
img_temp = img_eg.reshape(500, 750 * 3)
U,Sigma,VT = np.linalg.svd(img_temp)
# 取前部分奇异值重构图片
# 取前60个奇异值
sval_nums = 60
img_restruct1 = (U[:, 0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums, :])
img_restruct1 = img_restruct1.reshape(500, 750, 3)
# 取前120个奇异值
sval_nums = 120
img_restruct2 = (U[:, 0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums, :])
img_restruct2 = img_restruct2.reshape(500, 750, 3)
# 取前180个奇异值
sval_nums = 180
img_restruct3 = (U[:, 0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums, :])
img_restruct3 = img_restruct3.reshape(500, 750, 3)
fig, ax = plt.subplots(1, 4, figsize=(24, 32))
ax[0].imshow(img_eg)
ax[0].set(title="src")
ax[1].imshow(img_restruct1.astype(np.uint8))
ax[1].set(title="nums of sigma = 60")
ax[2].imshow(img_restruct2.astype(np.uint8))
ax[2].set(title="nums of sigma = 120")
ax[3].imshow(img_restruct3.astype(np.uint8))
ax[3].set(title="nums of sigma = 180")
原图
分别取前60、120、180个奇异值复原的图片如下
机器学习-SVD(隐语义模型)协同过滤相关推荐
- 基于SVD++隐语义模型的信任网络推荐算法
点击上方蓝字关注我们 基于SVD++隐语义模型的信任网络推荐算法 陈佩武1, 束方兴2 1 平安科技(深圳)有限公司,广东 深圳 518031 2 北京大学互联网研究院(深圳),广东 深圳 51805 ...
- 【机器学习】--隐语义模型
一.前述 隐语义模型是近年来推荐系统领域较为热门的话题,它主要是根据隐含特征将用户与物品联系起来. 因为用户和物品之间有着隐含的联系.所以把用户转成隐语义,然后物品转成隐语义组合,通过中介隐含因子连接 ...
- 【推荐系统(二)】协同过滤之隐语义模型(LFM)
文章目录 一.引例 二.LFM 主要思想 训练样本构造 损失函数定义 参数学习 调参相关 三.小结 优点 缺点 基于用户行为分析的推荐算法一般称为协同过滤算法.所谓协同过滤,就是指众多的用户可以齐心协 ...
- 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐
[ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...
- 电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取
文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...
- 推荐算法!基于隐语义模型的协同过滤推荐之用户商品推荐列表
项目采用ALS作为协同过滤算法,根据MongoDB中的用户评分表计算离线的用户商品推荐列表以及商品相似度矩阵. 通过ALS训练出来的Model来计算所有当前用户商品的推荐列表,主要思路如下: 1. u ...
- Python推荐系统学习笔记(1)基于协同过滤的个性化推荐算法实战---隐语义模型
一.相关概念: 1.隐语义模型(LFM) 通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系. 假设我们想要发现 F 个隐类, 我们的任务就是找到两个矩阵 U 和 ...
- 隐语义模型 VS 协同过滤
隐语义模型 从数据出发,进行个性化推荐 用户和数据之间有着隐含的联系 隐含因子让计算机能理解就好 将用户和物品通过中介隐含因子联系起来 分解-组合 F隐藏因子 隐语义模型求解 梯度下降方向 迭代求解 ...
- 电商推荐系统四: 基于隐语义模型的协同过滤推荐
四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 目录 四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 4.1 离线推荐服务 4.2 离线统计服务 4.3 基于隐语义模型的协同过滤推荐 4. ...
- 协同过滤算法----隐语义模型
1. 协同过滤(CF) 协同过滤分基于用户和基于物品的协同过滤,不管哪种方式,计算步骤如下: I. 收集用户偏好 II. 找到相似的用户或物品 III. 计算推荐 所谓的用户偏好就是:用户与物品之间的 ...
最新文章
- 河南省2013年对口高考 计算机类专业课试题卷答案,河南省对口高考计算机专业课模拟试卷3...
- C++11中的bool变量不进行初始化,结果随机,可能是false也可能是true,所以一定要初始化
- 说了这么多次 I/O,可你知道其中的原理么
- 原子设计_您需要了解的有关原子设计的4件事
- ThinkPad X220i 刷白名单BIOS,改装第三方无线网卡
- NSGA2算法及其代码
- python:容器、迭代器、生成器 简单介绍
- 卡巴斯基实验室2017年威胁预测
- android手机闹钟程序,Android手机闹钟用法实例
- android沉浸式状态理解
- godot着色器shader效果收集
- 包的概念与常见内置模块
- android 浏览器隐藏地址,移动端隐藏手机浏览器的地址栏一下底部的菜单栏
- Bridging the Gap between Training and Inference for Neural Machine Translation翻译
- 必须得会的汽车ECU研发基础—软件开发流程6
- kingcms企业(php) 9.0下载,[下载]地方门户 9.0(K9地方门户版)_KingCMS官方网站
- AlignedReID: Surpassing Human-Level Performance in Person Re-Identification
- 搭建嵌入式ARM完整系统
- 大数据建设意义_大数据技术平台建设方案(ppt)
- VSCode:python import下载的第三方库,报错问题解决
热门文章
- react native Switch使用详解
- php第三方微信app支付接口开发,PHP开发APP微信支付接口
- LGTM : code review 行话
- msm8953 PWM背光
- 解决TCP延迟应答(Delay ACK)问题的3个小Trick
- iOS7官方推荐图标和图像尺寸
- 嘉腾发布“守护者I”抗疫机器人
- 2021年中国大企业创新百强排行榜:华为位居榜首,北京上榜企业最多(附年榜TOP100详单)
- php px与rem转换,pt 与 px、em、rem 的区别与换算
- “Java:詹姆斯?”