python线性拟合curve_fit

曲线拟合转化为线性拟合

    非线性回归的情况太过复杂,在生产实践中也尽量避免使用这种模型。好在分类算法有很多,而且更多的是为了处理半结构化数据,所以非线性回归相关的内容只做一般了解即可。

    非线性回归一般可以分为一元非线性回归和多元非线性回归。

    一元非线性回归是指两个变量-----一个自变量,一个因变量之间呈现非线性关系,如双曲线、二次曲线、三(多)次曲线、幂曲线、指数曲线、对数曲线等。在解决这些问题时通常建立的是非线性回归方程或者方程组。

    多元非线性回归分析是指两个或两个以上自变量和因变量之间呈现的非线性关系建立非线性回归模型。对多元非线性回归模型求解的传统做法,仍然是想办法把它转化成标准的线性形式的多元回归模型来处理。有些非线性回归模型,经过适当的数学变换,便能得到它的线性化的表达形式,但对另外一些非线性回归模型,仅仅做变量变换根本无济于事。属于前一种情况的非线性回归模型一般称为内蕴的线性回归,而后者则称之为内蕴的非线性回归。

    线性拟合里最简单的就是上述y=ax+b这种形式。除此之外,可以将等式两边转化为几个一次式加和的情况,不论是一元的还是多 元的,都仍然是线性回归研究的范畴。再如:

   20世纪60年代的世界人口状况如表所示。

年份 世界人口(亿) 年份 世界人口(亿)
1960 29.72 1965 32.85
1961 30.61 1966 33.56
1962 31.51 1967 34.20
1963 32.13 1968 34.83
1964 32.34

    根据马尔萨斯人口模型:
在这里插入图片描述
公式1

    其中s是人口,t是年份,e是自然常数(约取2.71828),试着推导一下到2030年时世界人口的数量。这个问题是-一个 比较典型的多元线性回归的问题模型。求解如下。
对等式两边同时取In (以e为底的log),得到:

In s=βt+Ina
    在这里实际上用的还是线性回归模型,相当于
y=ax+b
Ins=y
β=a
In a=b

这种使用方式在Python中同样可以套用线性回归的方法,代码如下:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

#原始数据
T = [1960,1961,1962,1963,1964,1965,1966,1967,1968]
S = [29.72,30.61,31.51,32.13,32.34,32.85,33.56,34.20,34.83]

xdata = np.array(T)
ydata = np.log(np.array(S))

def func(x,a,b):
    return a + b*x

#使用非线性最小二乘法拟合函数
popt,pcov = curve_fit(func,xdata,ydata)

#画图
plt.plot(xdata,ydata,'ko',label='Original Noised Data')
plt.plot(xdata,func(xdata,*popt),'r',label='Fitted Curve')
plt.legend()
plt.show()

如图所示,横轴写着+1.96e3,这是用科学记数法来表示的,意思为1.96x103,也就是1 960,横轴上的点就是1 960~ 1 968。纵轴是Ins的值,斜率是β的值,截距是ln a的值,计算完成后通过代换可以计算出β和a的值。
python线性拟合curve_fit_第1张图片
   在这个例子中,最后可以得到β=0.01859, a=4.484 013958 667 16 X 10-15
   代人公式1,求得s的值,单位是亿。
   在预测人口数量时,直接把年份代人即可,如2000年时,代人公式得到s约为62.9亿。

XIANGLIN
2019年12月27日于长沙

你可能感兴趣的:(python系列,机器学习,python)