[摘要]
特征分解——>奇异值分解(SVD)——>隐语义模型(LFM),三个算法在前者的基础上推导而成,按顺序先后出现。三者均用于矩阵降维。其中:

  • 特征分解可用于主成分分析。(可参考博主文章主成分分析)
  • 奇异值分解(SVD)和隐语义模型(LFM)可用于推荐系统中,将评分矩阵补全、降维。

为什么进行矩阵分解:

  • 有人说,将大型矩阵分解为简单矩阵乘积的形式,为了减少计算量。矩阵分解及应用毕业论文_豆丁网
  • 有人说,在自然语言处理和推荐系统中,会有非常稀疏的矩阵,把稀疏矩阵分解成高阶特征的线性组合,便于分类和预测。通俗地理解矩阵分解的意义

接下来按推导顺序讲解

1 特征分解

1.1 为什么进行特征分解?(目的)

将矩阵降维

1.2 什么样的矩阵可以进行特征分解?(前提)

  1. 待降维的矩阵是方阵
  2. (A−λE)x=0(A-\lambda E)x=0(A−λE)x=0有非零解,即 ∣A−λE∣=0|A-\lambda E|=0∣A−λE∣=0。

1.3 特征分解的原理

  1. 特征分解使用到矩阵的特征值,所以先了解特征值的概念。
    Ax=λxAx=\lambda xAx=λx
    上式中,λ\lambdaλ是矩阵AAA的一个特征值,xxx是矩阵AAA的特征值λ\lambdaλ对应的特征向量,是一个nnn维向量。
    站在特征向量的角度,特征向量的几何含义是:特征向量xxx通过方阵AAA变换,只缩放,方向不变。(即xxx左乘一个方阵的效果,等同于xxx乘以一个数值。AxAxAx称为矩阵变换,λx\lambda xλx称为矩阵缩放,变换的效果与缩放相同。)
    站在方阵$A$的角度:n×nn \times nn×n的方阵AAA通过右乘一个矩阵xxx,可以变换成一个n×1n \times 1n×1的列向量。

  2. 得到方阵AAA的nnn个特征值,组成对角矩阵∑\sum∑:
    ∑={λ100...00λ20...000......0.........λn−100...00λn}\sum = \left\{ \begin{matrix} \lambda_1 & 0 & 0 &...& 0 \\ 0 & \lambda_2 & 0 &...& 0 \\ 0 & 0 & ... & ... & 0 \\ ... & ... & ... & \lambda_{n-1} & 0 \\ 0 & ... & 0 & 0 & \lambda_n \end{matrix} \right\} ∑=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​λ1​00...0​0λ2​0......​00......0​.........λn−1​0​0000λn​​⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫​

  3. 则方阵AAA的特征分解就可以表示为:
    A=U∑U−1A = U \sum U^{-1}A=U∑U−1
    其中UUU是nnn个特征向量组成的n×nn\times nn×n维方阵,∑\sum∑是这nnn个特征值为主对角线的n×nn\times nn×n维方阵。

  4. 可以将 方阵AAA的特征分解进一步表示:
    将nnn 个特征向量标准化(可使用施密特正交化方法):


    便可以满足U−1=UTU^{-1}=U^TU−1=UT,这时方阵A的特征分解可以进一步写成:
    A=U∑UTA = U \sum U^TA=U∑UT

1.4 特征分解的手推计算

1.5 特征分解的Python实现

NumPy

import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 计算特征值
print(np.linalg.eigvals(A))
# 同时计算特征值和特征向量
eigvals,eigvectors = np.linalg.eig(A)
print(eigvals)
print(eigvectors)

Scipy

import numpy as np
import scipy as sp
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 计算特征值
print(sp.linalg.eigvals(A))
# 同时计算特征值和特征向量
eigvals,eigvectors = sp.linalg.eig(A)
print(eigvals)
print(eigvectors)

参考网址:【深度学习基础】:线性代数(一)_特征分解及numpy、scipy实现

2 奇异值分解(SVD)

2.1 为什么进行奇异值分解?(目的)

矩阵是方阵,可以分解,方法是1中的特征分解(A=U⋅∑⋅UTA=U \cdot \sum \cdot U^TA=U⋅∑⋅UT)。
矩阵不是方阵,即列数和行数不等,也可以分解,最常用的分解方法是奇异值分解(SVD)。

2.2 什么样的矩阵可以进行奇异值分解?(前提)

任意矩阵。

2.3 奇异值分解的原理

2.3.1 奇异值分解公式

有n×nn \times nn×n的矩阵A,将其进行奇异值分解,公式如下:
A=U∑VTA = U \sum V^TA=U∑VT
其中,

  • U(叫做左奇异值,UUU的列叫做左奇异向量)是m×mm \times mm×m的方阵,
  • VVV(对应的,VVV叫右奇异值,V的列叫做右奇异向量)是n×nn \times nn×n的方阵,
  • ∑\sum∑是m×nm \times nm×n的矩阵,主对角线元素称为奇异值,其他元素均为0。

进一步的,

  • U的列是AATAA^TAAT的特征向量,
  • VVV(注意,公式中使用时,需要进行转置。即VTV^TVT的行是ATAA^TAATA的特征向量)的列是ATAA^TAATA的特征向量。
  • AATAA^TAAT与ATAA^TAATA的特征值相同,为{λ1、λ2、...λr}\left \{ \lambda _1、\lambda _2、... \lambda _r \right \}{λ1​、λ2​、...λr​}, ∑\sum∑主对角线上的奇异值σi=λi\sigma_i=\sqrt{\lambda_i}σi​=λi​​。一般奇异值会有多个,而我们只使用top-k个构成这个对角阵。

2.3.2 奇异值分解的手推计算



参考文献:
PCA为什么使用协方差矩阵
奇异值的物理意义是什么?
两篇文章都非常不错,建议阅读。

2.3.3 奇异值分解的Python实现

(1) numpy.linalg.svd() 程序实现

有一点需要注意,sigma本来应该跟A矩阵的大小2*3一样,但linalg.svd()只返回了一个行向量的sigma,并且只有2个奇异值(本来应该有3个),这是因为第三个奇异值为0,舍弃掉了。之所以这样做,是因为当A是非常大的矩阵时,只返回奇异值可以节省很大的存储空间。当然,如果我们要重构A,就必须先将sigma转化为矩阵。

(2)svd用于降维

# 奇异值分解(SVD)
import numpy as np#原始矩阵n*m
A = np.mat([[1,2,3],[4,5,6],[7,8,9]])
U, sigma, VT = np.linalg.svd(A)
print('===原始===')
print('A = ',A)
print('U = ', U)
print('sigma = ', sigma)
print('VT = ', VT)print("===用k个描述,描述前后值A与newA相差不多===")
k = 1 #特征值共两个,我们用最大的top-1个奇异值和对应的U和V中的向量来描述矩阵A。
newU = U[:,:k]
newSig = np.mat(np.eye(k)*sigma[:k])
newVT = VT[:k,:]
newA = newU*newSig*newVT
print('newU = ',newU)
print('newSig = ', newSig)
print('newVT = ', newVT)
print('newA = ', newA)print("降维:由n*m维降低到n*k维")
xformedA = A.T*newU*newSig.T
print(xformedA)

输出

===原始===
A =  [[1 2 3][4 5 6][7 8 9]]
U =  [[-0.21483724  0.88723069  0.40824829][-0.52058739  0.24964395 -0.81649658][-0.82633754 -0.38794278  0.40824829]]
sigma =  [1.68481034e+01 1.06836951e+00 4.41842475e-16]
VT =  [[-0.47967118 -0.57236779 -0.66506441][-0.77669099 -0.07568647  0.62531805][-0.40824829  0.81649658 -0.40824829]]
===用k个描述,描述前后值A与newA相差不多===
newU =  [[-0.21483724][-0.52058739][-0.82633754]]
newSig =  [[16.84810335]]
newVT =  [[-0.47967118 -0.57236779 -0.66506441]]
newA =  [[1.73621779 2.07174246 2.40726714][4.2071528  5.02018649 5.83322018][6.6780878  7.96863051 9.25917322]]
降维
[[-136.15878258][-162.471513  ][-188.78424343]]
  1. numpy.linalg.svd方法
    函数:np.linalg.svd(a,full_matrices=1,compute_uv=1)。

参数:

  • a是一个形如(M,N)矩阵
  • full_matrices的取值是为0或者1,默认值为1,这时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。
  • compute_uv的取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。

返回值:
总共有三个返回值u,s,v
u大小为(M,M),s大小为(M,N),v大小为(N,N)。
A = usv
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。

参考网址:Python之SVD介绍

3 隐语义模型(LFM)

特征分解,奇异值分解(SVD) 和隐语义模型(LFM)相关推荐

  1. 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现

    推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现 基于协同过滤的推荐一般分为基于近邻的推荐和基于模型的推荐,其中,基于近邻是指预测时直接使用用户已有的偏好数据,通过近邻数据来预测新物品的偏好.而 ...

  2. 隐语义模型( LFM )

    基于模型的协同过滤思想         ●基本思想                 -用户具有一定的特征,决定着他的偏好选择;                 -物品具有一定的特征,影响着用户需是否选 ...

  3. 隐语义模型LFM(Latent Factor Model)

    隐语义模型LFM(Latent Factor Model)是主题模型中的一种,跟其他主题模型一样,LFM也需要定义若干"主题",来表示个中隐含的关系,这些"主题" ...

  4. 推荐系统(5)—隐语义模型(LFM)

    https://www.toutiao.com/a6663676280782717454/ 2019-03-02 14:27:17 基本概念 LFM(latent factor model)隐语义模型 ...

  5. 【知识发现】隐语义模型LFM算法python实现(三)

    http://blog.csdn.net/fjssharpsword/article/details/78257126 基于上篇再优化. 1.回顾LFM原理,可以更好地理解代码 对于一个给定的用户行为 ...

  6. 【知识发现】隐语义模型LFM算法python实现(一)

    1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...

  7. python实现lfm_【知识发现】隐语义模型(LFM,Latent Factor Model)推荐算法python实现

    1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...

  8. python实现lfm_推荐系统之隐语义模型(LFM)

    一 基本概念 LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF有什么不同呢?这里可以做一个对比: 对于Use ...

  9. 推荐系统:综述【一、基于用户信息】【二、基于物品/内容(CB)】【三、协同过滤(CF):①、基于近邻(User-CF、Item-CF);②、基于模型(隐语义模型/LFM:SVD、pLSA、LDA)】

  10. 【知识发现】隐语义模型LFM算法python实现(二)

    http://blog.csdn.net/fjssharpsword/article/details/78015956 基于该篇文章中的代码优化,主要是在生成负样例上提高执行速度,代码参考如下: # ...

最新文章

  1. Atitit MATLAB 图像处理attilax总结
  2. 【转】PHP date(Y-m-d H:i:s);获取当前时间 差8小时解决办法
  3. CTFshow 文件包含 web116
  4. SAP UI5应用的sap-ui-core.js被加载之前,还有哪些js文件被加载了
  5. incc与oracle连接_Oracle 连接和会话的区别
  6. phpcmsV9 数据库配置文件(查找、修改)
  7. SpannableStringUtil实现丰富文字效果
  8. idea git 整合使用
  9. 最近新建了一个米表站
  10. 【JavaScript创建对象】
  11. 有哪些免费的CRM软件可以使用?
  12. 直到输到-1停止 c语言,python新人求助raw_input()问题,不断提示输入字元或数字直到输入空值停止提示。...
  13. [Unity][C#]Regex正则表达式判断字符串
  14. XSSF实现Excel下拉和HSSF实现Excel下拉
  15. 新博客移步:https://www.cnblogs.com/nineep/
  16. Firefox设置谷粉搜搜为默认搜索引擎的方法
  17. SSO中的Pattern
  18. 碰到spoolsv.exe-应用程序错误怎么办?
  19. postman-模拟上传图片
  20. qt 回车事件之Qt::Key_Return与Qt::Key_Enter

热门文章

  1. 【笔记】Select2 三级联动
  2. 【空气质量数据分析专题九】污染物浓度小时变化分析
  3. java生成Access数据库文件
  4. Keil环境下用STM32汇编语言工程分析HEX文件内容
  5. input输入框内容只读
  6. 计算机一级考试培训费用广东,广东全国计算机等级考试(NCRE)报考条件以及费用...
  7. 毫无争议的github顶级有用的开源项目排行榜
  8. STM32 Free RTOS实战
  9. 促进二十一世纪创客教育的新发展
  10. 专利申请原则 专利申请后有什么好处 怎么保护专利的权益?