- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于方阵,可以得到SVD
X= USV'
分解,通过简单地使用 numpy.linalg.svd
u,s,vh = numpy.linalg.svd(X)
例程或 numpy.linalg.eigh,计算 Hermitian 矩阵 X'X 和 XX' 上的 eig 分解
他们使用相同的算法吗?调用相同的 Lapack 例程?
在速度方面有什么区别吗?和稳定性?
最佳答案
的确,numpy.linalg.svd
和numpy.linalg.eigh
调用的不是同一个Lapack例程。一方面,numpy.linalg.eigh
引用 LAPACK 的 dsyevd()
而 numpy.linalg.svd
使用 LAPACK 的 dgesdd()
。
这些例程之间的共同点是使用 Cuppen 的分而治之算法,该算法首先设计用于解决三对角特征值问题。例如,dsyevd()
仅在需要特征向量时才处理 Hermitian 矩阵并执行以下步骤:
使用 DSYTRD() 将矩阵化简为三对角形式
通过 DSTEDC() 使用分而治之算法计算三对角矩阵的特征向量
使用 DORMTR() 应用 DSYTRD() 报告的 Householder 反射。
相反,要计算 SVD,dgesdd()
执行以下步骤,在 job==A 的情况下(需要 U 和 VT):
dgebrd()
将 A 双对角化DBDSDC()
dgebrd()
返回的矩阵 P 和 Q 恢复双对角化,应用 dormbr()
两次,一次用于 U,一次用于 V虽然 LAPACK 执行的实际操作非常不同,但策略在全局范围内是相似的。这可能源于这样一个事实,即计算一般矩阵 A 的 SVD 类似于执行对称矩阵 A^T.A 的特征分解。
关于 lapack 分治 SVD 的准确性和性能,请参阅 This survey of SVD methods :
关于对称特征值问题,复杂度为 4/3n^3(但通常证明比这更好),内存占用约为 2n^2 加上矩阵的大小。因此,最好的选择可能是numpy.linalg.eigh
。如果您的矩阵是对称的。
可以使用以下代码计算特定矩阵的实际复杂度:
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit
# see https://stackoverflow.com/questions/41109122/fitting-a-curve-to-a-power-law-distribution-with-curve-fit-does-not-work
def func_powerlaw(x, m, c):
return np.log(np.abs( x**m * c))
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
timeev=[]
timesvd=[]
size=[]
for n in range(10,600):
print n
size.append(n)
A=np.zeros((n,n))
#populate A, 1D diffusion.
for j in range(n):
A[j,j]=2.
if j>0:
A[j-1,j]=-1.
if j<n-1:
A[j+1,j]=-1.
#EIG
Aev=A.copy()
start = time.time()
w,v=np.linalg.eigh(Aev,'L')
end = time.time()
timeev.append(end-start)
Asvd=A.copy()
start = time.time()
u,s,vh=np.linalg.svd(Asvd)
end = time.time()
timesvd.append(end-start)
poptev, pcov = curve_fit(func_powerlaw, size[len(size)/2:], np.log(timeev[len(size)/2:]),p0=[2.1,1e-7],maxfev = 8000)
print poptev
poptsvd, pcov = curve_fit(func_powerlaw, size[len(size)/2:], np.log(timesvd[len(size)/2:]),p0=[2.1,1e-7],maxfev = 8000)
print poptsvd
plt.figure()
fig, ax = plt.subplots()
plt.plot(size,timeev,label="eigh")
plt.plot(size,[np.exp(func_powerlaw(x, poptev[0], poptev[1])) for x in size],label="eigh-adjusted complexity: "+str(poptev[0]))
plt.plot(size,timesvd,label="svd")
plt.plot(size,[np.exp(func_powerlaw(x, poptsvd[0], poptsvd[1])) for x in size],label="svd-adjusted complexity: "+str(poptsvd[0]))
ax.set_xlabel('n')
ax.set_ylabel('time, s')
#plt.legend(loc="upper left")
ax.legend(loc="lower right")
ax.set_yscale("log", nonposy='clip')
fig.tight_layout()
plt.savefig('eigh.jpg')
plt.show()
对于这样的一维扩散矩阵,eigh 优于 svd,但实际复杂度相似,略低于 n^3,类似于 n^2.5。
也可以执行准确性检查。
关于python - numpy.linalg.eigh 与 numpy.linalg.svd 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50358310/
Scipy 和 Numpy 在它们之间具有三个不同的函数来查找给定方阵的特征向量,它们是: numpy.linalg.eig(a) scipy.linalg.eig(a) , 和 scipy.spar
这是我的 numpy 数组: z [[ 3.90311860e-322 1.83939721e-001] [ 0.00000000e+000 1.83939721e-001] [ 0
公认的智慧是更喜欢 scipy.linalg 而不是 numpy.linalg 函数。为了进行线性代数,理想情况下(并且方便地)我想结合 numpy.array 和 scipy.linalg 的功能,
有人知道什么时候最好选择哪个吗?在我看来,它们是一样的... lsmr lsqr 最佳答案 两种软件包的功能相同。 LSMR基于2010年的Fong&Saunders算法(请参阅paper),并且最近
如果我们想通过使用正规方程来搜索线性回归模型的最佳参数 theta: theta = inv(X^T * X) * X^T * y 第一步是计算 inv(X^T*X)。因此 numpy 提供 np.l
要求解线性矩阵方程,可以使用 numpy.linalg.solve它实现了 LAPACK 例程 *gesv . 根据文档 DGESV computes the solution to a real s
问题描述 对于方阵,可以得到SVD X= USV' 分解,通过简单地使用 numpy.linalg.svd u,s,vh = numpy.linalg.svd(X) 例程或 numpy.lin
有没有办法提高numpy.linalg.eig()和scipy.linalg.eig()的输出精度? 我正在对角化一个非对称矩阵,但我希望在物理基础上得到正负特征值对的实谱。事实上,特征值确实成对出现
lstsq 尝试解决 Ax=b 最小化 |b - Ax|。 scipy 和 numpy 都提供了一个具有非常相似接口(interface)的 linalg.lstsq 函数。文档没有提到使用哪种算法,
如果我有一个由五个向量 v1...v5 组成的向量空间,则找到 A 的正交基,其中 A=[v1,v2...v5] 且 A 为 5Xn 我应该使用np.linalg.qr(A)还是scipy.linal
我必须求解 x 的大量“Ax=B”类型的线性矩阵方程,其中 A 是一个稀疏矩阵,主要填充主对角线,B 是一个向量。 我的第一种方法是通过 numpy.linalg.solve 使用密集的 numpy
我不太明白为什么 numpy.linalg.solve() 给出了更准确的答案,而 numpy.linalg.inv() 有点崩溃,给出 (我相信是)估计。 举一个具体的例子,我正在求解方程 C^{-
我有一个奇怪的现象,虽然 scipy.sparse.linalg.eigs 对于稀疏矩阵应该更快,但我知道它运行得比正常的 eigvals 方法慢scipy: In [4]: %timeit m.ca
我正在使用 Spark cluster 2.0,我想从 org.apache.spark.mllib.linalg.VectorUDT 转换一个向量至org.apache.spark.ml.linal
我有下面的代码,我使用命令 scipy.linalg.lu() 计算给定方阵的 L 矩阵,然后我再次执行相同的操作,除了然后应用于给定矩阵的稀疏形式使用 scipy.sparse.linalg.slu
我在学习SVD通过关注这个 MIT course . 矩阵构造为 C = np.matrix([[5,5],[-1,7]]) C matrix([[ 5, 5], [-1, 7]]
如何从org.apache.spark.mllib.linalg.SparseVector至org.apache.spark.ml.linalg.SparseVector ? 我正在从 mllib 转
有人可以帮我解决以下错误吗?我正在尝试将数据帧转换为 rdd,以便它可以用于回归模型构建。 Spark 版本:2.0.0 错误 => ClassCastException: org.apache.sp
我正在尝试在 Python 上实现最小二乘曲线拟合算法,我已经在 Matlab 上编写了它。但是,我无法获得正确的变换矩阵,而且问题似乎发生在求解步骤。 (编辑:我的变换矩阵在 Matlab 中非常准
前言 numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。本文讲给大家介绍关于numpy基础之 np.linalg的相关内容,下面
我是一名优秀的程序员,十分优秀!