【发布时间】:2013-12-24 17:23:32
【问题描述】:
我有一个简单的数据;
x = numpy.array([1,2,3,
4,5,6,
7,8,9,
10,11,12,
13,14,15,
16,17,18,
19,20,21,
22,23,24])
y = numpy.array([2149,2731,3397,
3088,2928,2108,
1200,659,289,
1141,1726,2910,
4410,5213,5851,
5817,5307,4314,
3656,3081,3103,
3535,4512,5584])
我可以创建线性回归并使用以下代码进行猜测:
z = numpy.polyfit(x, y, 1)
p = numpy.poly1d(z)
但我想创建这些数据的非线性回归并使用如下代码绘制图形:
import matplotlib.pyplot as plt
xp1 = numpy.linspace(1,24,100)
plt.plot(x, y, 'r--', xp1, p(xp1))
plt.show()
我看到了这样的代码,但对我没有帮助:
def func(x, a, b, c):
return a*np.exp(-b*x) + c
...
popt, pcov = curve_fit(func, x, y)
...
那么进行非线性回归的代码是什么?我可以用非线性方程做出什么猜测?
【问题讨论】:
-
如果“猜测”是指对参数的估计,则可以使用带有
curve_fit的参数,它将guess作为(可选)第四个参数p0:curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw)如果您要使用@Alec 建议的正弦+线性模型,您的p0将是参数a、b等的猜测元组:p0 = (1, .2, -2, 200, 1000) -
另一方面,如果你只想做一个非线性多项式,你可以用
z = numpy.polyfit(x, y, 5)替换z = numpy.polyfit(x, y, 1),瞧。 -
哇,您的代码运行良好。它给了我等式: 0.1171* x5 - 7.145* x4 + 153.6* x3 - 1369* x2 + 4595* x - 1527 这意味着我可以用我认为的任何 x 值进行估计吗?
-
是的,您可以在任何
x处计算多项式。如果您只想估计其他x的值,那么插值可能更适合您的目的。scipy.interpolate -
非常感谢。您能否给我一个简单的示例代码,其中包含 scipy.interpolate 的简单数据(或我给定的数据)?
标签: python numpy statistics scipy regression