奇异值分解 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. Mac 终端实现快速定位命令 自动补全目录

    基于macOS oh-my-zsh 切换终端主题 incr.zsh 实现快速定位命令 自动补全目录 效果预览 步骤 1.安装 oh-my-zsh sh -c "$(curl -fsSL ht ...

  2. Linux轻量级自动化运维工具— Ansible

    Ansible 是什么 ? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配 ...

  3. dubbo使用Spring配置暴露服务和使用Spring配置引用远程服务

    提供者: <!-- 1.指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) --> <dubbo:application name="user-servic ...

  4. GO、 智能合约、cannot use transactionRecordId + strconv.Itoa(id) (type string) as type byte in append

    1.报错详情 2.在写fabric go智能合约发送的错误,像我这样的新手就是踩坑踩坑踩坑 3.下面是代码片段 4.研究了一下append用法.也看了下GO语言官网文章: var test_str [ ...

  5. 吴裕雄--天生自然 JAVA开发学习:异常处理

    try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 } import java.io.*; public class ExcepTest{ publi ...

  6. 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇一:HttpClient的简单使用)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...

  7. selenium自学记录2014.12.26

    现在还是有点病急乱投医的感觉,不知道到底该从何学起,到底怎么学 手头上有的资料是 <零成本实现Web自动化测试-基于Selenium和Bromine> <Selenium测试实践-基 ...

  8. 使用node 做静态文件服务器

    # 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...

  9. c++ 语言几个坑

    #include <iostream> int main(){ int i = 1; switch (i){ case 1 : int j ; j = 1; break; case 2: ...

  10. 解决 Win7 远程桌面 已停止工作的问题

    Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...