如何将二次拟合的y截距强制设为0

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不允许)。

我想让它强制经过零点。

我该如何做?


1
这段代码无法运行。degree应该为2(针对这个特定的例子),而且z4应该被拟合。 - ScienceFriction
2个回答

6

如果您不需要使用原始的最小二乘公式计算适应度误差(即最小化 ∑ |yi - (axi2 + bxi)|2),您可以尝试对 y/x 进行 线性 拟合,因为 (ax2 + 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])

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

是的,我知道它看起来没有零截距,但我分析的数据是像硬盘上的磁盘可用空间之类的东西,所以它注定会有时变成零。这个方法适用吗?我刚刚尝试了一下那个数据序列,它完美地运行了!谢谢! - user1412716
另一个问题,如果我想将某些东西强制设置为100,在我的情况下是CPU使用率,我该怎么做? - user1412716
无法工作coeff = np.transpose([x*x, x]) TypeError: 无法将序列乘以非整数类型的“列表” - Seth
x 列表转换为 numpy.array(x) 来修复它。 - Seth
1
这是否意味着与 numpy.polyfit(x, y, 2) 生成不同的值是因为y截距被强制为0?(这很有道理。只是想更好地理解一下)你怎么扩展到多个度数? - Seth
1
这会得到一个三次多项式吗? coeff = numpy.transpose([x**3, x**2, x]) - Seth

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)

@kennytm的解决方案 其实相当快。 - Alexandre Huat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接