使用Python创建非线性回归

Ric*_*nks 2 python statistics regression numpy scipy

我有一个简单的数据;

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])
Run Code Online (Sandbox Code Playgroud)

我可以创建线性回归并使用此代码进行猜测:

z = numpy.polyfit(x, y, 1)
p = numpy.poly1d(z)
Run Code Online (Sandbox Code Playgroud)

但我想创建这些数据的非线性回归,并使用如下代码绘制图形:

import matplotlib.pyplot as plt
xp1 = numpy.linspace(1,24,100)
plt.plot(x, y, 'r--', xp1, p(xp1))
plt.show()
Run Code Online (Sandbox Code Playgroud)

我看到这样的代码,但这对我无能为力:

def func(x, a, b, c):
    return a*np.exp(-b*x) + c
...
popt, pcov = curve_fit(func, x, y)
...
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lec 5

你所指的是scipy模块.你是对的,这可能是你想要使用的模块.

然后,您感兴趣的是如何curve_fit(func, x, y)工作.我们的想法是,您希望最小化某些功能模型(如y = m*x + b线)和模型上的点之间的差异.这个func参数代表了这个模型:你正在创建一个函数,它接受模型的因变量(x在我的例子中)作为它的第一个参数,并且所有后续参数都接受模型的参数(那些将是mb线性的情况)模型).该xy你已经想通了.

真正的问题,是的,我知道我没有回答你的问题,是你需要手动弄清楚你的数据的某种模型(至少是模型的类型:指数,线性,多项式等).没有简单的方法.从你的数据来看,虽然我会找一个表格的模型

y = a*sin(b*x + c) + d*x + e
Run Code Online (Sandbox Code Playgroud)

或5度多项式.