如何使我的pylab.poly1d(fit)通过零?

时间:2013-07-29 17:33:26

标签: python numpy matplotlib

我的代码bellow在我的图表中产生了一个点的polyfit,但我希望这个值总是通过零,我该怎么做?

import pylab as pl
import numpy as np

y=(abs((UX2-UY2)+(2*UXY)))
a=np.mean(y)
y=y-a
x=(abs((X2-Y2)+(2*XY)))
b=np.mean(x)
x=x-b
ax=pl.subplot(1,4,4) #plot XY
fit=pl.polyfit(x,y,1)
slope4, fit_fn=pl.poly1d(fit)
print slope4
fit_fn=pl.poly1d(fit)
x_min=-2
x_max=5
n=10000
x_fit = pl.linspace(x_min, x_max, n) 
y_fit = fit_fn(x_fit)
q=z=[-2,5]
scat=pl.plot(x,y, 'o', x_fit,y_fit, '-r', z, q, 'g' )

2 个答案:

答案 0 :(得分:5)

当您将n次多项式p(x) = a0 + a1*x + a2*x**2 + ... + an*x**n拟合到一组数据点(x0, y0), (x1, y1), ..., (xm, y_m)时,使用如下所示的系数矩阵调用np.lstsq

[1 x0 x0**2 ... x0**n]
[1 x1 x1**2 ... x1**n]
...               
[1 xm xm**2 ... xm**n]

如果从该矩阵中删除j列,则有效地将多项式中的系数设置为0.因此,为了摆脱a0系数,您可以执行以下操作: / p>

def fit_poly_through_origin(x, y, n=1):
    a = x[:, np.newaxis] ** np.arange(1, n+1)
    coeff = np.linalg.lstsq(a, y)[0]
    return np.concatenate(([0], coeff))

n = 1000
x = np.random.rand(n)
y = 1 + 3*x - 4*x**2 + np.random.rand(n)*0.25

c0 = np.polynomial.polynomial.polyfit(x, y, 2)
c1 = fit_poly_through_origin(x, y, 2)

p0 = np.polynomial.Polynomial(c0)
p1 = np.polynomial.Polynomial(c1)

plt.plot(x, y, 'kx')
xx = np.linspace(0, 1, 1000)
plt.plot(xx, p0(xx), 'r-', )
plt.plot(xx, p1(xx), 'b-', )

enter image description here

答案 1 :(得分:-1)

如上所述,您无法使用polyfit明确地执行此操作(但您可以编写自己的函数)。

但是,如果你仍想使用polyfit(),你可以尝试这个数学黑客:在0处添加一个点,然后使用w中的polyfit()标志(权重)来给出它的重量很重,而所有其他点的重量都很轻。这将强制多项式在零或非常接近时通过。