用Python创建非线性回归

用Python创建非线性回归,python,numpy,statistics,scipy,regression,Python,Numpy,Statistics,Scipy,Regression,我有一个简单的数据 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,339

我有一个简单的数据

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

那么,进行非线性回归的代码是什么?我可以用非线性方程做些什么猜测?

您指的是scipy模块。你是对的,这可能就是你想要使用的模块

然后,您感兴趣的是了解
曲线拟合(func,x,y)
的工作原理。其思想是,您希望最小化某些函数模型(如直线的y=m*x+b)和模型上的点之间的差异。
func
参数表示此模型:您正在创建一个函数,该函数将模型的因变量(
x
在我的示例中)作为其第一个参数,并将模型的所有后续参数(对于线性模型,这些参数将是
m
b
)。您已经计算出的
x
y

然而,真正的问题是,我意识到我没有回答你的问题,你需要手动为你的数据建立某种模型(至少是模型的类型:指数、线性、多项式等)。没有简单的方法可以解决这个问题。从你的数据来看,虽然我会选择这种形式的模型

y = a*sin(b*x + c) + d*x + e

或者一个5次多项式。

你的意思可能是
y=a*sin(b*x+c)+d*x+e
对不起,是的。谢谢askewchan。如果“猜测”是指参数的估计值,那么可以使用带有
曲线拟合的参数,该参数将
猜测作为(可选)第四个参数
p0
曲线拟合(f,扩展数据,ydata,p0=None,sigma=None,**kw)
如果使用@Alec建议的正弦+线性模型,你的
p0
将是参数
a
b
等的一组猜测:
p0=(1.2,-22001000)
另一方面,如果你只想做一个非线性多项式,你可以用
z=numpy.polyfit(x,y,1)
替换为
z=numpy.polyfit(x,y,5)
,哇,你的代码工作得很好。它给了我一个方程:0.1171*x5-7.145*x4+153.6*x3-1369*x2+4595*x-1527这意味着我可以用我认为的任何x值进行估计?是的,你可以在任何
x
处计算多项式。如果您想做的只是估计其他
x
处的值,那么插值可能更适合您的目的。非常感谢你。您能给我一个简单的示例代码,其中包含scipy.interpolate的简单数据(或我给定的数据)吗?