1. 在统计学中,回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型,可以分为线性回归分析和非线性回归分析。线性回归通常是人们在学习预测模型时首选的技术之一,它的因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。线性回归过程主要解决的就是如何通过样本来获取最佳的拟合线。最常用的方法便是最小二乘法,它通过最小化误差的平方和寻找数据的最佳函数匹配。
2. 线性回归的代数推导:
3. 一元线性回归的python实现方式:
使用随机数生成器,得到30组随机数作为我们的原始数据。样本数据为y=10+5x,但是添加了一个随机扰动项。猜测其模型结果应该是y = 5*x+12.5
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#机器学习模块导入线性回归模型
from sklearn.linear_model import LinearRegression
rng = np.random.RandomState(2)
xtrain = 10 * rng.rand(30)
ytrain = 10 + 5 * xtrain + 5*rng.rand(30)
查看我们的样本数据,以散点图显示:
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
plt.scatter(xtrain,ytrain,marker = '.',color = 'r')
plt.grid()
plt.title('样本数据散点图')
样本数据如下:
创建线性回归模型并查看结果
coef_和intercept可直接查看回归模型的参数,可以看到模型为y=4.98669057 * x + 12.695465281792064,与我们猜测的结果y=12.5+5*x还算接近
具体代码如下:
xtest = np.linspace(0,10,10)
ytest = model.predict(xtest[:,np.newaxis])
ytest2 = model.predict(xtrain[:,np.newaxis]) #样本数据对应的预测值
#绘制拟合结果和误差图
ax2 = fig.add_subplot(1,2,2)
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.scatter(xtrain,ytest2,marker = 'x',color = 'g')
plt.plot(xtest,ytest,color = 'r')
plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'grey')
plt.grid()
plt.title('线性回归拟合')
拟合好了之后需要进行模型检验,如下
(r2 = ssr / sst,为了记忆几个统计量,可以手工算下r2,也可调用score函数,两者计算的结果均为0.9858525390892754)
from sklearn import metrics
mse = metrics.mean_squared_error(ytrain,ytest2) # 求出均方差
rmse = np.sqrt(mse) # 求出均方根
#ssr = ((ytest2 - ytrain.mean())**2).sum()
#sst = ((ytrain - ytrain.mean())**2).sum()
#r2 = ssr / sst # 求出确定系数
r22 = model.score(xtrain[:,np.newaxis],ytrain)
4. 一元线性回归的R实现方式:
为了样本数据一致,将上文中的xtrain和ytrain数据导出csv文件,并用R读入。
回归结果为y = 4.987 * x + 12.695,结果一致,但感觉代码及展示方式比PYTHON简便很多,而且summary(model)可以看到各种拟合参数。
5. 多元线性回归:
多元线性回归整体类似,自变量更多一些,但是也有更多的回归处理方法,对于 处理方法暂时掌握的不足够,待补充学习。
rng = np.random.RandomState(5)
xtrain = 10 * rng.rand(150,4)
ytrain = 20 + np.dot(xtrain ,[1.5,2,-4,3])
df = pd.DataFrame(xtrain, columns = ['b1','b2','b3','b4'])
df['y'] = ytrain
pd.scatter_matrix(df[['b1','b2','b3','b4']],figsize=(10,6),
diagonal='kde',
alpha = 0.5,
range_padding=0.1)
print(df.head())
# 创建数据,其中包括4个自变量
# 4个变量相互独立
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']],df['y'])
6. 几个统计量笔记: