【问题标题】:Creating Non Linear Regression with Python使用 Python 创建非线性回归
【发布时间】: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 作为(可选)第四个参数p0curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw)如果您要使用@Alec 建议的正弦+线性模型,您的p0 将是参数ab 等的猜测元组: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


【解决方案1】:

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

那么,您有兴趣了解curve_fit(func, x, y) 的工作原理。这个想法是您希望最小化某些函数模型(如y = m*x + b 表示一条线)与模型上的点之间的差异。 func 参数代表此模型:您正在创建一个函数,该函数将模型的因变量(在我的示例中为 x)作为其第一个参数,并且对于所有后续参数,模型的参数(那些将是 @ 987654325@ 和 b 在线性模型的情况下)。 xy 你已经猜到了。

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

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

或 5 次多项式。

【讨论】:

  • 可能你的意思是y = a*sin(b*x + c) + d*x + e
  • 对不起,是的。谢谢askewchan。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2018-03-11
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 2012-09-17
相关资源
最近更新 更多