我的代码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' )
答案 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-', )
答案 1 :(得分:-1)
如上所述,您无法使用polyfit
明确地执行此操作(但您可以编写自己的函数)。
但是,如果你仍想使用polyfit()
,你可以尝试这个数学黑客:在0处添加一个点,然后使用w
中的polyfit()
标志(权重)来给出它的重量很重,而所有其他点的重量都很轻。这将强制多项式在零或非常接近时通过。