奇异值分解 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. 0.3W微功率放大器

    电路结构 电路摘自<晶体管电路设计(上)>. 电路采用+5V单电源供电,两级结构.Tr1构成共射极放大电路作为电压放大级:Tr3,Tr4构成推挽的射极跟随器作为输出级:Tr2作为射极跟随器 ...

  2. Invalid package name:a digit canno be the first character in a package segme

    发现网上没有关于这个的解决方法 其实这个原因是因为下图红框里的是数字 把默认的这个直接删掉,用英语随便输入一个即可

  3. 内网部署Docker版本Gitlab

    Gitlab部署: 1. 还原备份文件后记得拷贝gitlab-secrets.json,不然会遇到500错误 2. 下载Docker以及依赖项rpm包 3. 在外网机器下载镜像 a. 拉取——Dock ...

  4. redis设置cpu核数与内存

    每个redis实例,给系统要预留至少1/4核,可使用1核心cpu.内存要预留1/2. 比如:8核120G的服务器,可部署8-8/4=6个redis实例,每个实例120/2/6=10G内存.

  5. springboot多数据源+jta事务管理配置

    1.创建一个maven项目,导入相关配置: <?xml version="1.0" encoding="UTF-8"?> <project x ...

  6. idea整合mybatis逆向工程

    --pom.xml添加插件 <build> <finalName>hnapi</finalName> <plugins> <plugin> ...

  7. 50)PHP,单例模式

    class B{ ; private static $instance; private function __construct(){} public static function getNew( ...

  8. mui弹出输入法遮住input表单元素

    转自https://www.cnblogs.com/devilyouwei/p/6293190.html mui弹出输入法遮住input表单元素   问题如下:当我用mui开发app时,在mui-sc ...

  9. yum安装与卸载软件常见命令

    1.使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的. 安装的命令是,yuminstall ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突 ...

  10. 74cms_3.5.1 宽字节注入

    第一次进行CMS的代码审计,我选择了2014年发布的74CMS 3.5.1,历史比较久远的CMS往往存在更多的问题,虽然技术上难度不大,但是在思路方面给了我很大的启发.下面我根据我的思路给大家分享一下 ...