4

我的代码在我的图表中生成了一个 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' )
4

2 回答 2

6

当您将 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从该矩阵中删除第 -th 列,则实际上将多项式中的该系数设置为 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-', )

在此处输入图像描述

于 2013-07-29T23:03:56.087 回答
-1

如前所述,您不能真正明确地使用polyfit(但您可以编写自己的函数)。

但是,如果您还想继续使用polyfit(),您可以尝试这个数学技巧:在零处添加一个点,然后使用w标志(权重)polyfit()赋予它高权重,而所有其他点都获得低权重。这将具有强制多项式在零处或非常接近处通过的效果。

于 2013-07-29T20:39:18.417 回答