奇异值分解 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. Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 文件的关系

    本教程针对于UEFI启动来叙述的,根据普遍的支持UEFI的机器来叙述. 标题简要说明:Windows Boot Manager  --------安装完Windows系统后而出现的启动选项(相关的信息 ...

  2. ILSVRC2012下载

    http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tarhttp://www.image-net.or ...

  3. mysql安装(centos7)

    1.下载rpm wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.安装rpm yum ...

  4. Tomcat远程debug配置

    当我们需要定位生产环境问题,而日志又不清晰的情况下,我们可以借助Tomcat提供的远程调试,设置如下: // Linxu系统: apach/bin/startup.sh开始处中增加如下内容: decl ...

  5. K 破忒头的匿名信(ac自动机+小dp)

    题:https://ac.nowcoder.com/acm/contest/4010/K 题意:用一些模式串凑成一个目标串,每个模式串有消耗,问组合的最小消耗,或不能组成输出-1: 分析:典型的AC自 ...

  6. 阿里云zabbix的python脚本

    由于阿里云只能用465端口.所以这个zabbix的脚本修改成了465端口的python脚本. 修改于https://www.jianshu.com/p/9d6941dabb47 #!/usr/bin/ ...

  7. Docker系列八: 数据卷

    什么是数据卷 生成环境中使用docker的过程中,往往需要对数据进行持久化,或者需要多个容器之间进行数据共享,这个就涉及到了容器数据管理 容器中管理数据主要有两种方式: 数据卷:容器内数据之间映射到本 ...

  8. Relative-Frequency|frequency|pie chart |bar chart

    2.2Organizing Qualitative Data The number of times a particular distinct value occurs is called its ...

  9. servlet之间传递数据的方式

    Servlet传递数据方式 基本概述 Servlet传递数据的方式有很多,这里提供五种方式: 1.静态变量 2.HttpServletResponse的sendRedirect()方法 3.HttpS ...

  10. 标题艺术与技术的完美结合,LG画廊OLED电视正式发布!

      由LG电子举办的"旷世巨作---面向未来的电视"主题沙龙于3月10号在王府井亚洲首家数字化奥迪展厅拉开帷幕.此次活动宣布了LG画廊OLED电视在国内市场上市.而我有幸参加了此次 ...