网站首页 > 技术文章 正文
本篇讲数据降维的另一种更普遍的算法——奇异值分解,主要内容包括数学原理,计算步骤,优缺点,应用场景、Python推荐示例等内容。
1、数学原理
奇异值分解(Singular Value Decomposition,SVD)是一种重要的矩阵分解。与之相对的是特征值分解(主成分分析主要使用方法),但特征值分解是针对的是方阵,但在实际应用场景中,我们经常遇到的矩阵都不是方阵,比如N个学生,每个学生的M科成绩,其中N≠M,这就组成N*M的非方阵矩阵。
对于一般普通的矩阵(包括方阵矩阵),如何来描述其重要特征?奇异值分解就是来做这些事情的。其中的矩阵分解公式为:
假设A是一个M* N的矩阵,那么通过矩阵分解将会得到U,Σ,V’(V的转置)三个矩阵,其中U是一个M * M的方阵,被称为左奇异向量,方阵里面的向量是正交的;Σ是一个M* N的对角矩阵,除了对角线的元素其他都是0,对角线上的值称为奇异值;V’(V的转置)是一个N * N的矩阵,被称为右奇异向量,方阵里面的向量也都是正交的。用图形展示如下图:
2、计算步骤
该矩阵是如何分解的?奇异值和特征值是如何计算的?
(1)将矩阵A的转置 * A,将会得到一个方阵,将方阵进行特征值分解:
其中得到的v,就是右奇异向量。
(2)通过方阵还可以求解σ和u:
σ是上文提到的奇异值,u是上文提到的左奇异向量。其中奇异值σ跟特征值很类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,其中r<<n,这里定义一下部分奇异值分解:
(3)选择适当的r,其中r是一个远小于m、n的数,这样可将原矩阵分解为:
其中,右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,而r越接近n,其相乘结果越接近A。根据储存原理,储存量与矩阵面积正相关,因此面积越小占用的储存空间越小。而三个矩阵的面积之和要远小于原矩阵。因此如果要储存A的信息,只需要储存U、Σ、V就可以,因此信息得到压缩。
3、优缺点
奇异值分解的优点是:可以简化数据,压缩维度,去除数据噪音,提升算法的结果,加快模型计算性能,可以针对任一普通矩阵进行分解(包括样本数小于特征数),不受限于方阵。
奇异值分解的缺点是:转换后的数据比较难理解,如何与具体业务知识对应起来是难点。
4、应用场景
奇异值分解应用场景一:隐性语义索引(Latent Semantic Indexing,LSI)
矩阵是有文档(M行)和词语(N列)组成,通过奇异值分解,可以分析出那些文档或词语属于同一主题或概念,可应用于更高效的文档检索
奇异值分解应用场景二:推荐系统
通过奇异值分解,可以计算项与人之间的相似度,而进行协同过滤,向用户推荐相关产品。
5、数据背景
(1)样本数据
本次样本数据是11*11,其中行表示用户,列表示食品,中间数字表示该用户对食品的打分。如果数字为0,表示该用户没有吃过该食品。本次模型的目的就是向用户推荐未吃过的食品。
(2)推荐思路
首先,寻找用户未评价的食品,即用户-矩阵中的0值;
再次,对用户未打分的食品,通过相似度计算预计其可能会打多少分数;
最后,对这些打分的食品根据评分从高到低进行排序,返回前N个食品,这就是推荐结果。
(3)相似度计算
如何来衡量两个物品之间的相似情况,一般有以下三种方法
第一种是:欧氏距离
示例:
为将距离映射到【0,1】中,相似度=1/(1+欧氏距离)
第二种是:皮尔森相关系数
示例:
皮尔森系数在【-1,1】之间,为映射到【0,1】之间,相似度=0.5+0.5*corroef
第三种是:余弦夹角
余弦夹角在【-1,1】之间,为映射到【0,1】之间,相似度=0.5+0.5*cos
6、具体Python实现
(1)数据准备
载入相关数据包和数据样本
(2)定义相似度
本次使用了三个计算方式:欧氏距离、皮尔森系数、余弦夹角。
(3)原数据的推荐机制
推荐原理为:首先选择该用户未吃过的食品;计算该食品与其他食品的相似度;相似度累加为SC;将该用户吃过食品的评分与未吃过食品相似度进行相乘得到总分SS;则对未吃过的食品的评分为 SS/SC;最后根据评分进行排序,选择最大评分数。
示例:对第三行用户进行推荐,输出结果为([(3, 4.0), (5, 4.0), (6, 4.0)]),推荐第4/5/6个食品。
(4)SVD推荐
示例:对第三行用户进行推荐,输出结果为([(6, 3.0), (5, 2.9), (10, 2.8)]),推荐第7/6/11个食品。
从结果来看SVD推荐效果比较好:
第3个用户曾经吃过【印度奶酪咖啡】,本次推进【印度烤鸡】
因为他对数据噪音进行了处理。
7、经验总结
SVD是较强的数据降维工具,可以有效处理数据噪音。在数据处理过程中得到的三个矩阵也有相关物理含义。但需要自己在业务中去摸索和理解。
本次样本数据U的前第1列表示的就是用户吃过的食品的个数.两个值越接近表示越相同,其中第2个和8个用户都是> -0.1,表示只吃过2个物品。
V的第1行表示个食品之间的联系,比如都是日式、印式、美式等主题概念。
猜你喜欢
- 2024-10-28 编程大佬告诉你人工智能需要学习哪些数学知识
- 2024-10-28 NumPy之:多维数组中的线性代数 多维数组元素之间的关系是线性的吗
- 2024-10-28 相机模型与张氏标定 相机标定的原理
- 2024-10-28 C代码快速傅里叶变换-分类和推理-常微分和偏微分方程
- 2024-10-28 认识“模拟进化算法” 模拟进化怪物
- 2024-10-28 3D点云平面拟合算法 3d点云项目
- 2024-10-28 黎曼猜想突破作者首次公开讲解,陶哲轩送上总结
- 2024-10-28 浅谈PCA主成分分析 什么是pca主成分分析
- 2024-10-28 【杂谈】cholesky分解——对称正定矩阵最好的分解
- 2024-10-28 降维算法: 奇异值分解SVD 降维的算法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)