第15章 奇异值分解

本文是李航老师的《统计学习方法》一书的代码复现。作者:黄海广

备注:代码都可以在github中下载。我将陆续将代码发布在公众号“机器学习初学者”,可以在这个专辑在线阅读。

1.矩阵的奇异值分解是指将实矩阵表示为以下三个实矩阵乘积形式的运算

其中是阶正交矩阵,是阶正交矩阵,是矩形对角矩阵

其对角线元素非负,且满足

2.任意给定一个实矩阵,其奇异值分解一定存在,但并不唯一。

3.奇异值分解包括紧奇异值分解和截断奇异值分解。紧奇异值分解是与原始矩阵等秩的奇异值分解,截断奇异值分解是比原始矩阵低秩的奇异值分解。

4.奇异值分解有明确的几何解释。奇异值分解对应三个连续的线性变换:一个旋转变换,一个缩放变换和另一个旋转变换第一个和第三个旋转变换分别基于空间的标准正交基进行。

5.设矩阵的奇异值分解为,则有

即对称矩阵和的特征分解可以由矩阵的奇异值分解矩阵表示。

6.矩阵的奇异值分解可以通过求矩阵的特征值和特征向量得到:的特征向量构成正交矩阵的列;从的特征值的平方根得到奇异值,即

对其由大到小排列,作为对角线元素,构成对角矩阵;求正奇异值对应的左奇异向量,再求扩充的的标准正交基,构成正交矩阵的列。

7.矩阵的弗罗贝尼乌斯范数定义为

在秩不超过的矩阵的集合中,存在矩阵的弗罗贝尼乌斯范数意义下的最优近似矩阵。秩为的截断奇异值分解得到的矩阵能够达到这个最优值。奇异值分解是弗罗贝尼乌斯范数意义下,也就是平方损失意义下的矩阵最优近似。

8.任意一个实矩阵可以由其外积展开式表示

其中为矩阵,是列向量和行向量的外积,为奇异值,通过矩阵的奇异值分解得到。


任意一个 x 矩阵,都可以表示为三个矩阵的乘积(因子分解)形式,分别是阶正交矩阵,由降序排列的非负的对角线元素组成的 x 矩形对角矩阵,和阶正交矩阵,称为该矩阵的奇异值分解。矩阵的奇异值分解一定存在,但不唯一。

奇异值分解可以看作是矩阵数据压缩的一种方法,即用因子分解的方式近似地表示原始矩阵,这种近似是在平方损失意义下的最优近似。

矩阵的奇异值分解是指,将一个非零的 x 实矩阵表示为一下三个实矩阵乘积形式的运算:
,
其中 是 阶正交矩阵, 是 阶正交矩阵, 是由降序排列的非负的对角线元素组成的 x 矩形对角矩阵。称为 的奇异值分解。的列向量称为左奇异向量, 的列向量称为右奇异向量。

奇异值分解不要求矩阵 是方阵,事实上矩阵的奇异值分解可以看作方阵的对角化的推广。

紧奇奇异值分解是与原始矩阵等秩的奇异值分解, 截断奇异值分解是比原始矩阵低秩的奇异值分解。


# 实现奇异值分解, 输入一个numpy矩阵,输出 U, sigma, V
# https://zhuanlan.zhihu.com/p/54693391import numpy as np#基于矩阵分解的结果,复原矩阵
def rebuildMatrix(U, sigma, V):a = np.dot(U, sigma)a = np.dot(a, np.transpose(V))return a#基于特征值的大小,对特征值以及特征向量进行排序。倒序排列
def sortByEigenValue(Eigenvalues, EigenVectors):index = np.argsort(-1 * Eigenvalues)Eigenvalues = Eigenvalues[index]EigenVectors = EigenVectors[:, index]return Eigenvalues, EigenVectors#对一个矩阵进行奇异值分解
def SVD(matrixA, NumOfLeft=None):#NumOfLeft是要保留的奇异值的个数,也就是中间那个方阵的宽度#首先求transpose(A)*AmatrixAT_matrixA = np.dot(np.transpose(matrixA), matrixA)#然后求右奇异向量lambda_V, X_V = np.linalg.eig(matrixAT_matrixA)lambda_V, X_V = sortByEigenValue(lambda_V, X_V)#求奇异值sigmas = lambda_Vsigmas = list(map(lambda x: np.sqrt(x)if x > 0 else 0, sigmas))  #python里很小的数有时候是负数sigmas = np.array(sigmas)sigmasMatrix = np.diag(sigmas)if NumOfLeft == None:rankOfSigmasMatrix = len(list(filter(lambda x: x > 0,sigmas)))  #大于0的特征值的个数else:rankOfSigmasMatrix = NumOfLeftsigmasMatrix = sigmasMatrix[0:rankOfSigmasMatrix, :]  #特征值为0的奇异值就不要了#计算右奇异向量X_U = np.zeros((matrixA.shape[0], rankOfSigmasMatrix))  #初始化一个右奇异向量矩阵,这里直接进行裁剪for i in range(rankOfSigmasMatrix):X_U[:, i] = np.transpose(np.dot(matrixA, X_V[:, i]) / sigmas[i])#对右奇异向量和奇异值矩阵进行裁剪X_V = X_V[:, 0:NumOfLeft]sigmasMatrix = sigmasMatrix[0:rankOfSigmasMatrix, 0:rankOfSigmasMatrix]#print(rebuildMatrix(X_U, sigmasMatrix, X_V))return X_U, sigmasMatrix, X_V
A = np.array([[1, 1, 1, 2, 2], [0, 0, 0, 3, 3], [0, 0, 0, 1, 1], [1, 1, 1, 0, 0],[2, 2, 2, 0, 0], [5, 5, 5, 0, 0], [1, 1, 1, 0, 0]])A
array([[1, 1, 1, 2, 2],[0, 0, 0, 3, 3],[0, 0, 0, 1, 1],[1, 1, 1, 0, 0],[2, 2, 2, 0, 0],[5, 5, 5, 0, 0],[1, 1, 1, 0, 0]])
X_U, sigmasMatrix, X_V = SVD(A, NumOfLeft=3)
X_U
array([[ 1.96602638e-01, -5.12980706e-01, -6.20066911e-09],[ 3.08997616e-02, -8.04794293e-01,  1.69140901e-09],[ 1.02999205e-02, -2.68264764e-01,  5.63803005e-10],[ 1.76002797e-01,  2.35488225e-02, -7.63159275e-09],[ 3.52005594e-01,  4.70976451e-02, -1.52631855e-08],[ 8.80013984e-01,  1.17744113e-01, -3.81579637e-08],[ 1.76002797e-01,  2.35488225e-02, -7.63159275e-09]])
sigmasMatrix
array([[9.81586105e+00, 0.00000000e+00, 0.00000000e+00],[0.00000000e+00, 5.25821946e+00, 0.00000000e+00],[0.00000000e+00, 0.00000000e+00, 1.16381789e-07]])
X_V
array([[ 5.75872999e-01,  4.12749590e-02,  8.16496581e-01],[ 5.75872999e-01,  4.12749590e-02, -4.08248290e-01],[ 5.75872999e-01,  4.12749590e-02, -4.08248290e-01],[ 5.05512944e-02, -7.05297502e-01,  3.28082013e-17],[ 5.05512944e-02, -7.05297502e-01,  3.28082013e-17]])
# rebuild from U, sigma, VrebuildMatrix(X_U, sigmasMatrix, X_V)
array([[ 1.00000000e+00,  1.00000000e+00,  1.00000000e+00,2.00000000e+00,  2.00000000e+00],[ 5.39915464e-17,  7.72260438e-16, -7.54662738e-16,3.00000000e+00,  3.00000000e+00],[ 9.57429619e-18,  2.48997260e-16, -2.59977132e-16,1.00000000e+00,  1.00000000e+00],[ 1.00000000e+00,  1.00000000e+00,  1.00000000e+00,1.25546281e-17,  1.25546281e-17],[ 2.00000000e+00,  2.00000000e+00,  2.00000000e+00,2.51092563e-17,  2.51092563e-17],[ 5.00000000e+00,  5.00000000e+00,  5.00000000e+00,9.74347659e-18,  9.74347659e-18],[ 1.00000000e+00,  1.00000000e+00,  1.00000000e+00,1.38777878e-17,  1.38777878e-17]])

same as A.

from PIL import Image
import requests
from io import BytesIOurl = 'https://images.mulberry.com/i/mulberrygroup/RL5792_000N651_L/small-hampstead-deep-amber-small-classic-grain-ayers/small-hampstead-deep-amber-small-classic-grain-ayers?v=3&w=304'
response = requests.get(url)
img = Image.open(BytesIO(response.content))
img


本章代码来源:https://github.com/hktxt/Learn-Statistical-Learning-Method

下载地址

https://github.com/fengdu78/lihang-code

参考资料:

[1] 《统计学习方法》: https://baike.baidu.com/item/统计学习方法/10430179

[2] 黄海广: https://github.com/fengdu78

[3]  github: https://github.com/fengdu78/lihang-code

[4]  wzyonggege: https://github.com/wzyonggege/statistical-learning-method

[5]  WenDesi: https://github.com/WenDesi/lihang_book_algorithm

[6]  火烫火烫的: https://blog.csdn.net/tudaodiaozhale

[7]  hktxt: https://github.com/hktxt/Learn-Statistical-Learning-Method

复现经典:《统计学习方法》第15章 奇异值分解相关推荐

  1. 统计学习方法第15章-奇异值分解SVD

    定义 矩阵的奇异值分解(SVD)是指,将一个非零的 m×nm \times nm×n 实矩阵 A,A∈Rm×nA, A \in \mathbf{R}^{m \times n}A,A∈Rm×n, 表示为 ...

  2. 李航《统计学习方法》第二章课后答案链接

    李航<统计学习方法>第二章课后答案链接 李航 统计学习方法 第二章 课后 习题 答案 http://blog.csdn.net/cracker180/article/details/787 ...

  3. 李航《统计学习方法》第一章课后答案链接

    李航<统计学习方法>第一章课后答案链接 李航 统计学习方法 第一章 课后 习题 答案 http://blog.csdn.net/familyshizhouna/article/detail ...

  4. 统计学习方法——第1章(个人笔记)

    统计学习方法--第1章 统计学习及监督学习概论 <统计学习方法>(第二版)李航,学习笔记 1.1 统计学习 1.特点 (1)以计算机及网络为平台,是建立在计算机及网络上的: (2)以数据为 ...

  5. 统计学习方法笔记第二章-感知机

    统计学习方法笔记第二章-感知机 2.1 感知机模型 2.2感知机学习策略 2.2.1数据集的线性可分型 2.2.2感知机学习策略 2.3感知机学习算法 2.3.1感知机算法的原始形式 2.3.2算法的 ...

  6. 统计学习方法 | 第7章 支持向量机

    第7章 支持向量机 <统计学习方法>Python代码实现 [转载自Github开源项目]https://github.com/fengdu78/lihang-code 1.支持向量机最简单 ...

  7. 一篇详解带你再次重现《统计学习方法》——第二章、感知机模型

    个性签名:整个建筑最重要的是地基,地基不稳,地动山摇. 而学技术更要扎稳基础,关注我,带你稳扎每一板块邻域的基础. 博客主页:七归的博客 专栏:<统计学习方法>第二版--个人笔记 创作不易 ...

  8. 统计学习方法 - 第1章 - 概论

    全书章节 第1章 统计学习方法概论 第2章 感知机 第3章 k近邻法 第4章 朴素贝叶斯法 第5章 决策树 第6章 逻辑斯谛回归与最大熵模型 第7章 支持向量机 第8章 提升方法 第9章 EM算法及其 ...

  9. 机器学习——统计学习方法——第1章 统计学习及监督学习概论

    监督学习是从标注数据中学习模型的机器学习问题,是统计学习的重要组成部分. 1.1 统计学习 统计学习的特点 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科. 特点 ...

最新文章

  1. 适配设备的简易新闻浏览器
  2. 计算机网络技术简答题,《计算机网络技术》简答题.doc
  3. c语言字符串化简,华为面试题:一元多项式的化简 C语言实现源码
  4. windows server 2008 r2之间的ftp传输脚本
  5. python 两个乘号是什么_(2)Python 变量和运算符
  6. Java GregorianCalendar hashCode()方法与示例
  7. 如何对待逐渐疏远的朋友?
  8. ArrayList、LinkedList和Vector三者区别与联系
  9. Java音频格式转换,支持amr、aud、slk、silk转成mp3
  10. 18年7月最新可用QQ坦白说解密方法
  11. 超细节!数据分析社招面试指南
  12. 微信转发软件后缀_简单修改后缀让微信发送25M以上微信大视频
  13. php相亲段子,个个都是老司机!NPC段子手们经典语录
  14. Python爬虫实例之淘宝商品比价定向爬取!爬虫还是很有意思的!
  15. python 根据word生成ppt_未明学院:利用Python将Wordamp;PPT批量转成PDF
  16. AMI CORE8 OEM BIOS开发入门
  17. 外卖 webpp2---hesdar组件
  18. 分享本电子书Sql Server 20008 internals
  19. 无代码开发工具推荐丨三叠云
  20. Windows下的Mysql安装

热门文章

  1. A__Java为数据结构提供的实用包的运用(减少代码量)---更新中ing
  2. Normalization,Regularization 和 standardization
  3. Ubuntu GNOME单击任务栏图标最小化设置
  4. Base64编码算法
  5. Django 权限管理
  6. C#迭代器、装箱/拆箱、重载等
  7. Android系统语言默认设置为简体中文
  8. 2010英语WCDMA,希望你也和一样!
  9. python 读取 word 表格_python读取word表格
  10. 2021年东南大学附属中大医院公布SCI预警期刊列表的通知