特征值分解

特征值分解是将一个方阵A分解为如下形式:

其中,Q是方阵A的特征向量组成的矩阵,

是一个对角矩阵,对角线元素是特征值。

通过特征值分解得到的前N个特征向量,表示矩阵A最主要的N个变化方向。利用这前N个变化方向,就可以近似这个矩阵(变换) 。

奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。 它能适用于任意的矩阵的分解。

SVD是将m*n的矩阵A分解为如下形式:

其中,U和V是正交矩阵,即

,U是左奇异矩阵,

,S是

的对角阵(对角线上的元素是奇异值,非对角线元素都是0),

右奇异向量,

特征值用来描述方阵,可看做是从一个空间到自身的映射。奇异值可以描述长方阵或奇异矩阵,可看做是从一个空间到另一个空间的映射。

奇异值和特征值是有关系的,奇异值就是矩阵

的特征值的平方根。

步骤

输入:样本数据

输出:左奇异矩阵,奇异值矩阵,右奇异矩阵计算特征值:特征值分解

,其中

为原始样本数据

得到左奇异矩阵

和奇异值矩阵

间接求部分右奇异矩阵:求

利用

可得

返回

,分别为左奇异矩阵,奇异值矩阵,右奇异矩阵。

python实现

调用eig和svd方法

import numpy as np

data = np.array([[1, 0, 4], [2, 2, 0], [0, 0, 5]]) # 数组

# 调用np.linalg.eig()对data*data'进行特征值分解

eig_value, eig_vector = np.linalg.eig(data.dot(data.T))

# 将特征值降序排列

eig_value = np.sort(eig_value)[::-1]

print("特征值:", eig_value) # 特征值

print("特征值的平方根:", np.sqrt(eig_value)) # 特征值的平方根

# 调用np.linalg.svd()对data进行奇异值分解

U, S, V = np.linalg.svd(data)

# 降到两维,计算U*S*V 结果应该和data几乎相同

recon_data = np.round(U[:,:2].dot(np.diag(S[:2])).dot(V[:2,:]), 0).astype(int)

print("奇异值:", S) # 奇异值

print("data:\n",data)

print("U*S*V的结果:\n",recon_data)

从结果上验证了奇异值就是矩阵

的特征值的平方根。结果如下:特征值: [41.44423549 8.26378188 0.29198263]

特征值的平方根: [6.43771974 2.87467944 0.54035417]

奇异值: [6.43771974 2.87467944 0.54035417]

data: [[1 0 4] [2 2 0] [0 0 5]]

U*S*V的结果: [[1 0 4] [2 2 0] [0 0 5]]

按SVD原理实现

import numpy as np

# 1.调用np.linalg.eig()计算特征值和特征向量

eig_val, u_vec = np.linalg.eig(data.dot(data.T))

s_val = np.sqrt(eig_val) # 奇异值:是特征值的平方根

# 将向量u_vec对应排好序

s_val_sort_idx = np.argsort(s_val)[::-1]

u_vec = u_vec[:, s_val_sort_idx]

# 奇异值降序排列

s_val = np.sort(s_val)[::-1]

# 2.计算奇异值矩阵的逆

s_val_inv = np.linalg.inv(np.diag(s_val))

# 3.计算右奇异矩阵

v_vec = s_val_inv.dot((u_vec.T).dot(data))

# 降到两维,计算U*S*V 结果应该和data几乎相同

recon_data = np.round(u_vec[:,:2].dot(np.diag(s_val[:2])).dot(v_vec[:2,:]),0).astype(int)

print("左奇异矩阵U:\n", u_vec)

print("奇异值Sigma:\n", s_val)

print("右奇异矩阵V:\n", v_vec)

print("data:\n",data)

print("U*S*V的结果:\n",recon_data)

运行结果

左奇异矩阵U:

[[ 0.63464303 -0.12919086 0.76193041]

[ 0.03795231 -0.97952798 -0.19769816]

[ 0.77187295 0.15438478 -0.61674751]]

奇异值Sigma:

[6.43771974 2.87467944 0.54035417]

右奇异矩阵V:

[[ 0.11037257 0.01179061 0.99382034]

[-0.72642772 -0.68148675 0.08876135]

[ 0.67832195 -0.73173546 -0.06665242]]

data:

[[1 0 4]

[2 2 0]

[0 0 5]]

U*S*V的结果:

[[1 0 4]

[2 2 0]

[0 0 5]]

基于SVD的图像压缩

基于SVD图片压缩: 图片其实就是数字矩阵,通过SVD将该矩阵降维,只使用其中的重要特征来表示该图片从而达到了压缩的目的。

path = 'Andrew Ng.jpg'

data = io.imread(path,as_grey=True)

print(data.shape)

data = np.mat(data) # 需要mat处理后才能在降维中使用矩阵的相乘

U, sigma, VT = np.linalg.svd(data)

count = 30 # 选择前30个奇异值

# 重构矩阵

dig = np.diag(sigma[:count]) # 获得对角矩阵

# dim = data.T * U[:,:count] * dig.I # 降维 格外变量这里没有用 dig.I:是求dig的逆矩阵

redata = U[:, :count] * dig * VT[:count, :] # 重构后的数据

plt.imshow(data, cmap='gray') # 取灰

plt.title("原始图片")

plt.show()

plt.imshow(redata, cmap='gray') # 取灰

plt.title("基于SVD压缩重构后的图片")

plt.show()

原图片为720x1080,保存像素点值为720x1080 = 777600,使用SVD算法,取前30个奇异值则变为(720+1+1080)*30=54030,达到了几乎15倍的压缩比,极大的减少了存储量。

结果如下

附录

方阵

方阵:是一种特殊的矩阵。方阵是n*n的矩阵

特征值和特征向量

设A是n阶方阵,若存在n维非零向量

,使得

则称常数

为A的特征值,

为A的对应于

的特征向量。

np.diag()

np.diag(array)参数说明:

array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵;

array是一个二维矩阵时,结果输出矩阵的对角线元素

import numpy as np

# 输入是1维数组时,结果形成一个以一维数组为对角线元素的矩阵

data_1 = np.array([1,2,3])

print("输入是1维数组时的结果:\n",np.diag(data_1))

# 输入是二维矩阵时,结果输出矩阵的对角线元素

data_2 = np.array([[1,0,4],[2,2,0],[0,0,5]])

print("输入是2维数组时的结果:\n",np.diag(data_2))

运行结果输入是1维数组时的结果: [[1 0 0] [0 2 0] [0 0 3]]

输入是2维数组时的结果: [1 2 5]

相关链接

python 矩阵特征值分解_特征值分解和奇异值分解相关推荐

  1. python矩阵施密特标准型_矩阵与数值计算(3)——Schur标准型和Jordan分解

    前言 之前介绍过几种矩阵分解方法,都可以有效的提升矩阵方程的数值求解问题,其中LU分解尤其适合于中小型.稠密矩阵的求解问题.我们最理想的矩阵就是可相似对角化的矩阵,直接可以分解成两个酉矩阵和一个对角矩 ...

  2. 矩阵奇异值分解特征值分解_推荐系统中的奇异值分解与矩阵分解

    矩阵奇异值分解特征值分解 Recently, after watching the Recommender Systems class of Prof. Andrew Ng's Machine Lea ...

  3. python矩阵处理库_用于处理非常大的矩阵的Python库

    什么是用于处理非常大的矩阵(例如数百万行/列)的优秀 Python库,包括在矩阵生命的任何阶段添加行或列的能力? 我查看过pytables和h5py,但是一旦创建了矩阵,它们都不支持添加或删除行或列. ...

  4. python矩阵相乘例题_百道Python入门级练习题(新手友好)第一回合——矩阵乘法...

    题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...

  5. pbs分解_产品分解结构

    (重定向自Pbs) 产品分解结构(Product Breakdown Structure,PBS) [编辑] 产品分解结构的概述 产品分解结构是通过树状结构反映产品的各类部件,每类部件在结构中仅出现一 ...

  6. python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  7. python矩阵左除_技术图文:Matlab VS. Numpy 矩阵基本运算

    背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系. ...

  8. python矩阵和向量乘积_向量点积和矩阵乘积的区别

    点积 dot product 点积是针对向量而言的. 我们可以理解为维度[n,1]或者[1,n],一维的矩阵. 在python中,我们设置一个array,查看其shape: >>> ...

  9. python矩阵行秩函数_为什么矩阵行秩等于列秩?

    挖坟 最近整理一些基础知识的时候,也被这个问题困惑着. 书上的解释是,任何矩阵通过初等变换都可以化成标准型(单位阵+一些全零行或列).显然行秩和列秩是相等的. 但是相比代数上的解释,我更想要寻求几何上 ...

  10. python矩阵乘法分治_分治法实现矩阵乘法

    #include #include #include #include using namespace std; int *InitMatrix(int row,int col);//初始化 void ...

最新文章

  1. 用MyEclipse开发Spring入门
  2. NVIDIA Jetson 系列产品开发相关文档,TAO、TLT、NGC
  3. Nginx 多进程模型是如何实现高并发的?
  4. 关系代数——附加的关系运算(1)
  5. 写给年轻程序员的一封信
  6. Android 中.aar文件生成方法与用法
  7. UI设计干货素材|精美的APP UI Kit模板
  8. Altium AD20中铺铜被导线分割的解决方法,如何正确覆铜整片区域
  9. inventory tool for Microsoft Uplates简介
  10. JAVA学习IO(1)
  11. YOLOv5永不缺席 | YOLO-Pose带来实时性高且易部署的姿态估计模型!!!
  12. 大型网站应用之海量数据和高并发解决方案总结一二
  13. 关于SQL2005安装完毕后,没有SQL Server Management Studio问题的解决方法
  14. RHEL 7 防火墙
  15. 程序员怒批996背后的支持者,刘强东和马云哑口无言!
  16. 显示器信号时有时无并无html,电脑开机显示器无信号、键盘鼠标不亮解决方法...
  17. 海洋环境保护具体内容
  18. 【总结】1396- 60+个 VSCode 插件,打造好用的编辑器
  19. c++: Logger日志信息
  20. 渗透测试情报收集工具

热门文章

  1. 单目标跟踪(模板更新)(UpdateNet)《Learning the Model Update for Siamese Trackers》
  2. vue中如何引入公共样式的的styl文件
  3. python如何设置当前工作路径?
  4. 翻车记之2018.7.27
  5. iOS9.3描述文件怎么安装
  6. 2019当今互联网赚钱的六大方式,赠送给迷茫的网赚新手
  7. python 函数调用自身_Python-函数的递归调用
  8. avue-crud初始化下拉列表,以及复选框,默认选中
  9. 数据挖掘肿瘤预测_肿瘤分析数据挖掘及信息解读
  10. S60 Python 编程指南——如何创建pys60应用程序