我有一个简单的数据;
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)
...
那么进行非线性回归的代码是什么?我可以用非线性方程做出一些猜测?
答案 0 :(得分:5)
你所指的是scipy模块。你是对的,这可能是你想要使用的模块。
然后,您感兴趣的是curve_fit(func, x, y)
的工作原理。我们的想法是,您希望最小化某个函数模型(如行的y = m*x + b
)与模型上的点之间的差异。 func
参数表示此模型:您正在创建一个函数,它将模型的因变量(在我的示例中为x
)作为其第一个参数,并为所有后续参数提供模型的参数(在线性模型的情况下,这些将是m
和b
。您已经找到了x
和y
。
真正的问题,是的,我知道我没有回答你的问题,是你需要手动弄清楚你的数据的某种模型(至少是模型的类型:指数,线性,多项式等)。没有简单的方法。从你的数据来看,虽然我会找一个表格的模型
y = a*sin(b*x + c) + d*x + e
或5度多项式。