Python 多维中的NumPy PolyFit和PolyVal?

Python 多维中的NumPy PolyFit和PolyVal?,python,arrays,numpy,scipy,Python,Arrays,Numpy,Scipy,假设观察值的n维数组被重塑为二维数组,每行为一个观察集。使用这种重塑方法,np.polyfit可以计算整个数据阵列的二阶拟合系数(矢量化): 其中Y是形状(304000,21),X是向量。这将导致(304000,3)系数数组的拟合 使用迭代器可以为每一行调用np.polyval(fit,X)。当可能存在矢量化方法时,这是低效的。fit结果是否可以在不迭代的情况下应用于整个观测阵列?如果是,怎么做 这就是问题所在。np.多项式.多项式.polyval采用多维系数数组: >>> x

假设观察值的n维数组被重塑为二维数组,每行为一个观察集。使用这种重塑方法,
np.polyfit
可以计算整个数据阵列的二阶拟合系数(矢量化):

其中Y是形状(304000,21),X是向量。这将导致(304000,3)系数数组的拟合

使用迭代器可以为每一行调用
np.polyval(fit,X)
。当可能存在矢量化方法时,这是低效的。
fit
结果是否可以在不迭代的情况下应用于整个观测阵列?如果是,怎么做


这就是问题所在。

np.多项式.多项式.polyval
采用多维系数数组:

>>> x = np.random.rand(100)
>>> y = np.random.rand(100, 25)
>>> fit = np.polynomial.polynomial.polyfit(x, y, 2)
>>> fit.shape # 25 columns of 3 polynomial coefficients
(3L, 25L)
>>> xx = np.random.rand(50)
>>> interpol = np.polynomial.polynomial.polyval(xx, fit)
>>> interpol.shape # 25 rows, each with 50 evaluations of the polynomial
(25L, 50L)
当然:

>>> np.all([np.allclose(np.polynomial.polynomial.polyval(xx, fit[:, j]),
...                     interpol[j]) for j in range(25)])
True

np.polynomy.polynomy.polyval
是一种非常好(方便)的方法,可以有效地评估多项式拟合

然而,如果您所寻找的是“最快的”,那么只需构造多项式输入并使用基本的numpy矩阵乘法函数,计算速度就会稍微快一些(大约快4倍)

安装程序 使用与上面相同的设置,我们将创建25个不同的线配件

>>> num_samples = 100000
>>> num_lines = 100
>>> x = np.random.randint(0,100,num_samples)
>>> y = np.random.randint(0,100,(num_samples, num_lines))
>>> fit = np.polyfit(x,y,deg=2)
>>> xx = np.random.randint(0,100,num_samples*10)
Numpy的
polyval
功能 基本矩阵乘法 功能计时 使用上面相同的参数

%timeit _ = np.polynomial.polynomial.polyval(xx, fit)
1 loop, best of 3: 247 ms per loop

%timeit inputs = np.array([np.power(xx, d) for d in range(len(fit))]);_ = fit.T.dot(inputs)
10 loops, best of 3: 72.8 ms per loop
打败一匹死马


平均效率提升约3.61倍。速度波动可能来自后台的随机计算机进程

仅供参考,不要调用
np.polynomy.polyfit
的结果。使用
np.polymonal.polymonal.polyval
。请参阅。一种更优雅但仍然缓慢的方法是使用polyfit和
np。沿\u轴应用\u
@绝对是歪了!懒惰对我来说是一条完整的召唤之路@Saullo Castro-正如你所建议的那样,
np.apply_沿_轴
并不比[i,j]迭代器快。我想知道是否存在一种真正的矢量化(C级)方法。
res1 = np.polynomial.polynomial.polyval(xx, fit)
inputs = np.array([np.power(xx,d) for d in range(len(fit))])
res2 = fit.T.dot(inputs)
%timeit _ = np.polynomial.polynomial.polyval(xx, fit)
1 loop, best of 3: 247 ms per loop

%timeit inputs = np.array([np.power(xx, d) for d in range(len(fit))]);_ = fit.T.dot(inputs)
10 loops, best of 3: 72.8 ms per loop