回归拟合(一)
2017-11-01 本文已影响64人
那未必
基础准备
首先需要安装 statsmodels:
pip install statsmodels
statsmodels是一个python的统计分析包,有很多统计模型可以使用。编程时,习惯的引入方式是:
import statsmodels.api as sm
一元线性回归拟合
创建实验数据
为了验证方便,首先自己创建一组散点,分布在 y=1+10x 直线的周围。
import statsmodels.api as sm
import numpy as np
# 先自己创造一组随机坐标点
# 坐标点在 y=1+10x 附近
# 模拟策略:
# 设想有若干个 y=kx+m, k=10, m=1,
# x 是某区间中的一组随机数,
# 然后算出 y
# 用矩阵相乘的方式来表达这个过程比较方便
nsample=100
x=np.linspace(0,10,nsample)
X=sm.add_constant(x)
beta=np.array([1,10])
# 添加一点随机扰乱值
e=np.random.normal(size=nsample)
# 两个矩阵相乘,得到y值
y=np.dot(X,beta)+e
拟合数据
这才是本文的重点。如果已经有了前面创建的 y、 X数据,现在只需要用 sm.OLS 模型拟合一下。总共就两步:第一、创建模型;第二、fit 数据。
model=sm.OLS(y,X)
result=model.fit()
打印一下拟合结果:
print result.params
输出:
[ 0.85704777 10.00038404]
也就是 m=0.86, k=10.00
还可以输出更详细的拟合结果报告:
print result.summary()
拟合结果
输出结果中,coef 列是 k和m值,而 std err 列则表达了相关性,可以认为是 1-相关系数。
图示化展现
y_fitted=result.fittedvalues
fig,ax=plt.subplots(figsize=(8,6))
ax.plot(x,y,'o',label='data')
ax.plot(x,y_fitted,'r--.',label='OLS')
ax.legend(loc='best')
拟合图像