推荐未尝过的菜肴-基于SVD的评分估计

实际上数据集要比我们上一篇展示的myMat要稀疏的多。

from numpy import linalg as la
from numpy import *

def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]

一、计算一下到底有多少个奇异值能达到总能量的90%(下一篇我们将用一个函数实现该功能)

U, Sigma, VT = la.svd(mat(loadExData2()))
Sigma

array([15.77075346, 11.40670395, 11.03044558,  4.84639758,  3.09292055,2.58097379,  1.00413543,  0.72817072,  0.43800353,  0.22082113,0.07367823])总能量:
Sig2 = Sigma ** 2 sum(Sig2)

541.9999999999995
总能量的90%:
sum(Sig2) * 0.9

487.7999999999996计算前两个元素所包含的能量:
sum(Sig2[:2])

378.8295595113579该值低于总能量的90%,计算前三个元素所包含的能量:
sum(Sig2[:3])

500.5002891275793该值高于总能量的90%,我们将一个11维的矩阵转换成一个三维的矩阵,下面对转换后的三维空间构造出一个相似度计算函数

二、相似度计算(欧式距离、皮尔逊相关系数、余弦相似度)

# 相似度计算
# 计算欧式距离
def ecludSim(inA, inB):return 1.0 / (1.0 + la.norm(inA - inB))# pearsim()函数会检查是否存在3个或更多的点
# corrcoef直接计算皮尔逊相关系数,范围[-1, 1],归一化后[0, 1]
def pearsSim(inA, inB):# 如果不存在,该函数返回1.0,此时两个向量完全相关if len(inA) < 3:return 1.0return 0.5 + 0.5 * corrcoef(inA, inB, rowvar=0)[0][1]# 计算余弦相似度,如果夹角为90度,相似度为0;如果两个向量的方向相同,相似度为1.0
def cosSim(inA, inB): num = float(inA.T * inB)denom = la.norm(inA) * la.norm(inB)return 0.5 + 0.5 * (num / denom)

三、基于SVD的评分估计

# 基于SVD的评分估计
# 在recommend()中,这个函数用于替换对standEst()的调用,该函数对给定用户、给定物品构建了一个评分估计值
def svdEst(dataMat, user, simMeas, item):"""svdEst()Args:dataMat  训练数据集user     用户编号simMeas  相似度计算方法item     未评分的物品编号Returns:ratSimTotal / simTotal   评分(0~5之间的值)"""# 物品数目n = shape(dataMat)[1]# 对数据集进行SVD分解simTotal = 0.0ratSimTotal = 0.0# 奇异值分解# 在SVD分解之后,我们只利用包含了90%能量值的奇异值,这些奇异值会以Numpy数组的形式得以保存U, Sigma, VT = la.svd(dataMat)# 如果要进行矩阵运算,就必须要用这些奇异值构建出一个对角矩阵Sig4 = mat(eye(4) * Sigma[: 4])# 利用U矩阵将物品转换到低维空间中,构建转换后的物品xformedItems = dataMat.T * U[:, :4] * Sig4.I# 对于给定的用户,for循环在用户对应行的元素上进行遍历# 这和standEst()函数中的for循环的目的一样,只不过这里的相似度计算是在低维空间下进行的for j in range(n):userRating = dataMat[user, j]if userRating == 0 or j == item:continue# 相似度的计算方法也会作为一个参数传递给该函数similarity = simMeas(xformedItems[item, :].T, xformedItems[j, :].T)# 对相似度不断累加求和simTotal += similarity# 对相似度及对应评分值的乘积求和ratSimTotal += similarity * userRatingif simTotal == 0:return 0else:# 计算估计评分return ratSimTotal/simTotal

四、排序获取最后的推荐结果

# recommend()函数,就是推荐引擎,它默认调用 svdEst()函数,产生了最高的N个推荐结果
# 如果不指定N的大小,则默认值为3,该函数另外的参数该包括相似度计算方法和估计方法
def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=svdEst):"""recommend()Args:dataMat 训练数据集user    用户编号simMeas 相似度计算方法estMethod 使用的推荐算法Returns:返回最终N个推荐结果"""# 寻找未评级的物品# 对给定用户建立一个未评分的物品列表unratedItems = nonzero(dataMat[user, :].A == 0)[1]# 如果不存在未评分物品,那么就退出函数if len(unratedItems) == 0:return 'you rated everything'# 物品的编号和评分值itemScores = []for item in unratedItems:# 获取 item 该物品的评分estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))# 按照评分得分,进行逆排序,获取前N个未评级物品进行推荐return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[: N]

myMat = mat(loadExData2())
recommend(myMat, 1, simMeas=pearsSim)

[(4, 3.346952186702173), (9, 3.33537965732747), (6, 3.3071930278130366)]
这表明用户1(从0开始计数,对应是矩阵第2行),对物品4的预测评分为3.34,对物品9预测评分为3.33,对物品6预测评分为3.30试试另一种相似度
recommend(myMat, 1, simMeas=cosSim)

[(4, 3.344714938469228), (7, 3.3294020724526967), (9, 3.3281008763900686)]

转载于:https://www.cnblogs.com/gezhuangzhuang/p/10205284.html

利用SVD-推荐未尝过的菜肴2相关推荐

  1. 机器学习实战(十四)利用SVD简化数据

    第十四章 利用SVD简化数据 14.1 SVD的应用 14.1.1 隐形语义索引 14.1.2 推荐系统 14.2 矩阵分解(SVD矩阵分解) 14.3 利用python实现SVD 14.4 基于协同 ...

  2. SVDchapter14 机器学习之利用SVD简化数据

    餐馆可划分为很多类别,比如美式.中式.日式.牛排馆.素食店,等等.你是否想过这些 类别够用吗?或许人们喜欢这些的混合类别,或者类似中式素食店那样的子类别.如何才能知道 到底有多少类餐馆呢?我们也许可以 ...

  3. svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法

    奇异值分解(Singular Value Decomposition,以下简称SVD) 是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域. ...

  4. eq值 推荐算法_利用 SVD 实现协同过滤推荐算法

    奇异值分解(Singular Value Decomposition,以下简称SVD) 是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域. ...

  5. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生物 ...

  6. svd奇异值分解_传统推荐算法(一)SVD推荐(1)解读奇异值分解

    文章目录 写在前面 1. 从几何变换到奇异值分解 2. 代数角度理解奇异值与奇异向量 2.1 从正交基映射推导SVD 2.2 特征值分解求解奇异值和奇异向量 2.2.1 求解过程 2.2.2 推论 2 ...

  7. chapter14 机器学习之利用SVD简化数据

    餐馆可划分为很多类别,比如美式.中式.日式.牛排馆.素食店,等等.你是否想过这些 类别够用吗?或许人们喜欢这些的混合类别,或者类似中式素食店那样的子类别.如何才能知道 到底有多少类餐馆呢?我们也许可以 ...

  8. 【机器学习线性代数】17 利用SVD进行彩色图片压缩

    这一节,我们再来介绍一个奇异值分解的实际案例:即如何基于SVD的主成分分析方法,来对一张彩色图像进行压缩处理. 1.图像的数据表示 很明显,如果要对一张图像进行压缩,首先我们得知道应该如何用数据的形式 ...

  9. 全球主流社交媒体算法解析:Facebook、YouTube、Twitter如何利用算法推荐内容?

    今日头条.抖音推荐算法原理全文详解 作者 Ste Davies (转载自"腾讯媒体研究院") 在如今的世界中,算法已经成为了我们日常生活的核心.当你进行网络搜索,滚动浏览社交媒体上 ...

最新文章

  1. Java虚拟机学习(3): 类加载机制
  2. efcore调用函数_如何在EF Core 使用存储过程
  3. 让版面充满空间感的海报PSD分层模板,你一定要看看!
  4. 开发日记:接口开发设计
  5. C++--第10课 - 构造与析构 - 下
  6. 微型计算机系统中传感器的作用,一文读懂传感器原理、作用及技术特点
  7. html滚动字幕源码,网页HTML代码:滚动文字的制作
  8. 5G及移动边缘计算(MEC)学习笔记(2)
  9. python图表制作方法_python图表制作
  10. QGC使用国内天地图卫星图并添加注记图层
  11. UWP应用解除网络限制
  12. CPU 是怎样工作的
  13. 音视频常见术语和接口收集
  14. Unity 0.Interactive Tutorials
  15. 用网易云短信实现短信验证码功能
  16. “长宽高”不设限,中软国际带你在云上“乘风破浪”
  17. 天问51单片机结合WIFI模块上传温度数据到巴法云平台
  18. 分裂布雷格曼方法--(Split Bregman Method)
  19. 计算机操作系统原理第二章习题
  20. php获取网址怎么缩短,PHP网址缩短代码(生成短网址)_PHP教程

热门文章

  1. mysql居左查询abcd_数据库--查询语句
  2. oracle的主目录怎么删除,删除oracle数据库卸载
  3. django url 生效_Django基础知识
  4. oracle表重命名 索引,CSS_在Oracle数据库中按用户名重建索引的方法,如果你管理的Oracle数据库下某 - phpStudy...
  5. 论文遇到的格式问题和修正方式
  6. 使用openssl完成aes-cbc模式的数据加解密,输入和输出都是字符串的形式
  7. mininet 应用实践
  8. IDEA 创建 SpringBoot 项目
  9. SQL零基础学习笔记(一)
  10. 高级程序员如何面对职场压力?(2)--受伤的总是我