Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy多边形拟合或X和Y多维数组的任何拟合_Python_Numpy_Multidimensional Array_Scipy_Model Fitting - Fatal编程技术网

Python Numpy多边形拟合或X和Y多维数组的任何拟合

Python Numpy多边形拟合或X和Y多维数组的任何拟合,python,numpy,multidimensional-array,scipy,model-fitting,Python,Numpy,Multidimensional Array,Scipy,Model Fitting,我有两个大型多维数组:Y携带50万个对象的三个测量值(例如shape=(500000,3)),而X具有相同的形状,但包含Y测量值的位置 首先,我想为每一行(包含一个对象)拟合一个多项式方程。我知道迭代数组的速度很慢,但目前我正在做的是: fit = array([polyfit(X[i],Y[i],deg) for i in xrange(obs.shape[0])]) 我的问题是:是否有可能在不显式迭代的情况下拟合两个数组的每一行?有可能在不沿第一个轴迭代的情况下进行拟合。然而,您的第二个轴

我有两个大型多维数组:
Y
携带50万个对象的三个测量值(例如
shape=(500000,3)
),而
X
具有相同的形状,但包含
Y
测量值的位置

首先,我想为每一行(包含一个对象)拟合一个多项式方程。我知道迭代数组的速度很慢,但目前我正在做的是:

fit = array([polyfit(X[i],Y[i],deg) for i in xrange(obs.shape[0])])

我的问题是:是否有可能在不显式迭代的情况下拟合两个数组的每一行?

有可能在不沿第一个轴迭代的情况下进行拟合。然而,您的第二个轴相当短(只有3个),您只能拟合2个系数

In [67]:

import numpy as np
import scipy.optimize as so

In [68]:

def MD_ployError(p, x, y):
    '''if x has the shape of (n,m), y must be (n,m), p must be (n*p, ), where p is degree'''
    #d is no. of degree
    p_rshp=p.reshape((x.shape[0], -1))
    f=y*1.
    for i in range(p_rshp.shape[1]):
        f-=p_rshp[:,i][:,np.newaxis]*(x**i)
    return (f**2).sum()

In [69]:

X=np.random.random((100, 6))
Y=4+2*X+3*X*X
P=(np.zeros((100,3))+[1,1,1]).ravel()

In [70]:

MD_ployError(P, X, Y)

Out[70]:
11012.2067606684

In [71]:

R=so.fmin_slsqp(MD_ployError, P, args=(X, Y))
Iteration limit exceeded    (Exit mode 9) #you can increase iteration limit, but the result is already good enough.
            Current function value: 0.00243784856039
            Iterations: 101
            Function evaluations: 30590
            Gradient evaluations: 101

In [72]:

R.reshape((100, -1))

Out[72]:
array([[ 3.94488512,  2.25402422,  2.74773571],
       [ 4.00474864,  1.97966551,  3.02010015],
       [ 3.99919559,  2.0032741 ,  2.99753804],
..............................................)

是的,如果您使用
np.polynomic
中的新numpy多边形拟合:

时间:

In [692]: timeit fit = np.array([np.polyfit(X, y, 2) for y in Y])
 1 loops, best of 3: 2.22 s per loop

In [693]:  timeit fits = np.polynomial.polynomial.polyfit(X, Y.T, 2)
100 loops, best of 3: 3.63 ms per loop

您是否尝试过类似“沿轴应用”的方法?对于3个点,您只能拟合线性或二次(精确拟合)函数。在这两种情况下都可以计算一个显式解,然后可以对所有行同时进行矢量化计算。实际上,三个点只是为了举例说明,当我真正应用该方法时,维度会更大。我认为OP意味着
X
也具有
(10000,3)的形状
对于
d
度(系数),结果需要是
(10000,d)
:通过
y
的每一行拟合
x的每一行。正如我在上面所评论的,我确实想要更普遍的解决方案。选择维度3只是为了表述问题。维度
3
不是这里的限制,而是数组的形状。也就是说,
y
中的每一行都有不同的
x
值。对于一组位置(
x
),通常有多组测量值(
y
),但您有完全独立的测量值和位置。我不认为有一种简单的方法可以使用内置多项式拟合同时拟合它们,你必须像@CT那样定义你自己的误差函数。谢谢朱。然而,这个方法比我的单行实现快吗?这取决于它。如果你能提供一个函数来计算误差函数的导数,它会更快。如果初始猜测参数为“良好猜测”,则会更快。不同的优化器可能更快。但总的来说,我认为这可能是一种过分的做法,特别是如果你没有设置任何约束条件(比如x^2的系数必须相等)。我也遇到过同样的情况,我选择了
多处理
(但在这种情况下,我为每一行拟合了一个非常复杂的模型)。毕竟,任何一行的配件都完全独立于其他行。
In [692]: timeit fit = np.array([np.polyfit(X, y, 2) for y in Y])
 1 loops, best of 3: 2.22 s per loop

In [693]:  timeit fits = np.polynomial.polynomial.polyfit(X, Y.T, 2)
100 loops, best of 3: 3.63 ms per loop