Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的pylab.poly1d(fit)通过零点?_Python_Numpy_Matplotlib - Fatal编程技术网

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

Python 如何使我的pylab.poly1d(fit)通过零点?,python,numpy,matplotlib,Python,Numpy,Matplotlib,下面的代码在我的图中生成了一个点的多边形拟合,但我希望这个拟合总是通过零,我该怎么做 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(fi

下面的代码在我的图中生成了一个点的多边形拟合,但我希望这个拟合总是通过零,我该怎么做

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' )

如前所述,您不能使用
polyfit
(但您可以编写自己的函数)显式地执行此操作


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

当拟合n次多项式时
p(x)=a0+a1*x+a2*x**2+…+一个*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-', )

它看起来像是在进行最小二乘拟合,因此很难将其固定到特定点。我会使用你自己的最小二乘拟合器(你可以用一些矩阵数学来做),并省略常数项。我现在尝试使用numpy.linalg.lstsq(a,b,rcond=0)来看看这是否比使用你自己的拟合器更好。我没有投反对票,但当有精确解可用时,我并不特别喜欢这个答案。在现实生活中,重量有多大?如果它太大,你可能会在剩下的点上出现舍入错误,如果它太小,它可能会解决一些问题,但不会解决其他问题(最糟糕的错误!)。@Hooked这就是为什么它是一个黑客,以防OP想继续使用
polyfit
(他可能会也可能不会)。我在我的回答中明确写下了这一点。顺便说一句,最糟糕的错误是你不知道的错误。