当前位置: 首页 > news >正文

Python奇异值分解

AAA是方阵时,可以很容易地进行特征分解:A=WΣW−1A=W\Sigma W^{-1}A=WΣW1,其中Σ\SigmaΣAAA的特征值组成的对角矩阵。如果WWW由标准正交基组成,则W−1=WTW^{-1}=W^TW1=WT,特征分解可进一步写成WTΣWW^T\Sigma WWTΣW

然而,当AAA不是方阵时,情况大不一样了,但仍然可以将AAA表示成A=UΣVTA=U\Sigma V^TA=UΣVT的形式,其中Σ\SigmaΣ也是对角矩阵,对角线上的每个元素被称作奇异值。

奇异值的求解过程和特征值息息相关,因为把AAA变成方阵很简单,只要乘以转置就行。故令L=AATL=AA^TL=AATR=ATAR=A^TAR=ATA,则L,RL, RL,R都可以求特征值λi\lambda_iλi和特征向量,其中LLL的特征向量为AAA的左奇异向量,RRR的特征向量为右奇异向量。对应的奇异值σi=λi\sigma_i=\sqrt{\lambda_i}σi=λi

numpy.linalg中提供了奇异值分解函数svd,参数为

svd(a, full_matrices=True, compute_uv=True, hermitian=False)

其中

  • a 待分解矩阵,维度为(M, N)
  • full_matrices 若为True,则U, Vh分别为(M, M)(N, N);否则分别为(M, K), (K, N)K为M, N中较小的那个
  • compute_uv 如果为False则不计算U, Vh
  • hermitianTrue时,表示处理的是实对称矩阵

scipy.linalg中也提供了奇异值分解函数svd,其参数为

svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')

其中与numpy.linalg相同的参数,其意义也相同,不相同的部分,各参数含义如下

  • overwrite_a 如果为True,则直接对a进行修改
  • check_finite 如果为True,则进行有限性检查
  • lapack_driver SVD分解的方法,有两个选择
    • 'gesdd' 效率更高
    • 'gesvd' 此为Matlab和R中使用的方法

其返回值即U,Σ,VTU, \Sigma, V^TU,Σ,VT

scipy.linalg还提供了两个和SVD相关的函数,svdvals(a)用于求a的奇异值;diagsvd(s, M, N)通过s, M, N,创建一个Σ\SigmaΣ矩阵。

下面测试一下svd

import numpy as np
import scipy.linalg as sl
a = np.random.rand(5,5)
u1, s1, vh1 = sl.svd(a)
u2, s2, vh2 = np.linalg.svd(a)
print(s1)
# [2.63698545 0.94063722 0.36159198 0.21052102 0.19014115]
print(s1-s2)
# [ 0.0  0.0  1.11022302e-16 -2.77555756e-17 0.0]

numpyscipy的结果是几乎相同的,下面测试一下不同方法进行奇异值分解的时间

from timeit import timeit
a = np.random.rand(1000,1000)
timeit(lambda:sl.svd(a), number=10)
# 1.870287900000001
timeit(lambda:np.linalg.svd(a), number=10)
# 13.355788999999998
timeit(lambda:sl.svd(a, lapack_driver='gesvd'), number=10)
# 3.873418600000001
http://www.lryc.cn/news/10624.html

相关文章:

  • AWS攻略——子网
  • java面试 - mq
  • PTP GPTP芯片资料翻译88E6352
  • 用Python实现一个电影订票系统
  • 什么是瞪铃企业
  • 【深度学习】多分类问题和多标签分类问题
  • 大学生开学买什么,返校必备数码好物推荐
  • Unreal Engine06:Actor的实现
  • 2023美国大学生数学建模竞赛C题思路解析(含代码+数据可视化)
  • aws codebuild 自定义构建环境和本地构建
  • 3年功能3年自动化,从8k到23k的学习过程
  • leaflet: 数据聚合,显示当前bounds区域中的点的名称列表(078)
  • XXL-JOB分布式任务调度框架(一)-基础入门
  • 基于CentOS 7 搭建Redis 7集群
  • Lesson5.3---Python 之 NumPy 统计函数、数据类型和文件操作
  • Puppeteer 爬虫学习
  • 如何在Power Virtual Agents中实现身份验证
  • 金三银四必备软件测试必问面试题
  • Java反序列化漏洞——CommonsCollections6链分析
  • Selenium浏览器自动化测试框架
  • Hashmap链表长度大于8真的会变成红黑树吗?
  • 关于接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地
  • 排序
  • Android DataStore Proto存储接入流程详解与使用
  • HiEV洞察 | 卖一台亏半台,激光雷达第一股禾赛隐忧仍在
  • 面试题61. 扑克牌中的顺子
  • 有特别有创意的网站设计案例
  • Python基础-数据类型之列表
  • Linux系统基本设置:网络设置(三种界面网络地址配置)
  • MySQL(二):查询性能分析