奇异值分解 SVD(Singular Value Decomposition)是一种重要的矩阵分解方法,可以看做是特征分解在任意矩阵上的推广,SVD是在机器学习领域广泛应用的算法。

特征值和特征向量

定义:设 A 是 n 阶矩阵,若数 λ 和 n 维非零向量 x 满足

那么,数 λ 称为方阵 A 的特征值,x 称为 A 的对应于特征值 λ 的特征向量

说明:特征向量 x 不等于0,特征值问题仅仅针对方阵;n 阶方阵 A 的特征值,就是使得齐次线性方程组 (A-λE)x = 0 有非零解的 λ 值,即满足方程 | A - λE| = 0 的 λ 都是方阵 A 的特征值

特征分解

对方阵 A 求取特征值和特征值对应的特征向量可以将方阵 A 进行特征分解为

证明:假设方阵 A 有 n 个线性无关的特征向量 v1, v2, v3, … , vn,对应的特征值为 λ1, λ2, λ3, … , λn,令 V = ( v1, v2, v3, … , vn)

在进行特征分解时,一般将 V 的这 n 个特征向量标准化,即使得 V 中 n 个特征向量为标准正交基,满足

所以方阵 A 的特征分解公式为

奇异值分解

矩阵的特征分解要求矩阵必须为方阵,那么对于不是方阵的矩阵而言则可以使用 SVD 进行分解,假设 A 是一个 m * n 的矩阵,则存在一个分解使得

其中 U 为左奇异值矩阵,Λ 为矩阵 A 奇异值,除了主对角线上的元素以外全为0,V 为右奇异值矩阵

如何求这 SVD 分解后的三个矩阵?

虽然矩阵 A 不是方阵,但是 A^T^A 是一个 n * n 的方阵,于是对 A^T^A 这个方阵进行特征值和特征向量计算则有

通过 A^T^A 方阵计算得到的特征向量是一个 n * n 维的矩阵,也就是 SVD 公式中的 V 矩阵

证明:

可以看到 A^T^A 的特征向量就是 SVD 中的 V 矩阵,同时可以得到特征值矩阵等于奇异值矩阵的平方,也就是说特征值 λ 和奇异值 σ 存在如下关系

类似的,通过计算 AA^T^ 方阵的特征值和特征向量可以得到 SVD 中的 U 矩阵

利用Python进行SVD分解对图像压缩

在 Python 中进行 SVD 分解非常简单,利用 Numpy 模块中的 np.linalg.svd() 函数,比如u,sigma,v = np.linalg.svd(A),其中 u,v 分别返回矩阵 A 的左右奇异向量,而 sigma 返回的是按从大到小的顺序排列的奇异值,利用 Python 进行 SVD 分解对图形进行压缩,也就是读取图片的像素矩阵,然后对矩阵进行 SVD 分解得到对应的奇异值和奇异向量,然后对奇异值和奇异向量进行筛选例如取前10%的数据,实现对图像的压缩

  • 原图

  • 进行 SVD 分解,选择前 50 个奇异值
1
2
3
4
5
6
7
8
9
10 大专栏  奇异值分解原理及Python实例
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib as mpl def (sigma, u, v, K):
m = len(u)
n = len(v[0])
a = np.zeros((m, n))
for k in range(K):
uk = u[:, k].reshape(m, 1)
vk = v[k].reshape(1, n)
a += sigma[k] * np.dot(uk, vk) # 前k个奇异值的加和
a = a.clip(0, 255)
return np.rint(a).astype('uint8') if __name__ == "__main__":
A = Image.open(".\Pokonyan.jpg", 'r')
output_path = r'.SVD_Out'
a = np.array(A)
print('type(a) = ', type(a))
print('原始图片大小:', a.shape) # 图片有RGB三原色组成,所以有三个矩阵
u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0]) # 奇异值分解
u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])
u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2]) # 仅使用前1个,2个,...,50个奇异值的结果
K = 50
for k in range(1, K+1):
R = restore(sigma_r, u_r, v_r, k)
G = restore(sigma_g, u_g, v_g, k)
B = restore(sigma_b, u_b, v_b, k)
I = np.stack((R, G, B), axis=2) # 将矩阵叠合在一起,生成图像
Image.fromarray(I).save('%s\svd_%d.jpg' % (output_path, k))
  • 将图像进行奇异值分解后的图像

  • 使用前50个奇异值的图像

可以看到,使用前50个奇异值就能大致还原原图像,也就是可以通过仅仅使用奇异值矩阵中前面一部分的值表示整体的情况,从而实现了特征的降维,这是因为在奇异值矩阵中奇异值减少的特别快,可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵

奇异值分解原理及Python实例的更多相关文章

  1. 第一个python实例--监控cpu

    #第一个python实例:监控cpu #/bin/bash/env Python from __future__ import print_function from collections impo ...

  2. (转)Python实例手册

    原文地址:http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7 实在是太好的资料了,不得不转 python实例手册 #encodi ...

  3. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  4. 【NLP】Python实例:申报项目查重系统设计与实现

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  5. 转载 python实例手册

    python实例手册 #encoding:utf8# 设定编码-支持中文 0说明 手册制作: 雪松 更新日期: 2013-12-19 欢迎系统运维加入Q群: 198173206 # 加群请回答问题 请 ...

  6. 【NLP】Python实例:基于文本相似度对申报项目进行查重设计

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  7. python实例、类方法、静态方法

    [python实例.类方法.静态方法] 参考:http://blog.163.com/yang_jianli/blog/static/161990006201122411586729/

  8. 【转载】python实例手册

    今天写爬虫的时候遇到了问题,在网上不停地查找资料,居然碰到两篇好文章: 1.python实例手册   作者:没头脑的土豆 另一篇在这:shell实例手册 python实例手册 #encoding:ut ...

  9. Python实例---利用正则实现计算器[FTL版]

    import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = ...

随机推荐

  1. 编译x64c++出错,errorC1900:P1和P2之间 Il 不匹配问题

    搜索了下相关资料,有一个说法是编译x64时本地缺失一些东西,2015安装update3就行. 我的是2013update4,找了下最新的有update5,安装然而并没有什么用. 最后还是重新找对应版本 ...

  2. 小程序外链跳转web-view系列问题

    1.当小程序需要跳转外链时要上小程序后台配置业务域名,配置业务域名需要上传一个验证文件到你跳转的外链的服务器上的根目录里: 2. (1)第一种方法:.当小程序在同一个页面根据后台接口获取的url进行小 ...

  3. a标签的一些特殊使用

    <a href="tel:10086">10086</a> //点击后直接拨打10086  <a href="mailto:c1586@qq ...

  4. 绝对定位( Absolute positioning )

    绝对定位( Absolute positioning ) 之前在介绍定位体系的时候,已经简单的介绍了绝对定位和固定定位.一般情况下,这两种定位的元素, 在 3D 的可视化模型中,处于浮动元素的上方,或 ...

  5. Android开发学习2--Android Studio目录结构、Module目录介绍、Android创建及运行和HelloWord的扩展----极其简单的游戏界面

    学习笔记: 1.Android Studio项目结构 Android Studio提供了很多项目结构,最常用的是Android 和 project Project列举出了所有文件. 建议使用Andro ...

  6. Equal Cut

    Equal Cut 题目描述 Snuke has an integer sequence A of length N. He will make three cuts in A and divide ...

  7. 一张图看懂三维GIS

  8. 吴裕雄--天生自然python Google深度学习框架:MNIST数字识别问题

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...

  9. centos设置上网代理

    假设我们要设置代理为 IP:PORT 1.网页上网网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced-->& ...

  10. 003.前端开发知识,前端基础CSS(2020-01-07)

    一.CSS初识 CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体.大小.对齐方式等).图片的外形(宽高.边框样式.边距等)以及版面的布局等外观显示样式. ...