- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
numpy.linalg.det
的文档指出
The determinant is computed via LU factorization using the LAPACK routine z/dgetrf.
我运行了以下运行时测试并拟合了 2、3 和 4 次多项式,因为它涵盖了 this table 中最差的选项。 .该表还提到 LU 分解方法需要 $O(n^3)$ 时间,但 LU 分解的理论复杂度给定 here是 $O(n^{2.376})$。自然地,算法的选择很重要,但我不确定我应该从 numpy.linalg.det
得到什么可用的时间复杂度。 .
from timeit import timeit
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
sizes = np.arange(1,10001, 100)
times = []
for size in sizes:
A = np.ones((size, size))
time = timeit('np.linalg.det(A)', globals={'np':np, 'A':A}, number=1)
times.append(time)
print(size, time)
sizes = sizes.reshape(-1,1)
times = np.array(times).reshape(-1,1)
quad_sizes = PolynomialFeatures(degree=2).fit_transform(sizes)
quad_times = LinearRegression().fit(quad_sizes, times).predict(quad_sizes)
cubic_sizes = PolynomialFeatures(degree=3).fit_transform(sizes)
cubic_times = LinearRegression().fit(cubic_sizes, times).predict(cubic_sizes)
quartic_sizes = PolynomialFeatures(degree=4).fit_transform(sizes)
quartic_times = LinearRegression().fit(quartic_sizes, times).predict(quartic_sizes)
plt.scatter(sizes, times, label='Data', color='k', alpha=0.5)
plt.plot(sizes, quad_times, label='Quadratic', color='r')
plt.plot(sizes, cubic_times, label='Cubic', color='g')
plt.plot(sizes, quartic_times, label='Quartic', color='b')
plt.xlabel('Matrix Dimension n')
plt.ylabel('Time (seconds)')
plt.legend()
plt.show()
上面的输出如下图所示。
由于所有可用的复杂性都不能归结为二次时间,因此从视觉上看,二次模型的拟合最差也就不足为奇了。三次模型和四次模型都具有出色的视觉拟合度,毫不奇怪,它们的残差密切相关。
存在一些相关问题,但他们没有针对此具体实现的答案。
由于这个实现被世界各地的许多 Python 程序员使用,如果找到答案,它可能有助于很多人的理解。
最佳答案
TL;DR:关于目标 BLAS 实现,它介于 O(n^2.81)
和 O(n^3)
之间。
的确,Numpy 使用了 LU 分解(在对数空间中)。实际实现可以引用here .它确实使用了 LAPACK 的 sgetrf
/dgetrf
原语。多个库提供了这样一个库。最著名的是 NetLib,尽管它不是最快的。英特尔 MKL 是提供快速实现的库示例。快速 LU 分解算法使用平铺方法,因此在内部使用矩阵乘法。他们这样做是因为矩阵乘法是线性代数库中最优化的方法之一(例如 MKL、BLIS 和 OpenBLAS 通常成功地在现代处理器上达到近乎最佳的性能)。更一般地,LU 分解的复杂度是矩阵乘法的复杂度之一。
朴素 平方矩阵乘法的复杂度为 O(n^3)
。存在更快的算法,例如 Strassen (在 ~O(n^2.81)
时间内运行)通常用于大矩阵。 Coppersmith–Winograd 算法实现了明显更好的复杂度 (~O(n^2.38)
),但没有线性代数库实际使用它因为这是一个galactic algorithm .简而言之,这种算法在理论上比其他算法渐进地更好,但隐藏常数使其不切实际用于任何真实世界使用。有关矩阵乘法复杂性的更多信息,请阅读 this article .因此,在实践中,关于目标,矩阵乘法的复杂度介于 O(n^2.81)
和 O(n^3)
之间BLAS 实现(取决于您的平台和 Numpy 配置)。
关于python - numpy.linalg.det 的时间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72206172/
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的相关内容,下面
我是一名优秀的程序员,十分优秀!