理论部分

任何一个m×nm\times nm×n矩阵AAA,通过svd分解,可以分解为三个矩阵相乘
A=PΣQTA=P\Sigma Q^TA=PΣQT

其中,Σ\SigmaΣ是一个m×nm\times nm×n对角矩阵,除了对角线上的元素之外,其余位置元素全部为0。

我们假设 P=[P1,P2,...,Pm]P=[P_1, P_2, ..., P_m]P=[P1​,P2​,...,Pm​],其中,PiP_iPi​是mmm维列向量;Q=[Q1,Q2,...,Qn]Q=[Q_1, Q_2, ..., Q_n]Q=[Q1​,Q2​,...,Qn​],其中,QjQ_jQj​是nnn维列向量;Σ\SigmaΣ的对角线元素为σ1,σ2,...,σmin(m,n)\sigma_1, \sigma_2, ..., \sigma_{min(m, n)}σ1​,σ2​,...,σmin(m,n)​,其中,σ1≥σ2≥...≥σmin(m,n)\sigma_1\ge\sigma_2\ge...\ge\sigma_{min(m, n)}σ1​≥σ2​≥...≥σmin(m,n)​。

我们仅考虑m≥nm\ge nm≥n的情形(情形m≤nm\le nm≤n类似)。此时,矩阵AAA可以分解为
A=PΣQT=[P1,P2,...,Pm]Σ[Q1T,Q2T,...,QnT]T=σ1P1Q1T+σ2P2Q2T+...+σnPnQnT\begin{array}{lll} A&=&P\Sigma Q^T\\ &=&[P_1, P_2, ..., P_m]\Sigma[Q_1^T, Q_2^T, ..., Q_n^T]^T\\ &=&\sigma_1 P_1 Q_1^T+\sigma_2 P_2 Q_2^T+...+\sigma_nP_nQ_n^T \end{array} A​===​PΣQT[P1​,P2​,...,Pm​]Σ[Q1T​,Q2T​,...,QnT​]Tσ1​P1​Q1T​+σ2​P2​Q2T​+...+σn​Pn​QnT​​

更重要的是,对角线上的元素按照从大到小,从上到下进行排列,并且往往最大的几个元素比最小的几个元素大得多,以至于较小元素可以忽略。

比如,我们有100个特征值,前10%的特征值比后90%的特征值大得多,我们就选取前10%的特征值,而将后90%的特征值略掉。这样,我们就用了10%的内容,保留了矩阵AAA的绝大部分信息。

此时,保留前kkk个特征值,
A≈σ1P1Q1T+σ2P2Q2T+...+σkPkQkTA\approx\sigma_1 P_1 Q_1^T+\sigma_2 P_2 Q_2^T+...+\sigma_kP_kQ_k^TA≈σ1​P1​Q1T​+σ2​P2​Q2T​+...+σk​Pk​QkT​

实际操作

我们随便挑选一个图片作为例子,保存为dog.jpg

我们可以从图片处理中,看看svd降维的效果。

# 第三方库
from PIL import Image
from scipy.linalg import svd
import numpy as np
# 加载图片
image = Image.open('D:/myfile/开课吧/推荐系统/第六节/dog.jpg')# 转化为灰度图
grey_image = image.convert('L')
grey_image.show()

转化为灰度图,如下

# 转化为矩阵
A = np.array(grey_image)# svd分解
p, s, q = svd(A)
print('左奇异矩阵p的大小为', p.shape)
print('矩阵A的特征值个数为', len(s))
print('其中,前4个特征值为', s[:4])
print('后4个特征值为', s[-4:])
print('右奇异矩阵q的大小为', q.shape)
左奇异矩阵p的大小为 (683, 683)
矩阵A的特征值个数为 683
其中,前4个特征值为 [109075.24   28300.275  16735.781  10259.204]
后4个特征值为 [28.534803 27.757359 26.593216 23.755302]
右奇异矩阵q的大小为 (1024, 1024)

可以看到,前4个特征值要比后4个特征值大得多,所以将后四个特征值忽略,并不影响图片质量。

# 定义函数get_k_features,选择矩阵A的前k个特征值,返回图像矩阵
# 注意:该函数仅适用于m<n的A矩阵
def get_k_features(k):# 生成sigma矩阵sigma = np.diag(list(s)+[0]*(len(q)-len(s)))[:len(s), :] # m*n矩阵,其中,对角线上是m个特征值# 选取前k个特征值sigma_k = sigma[:k, :] # k*n矩阵# 近似还原A矩阵A_approx = p[:, :k].dot(sigma_k).dot(q) # p矩阵需要取前k列,变成m*k矩阵;sigma_k是k*n矩阵;q是n*n矩阵return A_approx
# 取前5%的特征值
image_1 = get_k_features(30)
# 取前10%的特征值
image_2 = get_k_features(60)
# 取前20%的特征值
image_3 = get_k_features(120)
# 依次生成图片
Image_1 = Image.fromarray(np.uint8(image_1))
Image_1.show()Image_2 = Image.fromarray(np.uint8(image_1))
Image_2.show()Image_3 = Image.fromarray(np.uint8(image_1))
Image_3.show()

选取的特征值数量从小到大,图片依次为



可以看到,原图片总共有683个特征值,当我们仅仅选取前60个特征值时,如果不追求细节,图片基本能辨认出来;当我们提取更多的特征值时,图片质量也就越来越高。

综上,svd可以通过选择较少的主要特征值来保留大部分信息,也就是达到了降维的效果。

《推荐系统笔记(五)》svd降维 —— 以图片处理为例相关推荐

  1. Qt笔记(五十七)之显示图片缩略图

    一.前言 楼主在实际开发中,遇到这样一个需求,需要加载指定目录下所有图片,并显示其缩略图,一开始以为需要用QLabel去做,自己手动设置大小,没想到可以QListWIdget提供了IconMode这个 ...

  2. 推荐系统笔记:基于SVD的协同过滤

    1 奇异值分解 奇异值分解(SVD)是矩阵分解的一种形式,其中U和V的列被约束为相互正交 相互正交的优点是概念之间可以完全独立,并且可以用散点几何解释它们. 然而,这种分解的语义解释通常比较困难,因为 ...

  3. 机器学习笔记(二)矩阵和线性代数 例:用Python实现SVD分解进行图片压缩

    线性代数基本只要是理工科,都是必修的一门课.当时学习的时候总是有一个疑惑,这个东西到底是干嘛用的?为什么数学家发明出这么一套方法呢,感觉除了解方程没发现有什么大用啊!但随着学习的深入,慢慢发现矩阵的应 ...

  4. 【转载】推荐系统-矩阵分解-SVD-通俗易懂

    [转载[https://blog.csdn.net/u011412768/article/details/52972081#commentBox] 因为要用到基于SVD的推荐作为baseline,所以 ...

  5. 论文阅读笔记(五)——狐猴识别系统:一种便于狐猴个体识别的面部识别系统

    论文阅读笔记(五)--狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文简介 论文中文翻译:狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文名称:<LemurFaceID: a fac ...

  6. 推荐系统笔记:基于矩阵分解(总结篇)

    推荐系统笔记:基于潜在因子模型的协同过滤(latent factor model)_UQI-LIUWJ的博客-CSDN博客 推荐系统笔记:无任何限制的矩阵分解_UQI-LIUWJ的博客-CSDN博客 ...

  7. 推荐系统笔记:决策树回归树

    决策树和回归树经常用于数据分类. 决策树是为那些因变量(target,label)是分类的情况而设计的,而回归树是为那些因变量(target,label)是数值的情况而设计的.          在讨 ...

  8. svd降维 python案例_SVD(奇异值分解)Python实现

    注: 在<SVD(异值分解)小结 >中分享了SVD原理,但其中只是利用了numpy.linalg.svd函数应用了它,并没有提到如何自己编写代码实现它,在这里,我再分享一下如何自已写一个S ...

  9. 《推荐系统笔记(十四)》矩阵分解(MF)以及基于矩阵分解的topN推荐

    前言 用户评分矩阵往往十分稀疏,为了对这种稀疏矩阵进行补全,充分利用已有数据,我们可以采用矩阵分解办法.实际上,一旦矩阵补全,相当于预测出用户对未购买物品的评分,基于这些评分,我们就可以对任何用户进行 ...

最新文章

  1. JavaFX打包工具(javafxpackager)
  2. RTC_WaitForSynchro()
  3. pycharm python 如何快速给代码块添加try/catch try/finally包裹?【ctrl+alt+T】
  4. VScode 1.4新版功能
  5. 无头虚拟化服务器,在 Ubuntu 18.04 LTS 上使用 KVM 配置无头虚拟化服务器
  6. MongoDB 3.X 用户权限控制
  7. JavaScript 代码规范
  8. 2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力
  9. 重造车轮—基于JQ的商品展示放大镜
  10. win10计算机无法远程连接,win10无法远程连接
  11. JSP自定义标签入门实例
  12. [Lintcode]102. Linked List Cycle/[Leetcode]
  13. Vue 单页面应用 把公共组件放在 app.vue 但是我希望某个页面没有这些公共组件怎么办???(比如登陆页面)
  14. java输出杨辉三角_使用Java输出杨辉三角
  15. 中文ISBN公开信息查询接口
  16. 摄像头能用计算机里不显示,摄像头没有显示
  17. 基于微信小程序编写的AI配音界面
  18. App Store2016年最新审核规则
  19. 微信小程序中图片高度被压扁的解决办法
  20. PHP的eregi函数:检查字符串的有效性

热门文章

  1. 3gpp协议_3GPP都在干什么(16)?:3GPP中网络切片原理及协议解读
  2. springboot整个缓存_springboot整合ehcache缓存
  3. python类的使用的生物学应用_当AI遇到生物-深度学习在生物研究中的应用案例列表...
  4. 深度学习入门笔记(五):神经网络的学习
  5. 周期(KMP算法之Next数组的性质)
  6. 插值问题(拉格朗日插值、牛顿插值)
  7. 数据结构实验 6.宗教信仰
  8. http和websocket共用同一端口
  9. Markdown标题、行首缩进、换行。csdn(1)
  10. 【Qt教程】2.1 - Qt5 UI设计器、常用控件