机器学习实战之SVD

2023-11-05

1. 奇异值分解 SVD(singular value decomposition)

1.1 SVD评价

   优点: 简化数据, 去除噪声和冗余信息, 提高算法的结果

   缺点: 数据的转换可能难以理解

1.2 SVD应用

(1) 隐性语义索引(latent semantic indexing, LSI)/隐性语义分析(latent semantic analysis, LSA)

      在LSI中, 一个矩阵由文档和词语组成的.在该矩阵上应用SVD可以构建多个奇异值, 这些奇异值代表文档中的概念或主题, 可以用于更高效的文档搜索.

(2) 推荐系统

      先利用SVD从数据中构建一个主题空间, 然后在该主题空间下计算相似度.

1.3 SVD分解

     SVD是一种矩阵分解技术,其将原始的数据集矩阵A(m*n)分解为三个矩阵, ,分解得到的三个矩阵的维度分别为m*m,m*n,n*n.其中除了对角元素不为0,其它元素均为0,其对角元素称为奇异值,且按从大到小的顺序排列, 这些奇异值对应原始数据集矩阵A的奇异值,即A*A(T)的特征值的平方根.

     在某个奇异值(r个)之后, 其它的奇异值由于值太小,被忽略置为0, 这就意味着数据集中仅有r个重要特征,而其余特征都是噪声或冗余特征.如下图所示:

问题: 如何选择数值r?

解答: 确定要保留的奇异值数目有很多启发式的策略,其中一个典型的做法就是保留矩阵中90%的能量信息.为了计算能量信息,将所有的奇异值求其平方和,从大到小叠加奇异值,直到奇异值之和达到总值的90%为止;另一种方法是,当矩阵有上万个奇异值时, 直接保留前2000或3000个.,但是后一种方法不能保证前3000个奇异值能够包含钱90%的能量信息,但是操作简单.

****SVD分解很耗时,通过离线方式计算SVD分解和相似度计算,是一种减少冗余计算和推荐所需时间的办法.

2. 基于协同过滤的推荐引擎

2.1 定义

       协同过滤是通过将用户和其他用户的数据进行对比来实现推荐的.

       例如: 试图对某个用户喜欢的电影进行预测,搜索引擎会发现有一部电影该用户还没看过,然后它会计算该电影和用户看过的电影之间的相似度, 如果相似度很高, 推荐算法就会认为用户喜欢这部电影.

       缺点: 在协同过滤情况下, 由于新物品到来时由于缺乏所有用户对其的喜好信息,因此无法判断每个用户对其的喜好.而无法判断某个用户对其的喜好,也就无法利用该商品.

2.2 相似度计算

协同过滤利用用户对食物的意见来计算相似度,下图给出了一些用户对菜的评级信息所组成的矩阵:

定义相似度在0-1之间变化,且物品对越相似,其相似度值越大,可以使用公式  相似度 = 1/(1 + 距离)   来计算相似度.

计算距离的方法如下:

(1) 欧氏距离

(2)皮尔逊相关系数(pearson correlation)

    度量两个向量间的相似度,该方法优于欧氏在于其对用户评级的量级不敏感,例如某个人对所有物品的评分都是5分,另一个人对所有物品评分都是1分,皮尔逊相关系数认为这两个评分向量是相等的. 不过皮尔逊相关系数的取值范围是(-1,1),通过0.5 + 0.5 * corrcoef()将其归一化到0-1之间.

(3) 余弦相似度( cosine similarity)

    计算的是两个向量夹角的余弦值.其取值范围是(-1,1),因此也要将其归一化到(0,1)区间.

以下是这三种相似度计算方法的代码实现:

<span style="font-size:18px;">def eulidSim(in1,in2):
	return 1.0/(1.0+la.norm(in1-in2))

def pearsonSim(in1,in2):
	if len(in1) < 3: #检查是否存在3个或更多的点,小于的话,这两个向量完全相关
		return 1.0
        return 0.5 + 0.5 * corrcoef(in1,in2,rowvar = 0)[0][1]

</span><span style="font-size:18px;"> def cosSim(in1,in2):
	num = float(in1.T * in2)
	denom = la.norm(in1) * la.norm(in2)
	return 0.5 + 0.5 * (num/denom)
</span>
2.3 餐馆菜推荐引擎

(1) 用处: 推荐餐馆食物. 给定一个用户, 系统会为此用户推荐N个最好的推荐菜.为了实现这一目的,要做到:

  • 寻找用户没有评级的菜, 即在用户-物品矩阵中的0值;
  • 在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数.
  • 对这些物品的评分从高到低进行排序,返回前n个物品

下面是实现代码:

<span style="font-size:18px;">#计算在给定相似度计算方法的条件下,用户user对物品item的估计评分值
def standEst(dataMat,user,simMea,item):
	n = shape(dataMat)[1]
	simTotal = 0.0 
	ratSimTotal = 0.0
	for j in range(n):
		userRate = dataMat[user,j]
		if userRate == 0 :
			continue
		#得到对菜item和j都评过分的用户id,用来计算物品item和j之间的相似度
		overlap = nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
		if len(overlap) == 0:
			similarity = 0
		else:
			#计算物品item和j之间的相似度(必须选取用户对这两个物品都评分的用户分数构成物品分数向量)
			similarity = simMea(dataMat[overlap,item],dataMat[overlap,j]) 
		simTotal += similarity
		ratSimTotal += similarity * userRate
	if simTotal ==0:
		return 0
	else:
		return ratSimTotal/simTotal  #归一化处理

#输入依次是数据矩阵,用户编号,返回的菜的个数,距离计算方法,获得物品评分的函数
def recommend(dataMat,user,n=3,simMea=cosSim,estMethod=standEst):
	#返回user用户未评分的菜的下标	
	unratedItem = nonzero(dataMat[user,:].A == 0)[1]
	if(len(unratedItem) == 0):
		return 'you rated every one'
	
	itemScore = []
	#对每个没评分的菜都估计该用户可能赋予的分数
	for item in unratedItem:
		score = estMethod(dataMat,user,simMea,item)
		itemScore.append((item,score))
	
	#返回评分最高的前n个菜下标以及分数
	return sorted(itemScore, key = lambda jj:jj[1],reverse = True)[:n]</span>
2.4 利用SVD提高推荐效果

    实际的数据集得到的矩阵相当稀疏,因此可以先利用SVD将原始矩阵映射到低维空间中,; 然后再在低维空间中, 计算物品间的相似度,大大减少计算量.

其代码实现如下:

<span style="font-size:18px;">#通过SVD对原始数据矩阵降维,便于计算物品间的相似度
def scdEst(dataMat,user,simMea,item):
	n = shape(dataMat)[1]
	simTotal = 0.0 
	ratSimTotal = 0.0

	u,sigma,vt = la.svd(dataMat) #sigma是行向量
	sig4 = mat(eye(4) * sigma[:4]) #只利用最大的4个奇异值,将其转换为4*4矩阵,非对角元素为0
	xformedItems = dataMat.T * u[:,:4] * sig4.I #得到n*4

	for j in range(n):
		userRate = dataMat[user,j]
		if userRate == 0  or j == item:
			continue
		#得到对菜item和j都评过分的用户id,用来计算物品item和j之间的相似度
		#overlap = nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
		#if len(overlap) == 0:
		#	similarity = 0
		#else:
			#计算物品item和j之间的相似度
		#	similarity = simMea(dataMat[overlap,item],dataMat[overlap,j]) 
		similarity = simMea(xformedItems[item,:].T,xformedItems[j,:].T)
		simTotal += similarity
		ratSimTotal += similarity * userRate
	if simTotal ==0:
		return 0
	else:
		return ratSimTotal/simTotal  #归一化处理</span>
3. 基于SVD的图像压缩

<span style="font-size:18px;">#打印矩阵
def printMat(in1,thresh=0.8):
	for i in range(32):
		for k in range(32):
			if(float(in1[i,k]) > thresh):
				print 1,
			else:
				print 0,
		print ''

#利用SVD实现图像压缩,允许基于任意给定的奇异值来重构图像,默认去前3个奇异值
def imgCompress(numSV=3,thresh=0.8):
	#32*32 matrix	
	my1 = []
	for line in open('0_5.txt').readlines():
		newrow = []
		for i in range(32):
			newrow.append(int(line[i]))
		my1.append(newrow)
	myMat = mat(my1)
	print '***original matrix***'
	printMat(myMat)

	u,sigma,vt = la.svd(myMat)
	#将sigma矩阵化,即sigrecon的对角元素是sigma的元素
	sigrecon = mat(zeros((numSV,numSV)))
	for k in range(numSV):
		sigrecon[k,k] = sigma[k]

	#重构矩阵
	reconMat = u[:,:numSV] * sigrecon * vt[:numSV,:]

	print '***reconstruct matrix***'
	printMat(reconMat)</span>

以数字为例:数字0存储为32*32的矩阵,需要存储1024个数据; 通过实验发现只需要2个奇异值就能够很精确地对图像进行重构,u,vt的大小都是32*2的矩阵,再加上2个奇异值,则需要32*2*2+2=130个0-1值来存储0;通过对比发现,实现了几乎10倍的压缩比.



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习实战之SVD 的相关文章

  • SVD进行图像压缩案例

    理论部分参考这篇文章 xff0c 写的非常好 本文主要是直观感受一下SVD对图像进行压缩的作用 案例图片如下 xff08 PS 图片为华山 xff0c 拍摄于2023 4 29 xff09 1 首先需要将上述图片转换为矩阵 xff0c 利用
  • 特征值分解(Eigen Value Decomposition,EVD)、奇异值分解(Singular Value Decomposition,SVD)原理、公式推导及应用

    1 正交矩阵 正交变换 正交变换是保持图形形状和大小不变的几何变换 包含旋转 平移 轴对称及这些变换的复合形式 正交变换可以保持向量的长度和向量之间的角度不变 特别的 标准正交基经正交变换后仍为标准正交基 在有限维的空间中 正交变换在标准正
  • 时序分解

    时序分解 MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 MATLAB实现基于SVD奇异值分解的信号分解分量可视化 效果一览 基本介绍 程序设计 参考资料 效果一览 基本介绍 SVD分解重构算法 MATLAB程序
  • C++SVD分解求伪逆 (Eigen库)(附C++代码)

    SVD求解矩阵伪逆过程 首先对矩阵A进行SVD分解得到U D V三个矩阵 其中D为列矩阵 是从上到下 由大到小排列的A矩阵的奇异值 若D矩阵中元素个数为n则原矩阵有n个奇异值 构建大小为V cols U cols 的S矩阵 其中S矩阵的前n
  • 基于python 和 matlab的矩阵奇异值分解

    https www cnblogs com pinard p 6251584 html 可参考 一个 mxn的矩阵H可以分解为 U mxm S mxn V nxn 三个矩阵的乘积 这就是奇异值分解 S是一个对角矩阵 一般从大到小排列 S的元
  • 机器学习实战之Apriori

    1 关联分析 1 1 定义 关联分析是一种在大规模数据上寻找物品间隐含关系的一种任务 这种关系有2种形式 频繁项集和关联规则 1 频繁项集 frequent item sets 经常出现在一起的物品的集合 2 关联规则 associatio
  • PCA、SVD、谱聚类

    PCA SVD 谱聚类 1 PCA 2 SVD 3 LDA 4 谱聚类 4 1 无向权重图 4 2 相似矩阵 4 3 拉普拉斯矩阵 4 4 无向图切图 附录1 秩 和 特征值 附录2 协方差 附录3 卡方检验 1 PCA 所谓降维 就是要把
  • 基于matlab的矩阵奇异值(SVD)分解

    目录 1 计算原理 1 1求解V 1 2求解D 1 3求解U 2 MATLAB程序 2 1 注意 1 计算原理 设矩阵A的大小m n m gt n A UD 1 1求解V 首先求出的特征值及特征值 对应的正交单位特征向量 将的特征值从大到小
  • 实用常识

    WolframAlpha是开发计算数学应用软件的沃尔夫勒姆 Wolfram 研究公司基于科学计算软件Mathematica开发出的新一代的搜索引擎 试图挑战Google搜索引擎的地位 能根据问题直接给出标准化答案的网站 比如输入一种材料名称
  • python 中的稀疏矩阵 svd

    有谁知道如何在 python 中对稀疏矩阵执行 svd 运算 scipy sparse linalg 中似乎没有提供这样的功能 听上去像稀疏向量这就是您正在寻找的 SVDLIBC 有效地封装在 Python 中 无需在 RAM 中创建额外的
  • 计算矩阵的零空间

    我正在尝试求解 Ax 0 形式的一组方程 A 是已知的 6x6 矩阵 我使用 SVD 编写了以下代码来获取在一定程度上有效的向量 x 答案大致正确 但不足以对我有用 我怎样才能提高计算的精度 将 eps 降低到 1 e 4 以下会导致函数失
  • 比较 R 中的 svd 和 princomp

    我想要得到singular values of a matrix in R获取主成分 然后也使用 princomp x 来比较结果 我知道 princomp 会给出主要成分 Question 如何从 d u 和 v 中获取主成分 解决方案s
  • 在 python 3 中从 SVD 重建矩阵

    你好 基本上我的问题是我有一个矩阵 我已经对其进行了 SVD 分解 并将其放入变量 u s 和 v 中 我对 s 矩阵进行了一些更改 使其成为对角线 并更改了一些号码 现在我基本上试图将它从 3 个矩阵重建为一个规则矩阵 然后返回到原始矩阵
  • 使用 Mathnet 数字库进行 Svd 重组似乎是错误的

    我正在寻找 Mathnet Iridium 和 Mathnet Numerics 之间的非回归 这是我的代码 使用 Mathnet Numerics double symJaggedArray new double 5 symJaggedA
  • MATLAB eig 有时会返回倒号

    我正在尝试编写一个获取矩阵的程序A任何大小 SVD 分解它 A U S V Where A是用户输入的矩阵 U是由特征向量组成的正交矩阵A A S是奇异值的对角矩阵 并且V是特征向量的正交矩阵A A 问题是 MATLAB 函数eig有时会返
  • 通过 SVD 从基本矩阵中提取翻译的正确方法

    我校准了相机并找到了内部参数 K 我还计算了基本矩阵 F 现在 E K T F K 到目前为止 一切都很好 现在我们将基本矩阵 E 传递给 SVD 以使用分解值 U W V 来提取旋转和平移 essentialMatrix K Transp
  • SVD算法实现

    有谁知道 C 上 SVD 对于非常大的矩阵的良好可扩展实现吗 ILNumerics net http ilnumerics net 似乎有 SVD 除其他外 功能列表 http ilnumerics net main php site 21
  • 对具有大量零特征的数据进行归一化/标准化是否有利

    我拥有大约 60 个特征的数据 在我的训练数据中 大多数情况下大多数情况下都为零 只有 2 3 列可能有值 准确地说是其性能日志数据 但是 我的测试数据在其他一些列中会有一些值 我已经完成了归一化 标准化 分别尝试了两者 并将其提供给 PC
  • 为什么 Octave、R、Numpy 和 LAPACK 在同一矩阵上产生不同的 SVD 结果?

    我使用 Octave 和 R 通过一个简单的矩阵来计算 SVD 并得到两个不同的答案 代码如下 R gt a lt matrix c 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
  • 仅使用 CUDA 进行奇异值计算

    我正在尝试使用新的cusolverDnSgesvdCUDA 7 0 用于计算奇异值的例程 完整代码如下 include cuda runtime h include device launch parameters h include

随机推荐

  • python 数据类型及转换

    常见的数据类型 使用 type 内置类可以查看变量所对应的类型 int 整数 十进制 二进制 使用0b开始表示 八进制 使用 0o 开始 十六进制 使用 0x 开始 float 浮点数 complex 复数 str 字符串 就是一段普通的文
  • 竞赛题-6258. 数组中最长的方波

    题目 给你一个整数数组 nums 如果 nums 的子序列满足下述条件 则认为该子序列是一个 方波 子序列的长度至少为 2 并且 将子序列从小到大排序 之后 除第一个元素外 每个元素都是前一个元素的 平方 返回 nums 中 最长方波 的长
  • gcc -Wall详解

    当GCC在编译过程中检查出错误的话 它就会中止编译 但检测到警告时却能继续编译生成可执行程序 因为警告只是针对程序结构的诊断信息 它不能说明程序一定有错误 而是存在风险 或者可能存在错误 虽然GCC提供了非常丰富的警告 但前提是你已经启用了
  • j2ee_XML建模

    1 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 ConfigModel ActionModel ForwardModel 2 利用d
  • ifconfig、ip addr、ip route用法总结

    最近使用haproxy keepalived 负载均衡 发现虚拟IP有问题 配置文件里配的VIP是 4 143 但是执行 ip a 发现还有一个虚拟IP 4 134 应该是以前配置文件keepalived conf里设置过VIP 4 134
  • 做大模型时代的应用层创业!

    Datawhale创业 方向 大模型 合作伙伴 Datawhale 亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generat
  • python写路径时候的问题————转载ningqingzy的文章

    作为笔记总结学习 如有侵权 立马删除 总结有三种方法 更换为绝对路径的写法 func1 C Users renyc 显式声明字符串不用转义 加r func1 r C Users renyc 使用Linux的路径 func1 C Users
  • 数仓 - hive ,身份证和手机号 匹配 - 正则方式

    数仓 hive 身份证和手机号 匹配 正则方式 身份证 内容校验 身份证号字段 regexp 1 9 0 9 14 1 9 0 9 16 0 9xX 长度校验 and length trim 身份证号字段 15 or length trim
  • MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

    一 模糊查询 1 1 like xxx 的方式模糊查询 根据用户名进行模糊查询 param username return java util List
  • activiti 6.x 多实例加签(如有不足留言指出)

    最近刚接触activiti 用的6 x 网上资料太少 断点追流程看属性写了个加签的操作 目前测试的没啥问题 如有问题 请留言指教 上代码 完事之后三个表查查有没有新增数据 有就成了 多实例的才能复制 调用之前最好先判断下 protected
  • 7个程序员常用的接单平台推荐

    推荐7个程序员常用的接单平台 不管做兼职 副业 还是全职自由职业 都可能会用到下面几个网站 特别推荐第一个 飞援 地址链接 前端开发外包 小程序开发兼职 程序员兼职平台 飞援 程序员远程灵活用工平台 聚集了高质量的兼职和全职自由职业开发者
  • sklearn学习笔记

    1 波士顿房价线性回归模型 from sklearn import datasets from sklearn linear model import LinearRegression boston datasets load boston
  • 语法基础——Objective-C语法基础

    前言 学习过Swift之后 好久没用已经生疏了 现在有项目来了 不得不停下手下的工作 开始学习OC 当然这篇文章会以Java基础和C基础作为支撑 这样学习起来入门很简单 可能这篇文章有点个人主义 用作个人笔记吧 OC特点 支持C语法 支持面
  • java中将url下载并转换为MultipartFile文件

    url转换MultipartFile用于图片持久化 需要在对应的网络下才能使用 url转MultipartFile url 图片URL fileName 文件名 return 返回的文件 public static MultipartFil
  • chmod 用法示例

    介绍 Linux中的Chmod命令用于更改或分配文件和目录的权限 在Linux Unix系统中 文件和目录的可访问性是由文件所有权和权限决定的 在上一篇文章中 我们了解了如何使用chown命令管理文件和目录的所有权 在本教程中 我们将介绍c
  • There is no item category assigned to account xxxxxxx

    做GOODS ISSUE的时候遇到这么一个问题 报出一个错误There is no item category assigned to account xxxxxxx 暂时也不知道原因 后来到 Financial Accounting Gl
  • React面试题

    目录 1 什么是虚拟DOM 2 类组件和函数组件之间的区别是什么 3 什么是React 4 说说 Real DOM 和 Virtual DOM 的区别 优缺点 5 在react中如何处理事件 6 class组件和函数组件区别 7 state
  • python之for循环使用(奇数和、偶数和、最大公因数和最小公倍数、用户登陆系统)

    需要知道 有关range gt gt gt range 5 0 1 2 3 4 gt gt gt range 7 0 1 2 3 4 5 6 gt gt gt range 1 7 1 2 3 4 5 6 gt gt gt range 2 7
  • 3DMAX初学者使用软件之前必须设置的参数,你看过了吗?

    刚开始学习3dmax感觉非常的迷茫 软件的安装 软件的基本设置 让刚接触的同学们痛苦不已 那么今天我们来分享一下新手下载完3dmax之后需要进行的基本设置 看好了哦 不要眨眼 你也可以轻松掌握 1 切换语言 单击开始菜单 选择所有程序 找到
  • 机器学习实战之SVD

    1 奇异值分解 SVD singular value decomposition 1 1 SVD评价 优点 简化数据 去除噪声和冗余信息 提高算法的结果 缺点 数据的转换可能难以理解 1 2 SVD应用 1 隐性语义索引 latent se