numpy.linalg.det个州的文件显示

行列式是使用LAPACK例行程序z/dgetrf通过LU分解计算的.

我运行了以下运行时测试,并拟合了2、3和4度多项式,因为这涵盖了this table个最差选项中最差的选项.该表还提到,LU分解方法需要花费$O(n^3)$时间,但给出here的LU分解的理论复杂性是$O(n^2.376)$.当然,算法的 Select 很重要,但我不确定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()

上面的输出如下图所示.

enter image description here

由于没有一个可用的复杂度可以归结为二次时间,所以我毫不奇怪二次模型在视觉上最不适合.三次模型和四次模型都有很好的视觉拟合,它们的残差密切相关也就不足为奇了.

enter image description here


存在一些相关的问题,但对于这个具体的实现,这些问题没有答案.

由于全球许多Python程序员都在使用这种实现,如果能够找到答案,可能会有助于许多人的理解.

推荐答案

TL;DR:关于目标BLAS的实现,它介于O(n^2.81)O(n^3)之间.

事实上,Numpy使用LU分解(在日志(log)空间中).实际实现可以在here中找到.它确实使用了拉巴克的sgetrf/dgetrf原语.多个库提供了这样一个库.最著名的是NetLib,尽管它不是最快的.英特尔MKL是提供快速实现的库的一个例子.快速LU分解算法使用平铺方法,以便在内部使用矩阵乘法.他们这样做是因为矩阵乘法是线性代数库中最优化的方法之一(例如MKL、BLIS和OpenBLAS通常能在现代处理器上达到接近最佳的性能).更一般地说,是the complexity of the LU decomposition is the one of the matrix multiplication.

naive平方矩阵乘法的复杂度是O(n^3).存在速度更快的算法,比如Strassen(~O(n^2.81)次运行),这通常用于大型矩阵.Coppersmith–Winograd算法的复杂度要高得多(~O(n^2.38)),但由于它是galactic algorithm,所以复杂度为no linear algebra libraries actually use it.简而言之,这种算法理论上比其他算法高asymptotically better,但隐藏常数使其在任何real-world种情况下都为impractical.有关矩阵乘法复杂性的更多信息,请阅读this article.因此,关于目标BLAS实现(这取决于您的平台和Numpy的配置).

Python相关问答推荐

抓取rotowire MLB球员新闻并使用Python形成表格

Python库:可选地支持numpy类型,而不依赖于numpy

Python中绕y轴曲线的旋转

pyscript中的压痕问题

Pandas:将多级列名改为一级

对象的`__call__`方法的setattr在Python中不起作用'

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

合并帧,但不按合并键排序

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

pandas:对多级列框架的列进行排序/重新排序

如何在BeautifulSoup/CSS Select 器中处理regex?

Python—转换日期:价目表到新行

交替字符串位置的正则表达式

如何根据rame中的列值分别分组值

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

仅取消堆叠最后三列

Django查询集-排除True值

根据两个lambda条件筛选组并根据条件创建新列的最佳方式是什么?

基于符号和位置 Select 数据帧特定区域的毕达式方法

为什么for循环中会有范围错误?