1、特征值分解

主要还是调包:

from numpy.linalg import eig

特征值分解:  A = P*B*PT 当然也可以写成 A = QT*B*Q 其中B为对角元为A的特征值的对角矩阵,P=QT,

首先A得对称正定,然后才能在实数域上分解,

>>> A = np.random.randint(-10,10,(4,4))>>>A

array([[6, 9, -10, -1],

[5, 9, 5, -5],

[-8, 7, -4, 4],

[-1, -9, 0, 6]])>>> C =np.dot(A.T, A)>>>C

array([[126, 52, -3, -69],

[52, 292, -73, -80],

[-3, -73, 141, -31],

[-69, -80, -31, 78]])>>> vals, vecs =eig(C)>>>vals

array([357.33597086, 174.10172008, 8.84429957, 96.71800949])>>>vecs

array([[-0.28738314, -0.51589436, -0.38221983, -0.71075449],

[-0.87487263, 0.12873861, -0.24968051, 0.39456798],

[0.2572149 , -0.69304313, -0.33950158, 0.58161018],

[0.29300052, 0.48679627, -0.82237845, -0.02955945]])

故使用时应先将特征值转换为矩阵:

>>> Lambda =np.diag(vals)>>>Lambda

array([[357.33597086, 0. , 0. , 0. ],

[ 0. ,174.10172008, 0. , 0. ],

[ 0. , 0. ,8.84429957, 0. ],

[ 0. , 0. , 0. ,96.71800949]])>>> np.dot(np.dot(vecs, Lambda), vecs.T) #与C=A.T*A相等

array([[126., 52., -3., -69.],

[52., 292., -73., -80.],

[-3., -73., 141., -31.],

[-69., -80., -31., 78.]])>>>np.dot(np.dot(vecs.T, Lambda), vecs)

array([[171.65817919, 45.58778569, 53.20435074, 13.37512137],

[45.58778569, 125.15670964, 28.22684299, 134.91290105],

[53.20435074, 28.22684299, 129.48789571, 80.5284382],

[13.37512137, 134.91290105, 80.5284382 , 210.69721545]])

故验证了使用np中的eig分解为A=P*B*PT而不是A=QT*B*Q,其中P=vecs,

即 C = vecs * np.diag(vals) * vecs.T #这里简写*为矩阵乘法

然后再来看使用np中的eig分解出来的vec中行向量是特征向量还是列向量是特征向量,只需验证:A*vecs[0] = vals[0]*vecs[0]

>>>np.dot(C, vecs[0])

array([-12.84806258, -80.82266859, 6.66283128, 17.51094927])>>> vals[0]*vecs[0]

array([-102.69233303, -184.34761071, -136.58089252, -253.97814676])>>>np.dot(C, vecs[:,0])

array([-102.69233303, -312.62346098, 91.91213634, 104.69962583])>>> vals[0]*vecs[:, 0]

array([-102.69233303, -312.62346098, 91.91213634, 104.69962583])

后者两个是相等的,故使用np中的eig分解出的vecs的列向量是特征向量。

然后我们可以验证P是单位正交矩阵:

>>>np.dot(vecs.T, vecs)

array([[1.00000000e+00, -7.13175042e-17, -2.45525952e-18,2.75965773e-16],

[-7.13175042e-17, 1.00000000e+00, 2.49530948e-17,-5.58839097e-16],

[-2.45525952e-18, 2.49530948e-17, 1.00000000e+00,-7.85564967e-17],

[2.75965773e-16, -5.58839097e-16, -7.85564967e-17,1.00000000e+00]])>>>np.dot(vecs, vecs.T)

array([[1.00000000e+00, 2.97888865e-16, -2.68317972e-16,1.69020590e-16],

[2.97888865e-16, 1.00000000e+00, -4.40952204e-18,-6.24188690e-17],

[-2.68317972e-16, -4.40952204e-18, 1.00000000e+00,-1.13726775e-17],

[1.69020590e-16, -6.24188690e-17, -1.13726775e-17,1.00000000e+00]])#可以看到除对角元外其他都是非常小的数

即PT*P = P*PT = E , PT=P-1。事实上,在求解P的过程中就使用了施密特正交化过程。

另一方面,我们从数学角度来看:

首先补充一些数学知识:可以看我另一篇文章:矩阵知识

A = P*B*P-1  ,其中B为对角元素为A的特征值的对角阵,P的列向量为特征值对应的特征向量(因为B每行乘以P每列)

2、奇异值分解

还是调包:

from numpy.linalg import svd

设任意矩阵A是m*n矩阵

奇异值分解:A = U*Σ*VT , 其中U为满足UTU=E的m阶(m*m)酉矩阵,Σ为对角线上为奇异值σi 其他元素为0的广义m*n对角阵,V为满足VTV=E的n阶(n*n)酉矩阵

a = np.random.randint(-10,10,(4, 3)).astype(float)'''array([[ -9., 3., -7.],

[ 4., -8., -1.],

[ -1., 6., -9.],

[ -4., -10., 2.]])'''In [53]: u, s, vh = np.linalg.svd(a) #这里vh为V的转置

In [55]: u.shape, s.shape, vh.shape

Out[55]: ((4, 4), (3,), (3, 3))'''In [63]: u

Out[63]:

array([[-0.53815289, 0.67354057, -0.13816841, -0.48748749],

[ 0.40133556, 0.1687729 , 0.78900752, -0.43348888],

[-0.59291924, 0.04174708, 0.59180987, 0.54448603],

[ 0.44471115, 0.71841213, -0.09020922, 0.52723647]])

In [64]: s

Out[64]: array([16.86106528, 11.07993065, 7.13719934])

In [65]: vh

Out[65]:

array([[ 0.31212695, -0.760911 , 0.56885078],

[-0.74929793, -0.56527432, -0.3449892 ],

[ 0.58406282, -0.31855829, -0.74658639]])'''In [56]: np.allclose(a, np.dot(u[:, :3] *s, vh))

Out[56]: True#将s转化为奇异值矩阵

In [60]: smat[:3, :3] =np.diag(s)

In [61]: smat

Out[61]:

array([[16.86106528, 0. , 0. ],

[ 0. ,11.07993065, 0. ],

[ 0. , 0. ,7.13719934],

[ 0. , 0. , 0. ]])#验证分解的正确性

In [62]: np.allclose(a, np.dot(u, np.dot(smat, vh)))

Out[62]: True

python 矩阵特征值分解_讲一下numpy的矩阵特征值分解与奇异值分解相关推荐

  1. python如何把矩阵转换为图片_如何将numpy数组转换为(并显示)图片

    函数式编程 用python显示一张图片方法如下:import matplotlib.pyplot as plt # plt 用于显示图片import matplotlib.image as mpimg ...

  2. python怎么切图片分解_巧用numpy切分图片

    昨晚发了接受投稿文章,昨晚就有读者积极来文章啦,几轮邮件交流了修改意见后,今天就发布啦,这篇的稿费是300. 之前无聊在刷视频的时候看到这么一个有意思的视频(现在视频找不到,忘记关键字了= =),视频 ...

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

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

  4. python建立复数数组_深入理解NumPy简明教程---数组1

    目前我的工作是将NumPy引入到Pyston中(一款Dropbox实现的Python编译器/解释器).在工作过程中,我深入接触了NumPy源码,了解其实现并提交了PR修复NumPy的bug.在与Num ...

  5. python程序论文答辩_讲真,毕业论文答辩到了该改改的时候了

    原标题:讲真,毕业论文答辩到了该改改的时候了 报 名 4-5月计算机相关会议汇总 4月14-15日,无锡 全国高校Java.python.软件工程系列课程高级研修班 4月21-22日,北京 全国高校微 ...

  6. java 矩阵分解_计算方法(三)矩阵分解1-正交分解(QR分解)

    正交分解 矩阵的正交分解又称为QR分解,是将矩阵分解为一个正交矩阵Q和一个上三角矩阵的乘积的形式. 任意实数方阵A,都能被分解为 .这里的Q为正交单位阵,即 R是一个上三角矩阵.这种分解被称为QR分解 ...

  7. python np array 减去一个数_python numpy减去矩阵元素

    使用numpy,我如何相互减去矩阵的numpy数组的元素? a = np.array([ [ [1., 2., 3.], [4., 5., 6.], [7., 8., 9.] ], [ [20., 2 ...

  8. python如何改变数据类型_如何改变numpy数组的数据类型和形状?

    数据类型的混合使得这种转换比通常更复杂.最后的答案是,将字段复制到目标数组具有速度和通用性的结合.在 让我们构造一个示例:In [850]: dt Out[850]: dtype([('cycle', ...

  9. java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

    一.问题描述 引出问题之前我们先来复习一下矩阵乘积的标准算法. int ra,ca;//矩阵A的行数和列数 int rb,cb;//矩阵B的行数和列数 voidmatrixMultiply() {fo ...

最新文章

  1. 数据密集型应用系统设计 [Designing Data-Intensive Applications]
  2. Android studio 报错解决:Error:SSL peer shut down incorrectly
  3. HDU 1573: X问题
  4. conda下用prefix创建虚拟环境会怎么样?
  5. html文件转成base64字符串,js 转base64字符串为文件
  6. Cython 的学习
  7. Windows下启动Apache报错:ServerRoot must be a valid directory
  8. Centos 设置时区和时间以及增加中文输入法
  9. 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
  10. VB.net小技巧系列目录
  11. 并查集详解(C/C++)
  12. C++刷题: 逆波兰表达式(力扣150题)
  13. wx:key的使用及wx:key的值
  14. 如何用云计算搭建服务器,如何搭建一个云服务器
  15. SDK是什么?什么是SDK
  16. 歪门邪道 Leetcode 463 Island Perimeter
  17. 谷歌学术里面的代码查找
  18. 聚观早报 | 苹果首款头显明年1月亮相;米哈游投资信托「打水漂」
  19. CefSharp的ChromiumWebBrowser截出来的图片是空白
  20. WIN10蓝屏崩溃原因查找

热门文章

  1. 确定重载函数被调用的依据
  2. 传智教育自主研发的8本教材入选“十三五”职业教育国家规划教材书目
  3. MySQL的索引深入剖析
  4. 删除数据库表中重复数据的总结(oracle)
  5. 数据挖掘最最最最需要掌握的思维方式,你拥有吗?
  6. 全套阿里巴巴开发手册和大神解读一起给你【2022年整理】
  7. 【安全硬件】Chap.3 如何插入一个硬件木马到芯片的组合逻辑电路的漏洞里?不影响正常电路的功能的情况下进行硬件的逻辑加密
  8. 微信小程序图书商城毕业设计,图书商城购物小程序系统设计与实现,图书商城购物小程序商城毕设作品参考
  9. c语言计算学生成绩的合格率,分享一个几年前刚学c的一个小项目。成绩的输入,查询,排序,插...
  10. LinuxDeepin 9.12 Beta1