多项式拟合经过1点,力导数= 0

时间:2017-08-31 12:46:05

标签: python-2.7 numpy derivative

我正在寻找与a, b, c, d = pickle.load(open("review_sents_1859888.pkl", 'rb')) 类似的内容 我有一个固定点的曲线看起来像一个2次多项式

我想做的是:

  • 完全通过第一点(在以下示例中为numpy.polyfit
  • 第一点有(0.05 , 1.0)

示例:

derivative =0

TabX

0,050 ; 0,055 ; 0,060 ; 0,065 ; 0,070 ; 0,075 ; 0,080 ; 0,085 ; 0,090 ; 0,095 ; 0,100 ; 0,110 ; 0,120 ; 0,130 ; 0,140 ; 0,150 ; 0,160 ; 0,170 ; 0,180 ; 0,190 ; 0,200 ; 0,210 ; 0,220 ; 0,230 ; 0,243

TabY

我已经找到了一个简单但又野蛮的#34;通过第一点的解决方案:我在这一点上增加了很多权重,无论是使用权重函数,还是在1,000000000 ; 1,000446069 ; 1,000395689 ; 1,000359466 ; 1,000313867 ; 0,999937484 ; 0,999760969 ; 0,999811533 ; 0,999966352 ; 0,999767956 ; 1,000148567 ; 1,000634904 ; 1,000735849 ; 1,001199937 ; 1,001510678 ; 1,001722496 ; 1,001992602 ; 1,002487029 ; 1,003492247 ; 1,004006533 ; 1,004832845 ; 1,005730132 ; 1,006327527 ; 1,007109894 ; 1,008266254 0.05中添加了大量TabX 1.0并使用正常的np.polyfit函数。它很丑,但它确实有效。

但我真的不知道如何在TabY

derivative=0

另外,在this thread中,据说拉格朗日乘数可以做到这一点,但我无法使用@Jaime编写的函数,我有凸起的错误(0.05;1.0)

此外,由于我必须能够在基本LinAlgError, 'Singular matrix'中启动此脚本,因此该解决方案只能使用基本Abaquspython 2.7。在此实现中无法使用numpyscipy

_____________________________________________________________________

编辑:使用DanielF回答,我可以做一些半工作(也感谢DanielF对我原来的帖子进行更正,更简单易读)

使用新原点是个好主意 但是,我无法使用我的数据提高效率 这是有效的:

matplotlib

但是如果我想使用我的数据制作int 在主要我把:

def WorkingDeg4 ():
    x = np.arange(100)
    y0 = 4.0*x**4+0.07 * x ** 3 + 0.3 * x ** 2 + 1.1 * x
    y = y0 + 1000 * np.random.randn(x.shape[0])
    XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T
    p_all = np.linalg.lstsq(XX, y)[0]
    pp = np.polyfit(x, y, 3)
    p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0]
    y_fit = np.dot(p_no_offset, XX[:, :-1].T)
    for i in range(0,len(x)):
        print x[i],y0[i],y[i],y_fit[i]

所以,在这一点上,我做了#34;回到原点"相

我想和if __name__ == '__main__': MyDataX=[0.050 , 0.055 , 0.060 , [...], 0.243] MyDataY=[1.000000000 , 1.000446069 , 1.000395689 , [...] , 1.008266254] TabX=[0.0]*len(MyDataX) TabY=[0.0]*len(MyDataY) for i in range(0,len(TabX)): TabX[i]=MyDataX[i]-MyDataX[0] TabY[i]=MyDataY[i]-MyDataY[0] 做同样的事情,但是对于我的数据,所以我复制了一下tge WorkingDeg4,只是去掉了x和y的创建并把它放到参数中

def Working

而且这个没有用......我在线上有一个mystake

def NOTWorkingDeg4 (x,y): XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T p_all = np.linalg.lstsq(XX, y)[0] pp = np.polyfit(x, y, 3) p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0] y_fit = np.dot(p_no_offset, XX[:, :-1].T)

XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T

因此,根据我的理解,它不想这样做,因为我的时间TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int',x不是整数。但我不知道如何解决这个问题

_____________________________________________________________________ 编辑2:找到它: 问题是启动TabX和TabY,而不是作为数组,而是作为np.array 错了:

x**4

右:

TabX=[0.0]*len(MyDataX)
TabY=[0.0]*len(MyDataY)

1 个答案:

答案 0 :(得分:0)

您可能希望转移数据,以便(0.05, 1.0)成为您的来源(0, 0),以便更轻松地进行计算,然后执行numpy.linalg.lstsq

x = TabX - 0.05
y = TabY - 1.0
X_poly = np.vstack((x ** 4, x ** 3, x ** 2))
poly_coeffs = np.linalg.lstsq(X_poly.T, y)
y_fit = np.dot(poly_coeffs, X_poly)

如果需要,你必须将多项式转换回旧坐标,但这种变换使得拟合更加简单。

有关详细信息,请参阅This answer