我一直在使用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不会让我)。
我想强迫它通过零。
我该怎么做?
答案 0 :(得分:5)
如果你不需要使用原始最小二乘公式计算拟合误差(即最小化Σ| y i - (ax i 2 < / sup> + bx i )| 2 ),您可以尝试执行y/x
的线性拟合,因为( ax 2 + bx)/ x = ax + 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的抛物线。)
答案 1 :(得分:0)
如果有人必须在截止日期之前完成此操作,快速解决方案是在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)