4

我一直在使用该numpy.polyfit功能进行一些预测。如果我输入 1 的次数,它可以工作,但我需要进行二次多项式拟合。在某些情况下它有效,在其他情况下,预测图会下降,然后永远上升。例如:

import matplotlib.pyplot as plt
from numpy import *

x=[1,2,3,4,5,6,7,8,9,10]
y=[100,85,72,66,52,48,39,33,29,32]
fit = polyfit(x, y, degree) 
fitfunction = poly1d(z4)
to_predict=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

plt.plot(to_predict,fitfunction(to_predict))
plt.show()

在我运行它之后,这会显示出来(我尝试放一张图片,但stackoverflow不会让我)。

我想强迫它通过零。

我该怎么做?

4

2 回答 2

6

如果您不需要使用原始最小二乘公式计算拟合误差(即最小化 ∑ |y i - (ax i 2 + bx i )| 2),您可以尝试执行线性拟合y/x,因为 (斧头2 + bx)/x = 斧头 + b。

如果必须使用相同的误差度量,请直接构造系数矩阵并使用numpy.linalg.lstsq

coeff = numpy.transpose([x*x, x])
((a, b), _, _, _) = numpy.linalg.lstsq(coeff, y)
polynomial = numpy.poly1d([a, b, 0])

(请注意,您提供的数据序列看起来不像 y 截距为 0 的抛物线。)

于 2012-07-21T21:37:33.320 回答
2

如果有人必须在截止日期前执行此操作,一个快速的解决方案是在 0 处添加一堆额外的点来抵消权重。我这样做了:

for i in range(0,100):
    x_vent.insert(i,0)
    y_vent.insert(i,0)         

slope_vent,intercept_vent=np.polyfit(x_vent,y_vent,1)
于 2016-11-28T06:06:03.077 回答