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

ast*_*ris 4 python numpy matplotlib

我的代码下面会在我的图表中生成一个点的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' )
Run Code Online (Sandbox Code Playgroud)

Jai*_*ime 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]
Run Code Online (Sandbox Code Playgroud)

如果j从该矩阵中删除第-列,则有效地将多项式中的系数设置为0.因此,要删除a0 系数,可以执行以下操作:

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-', )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述