一元线性回归理论与实践
理论
回归问题,最简单也是最为普遍的就是线性回归问题,而一元线性回归(或简单线性回归)可是一块敲门砖。
模型
一元线性回归,包括两类数据:数学上通常命名为自变量()与因变量(
),两者一一对应。样本如下:
该理论认为两者具有以下关系:
即两者称线性关系,式中$\epsilon N(0,\sigma^2 )$的正态项。可这样认为:有一个一元线性系统(模型),样本数据都是由该系统生成,由于系统一定程度的随机性,数据在整体服从一元线性关系的基础上会有着一定程度的数值偏离。
问题
按照前面提及的思想,数据为一个一元线性系统生成,按照上述公式模型,那么对于一组给定的样本数据,我们要做的就是通过该组数据复现出(具体化)模型(即求出参数),然后便可根据该模型来支持我们的分析工作和预测工作。
参数求解的简要思路
对该问题,实际上有着数学和计算机科学的两种解决思路,前者着重于纯粹的数学理论,后者在一定的数学理论基础上,辅以计算机优势(重复迭代计算)。两思路可进一步归类于统计方法和机器学习。
统计方法
由于为正态项,那么可以把
看作是$a,b,x_i,\sigma
N(aX+b,\sigma^2)$,采用参数估计中的最大似然估计。似然函数如下:
%3D%5Cprod%20P(y_i%7Ca%2Cb%2Cx_i%2C%5Csigma%5E2)%0A#card=math&code=P%28Y%7Ca%2Cb%2CX%2C%5Csigma%5E2%29%3D%5Cprod%20P%28y_i%7Ca%2Cb%2Cx_i%2C%5Csigma%5E2%29%0A)
)%20%3D%20-0.5n%5Cln%20(2%5Cpi%20%5Csigma%20%5E2)-(%5Cfrac%7B1%7D%7B2%5Csigma%20%5E2%7D)%5Csum%20_i(y_i-ax_i%20-b)%5E2%0A#card=math&code=%5Cln%20%28P%28Y%7Ca%2Cb%2CX%29%29%20%3D%20-0.5n%5Cln%20%282%5Cpi%20%5Csigma%20%5E2%29-%28%5Cfrac%7B1%7D%7B2%5Csigma%20%5E2%7D%29%5Csum%20_i%28y_i-ax_i%20-b%29%5E2%0A)
采用最大似然估计,参数#card=math&code=%28a%2Cb%29)的估计量值为
#card=math&code=%28%5Chat%7Ba%7D%2C%5Chat%7Bb%7D%29),则有:
%3D%5Carg%5Cmin%7Ba%2Cb%7DP(Y%7Ca%2Cb%2CX%2C%5Csigma%20%5E2)%20%3D%20%5Carg%5Cmax%7Ba%2Cb%7D%5Csumi(y_i-ax_i-b)%5E2%0A#card=math&code=%28%5Chat%7Ba%7D%2C%5Chat%7Bb%7D%29%3D%5Carg%5Cmin%7Ba%2Cb%7DP%28Y%7Ca%2Cb%2CX%2C%5Csigma%20%5E2%29%20%3D%20%5Carg%5Cmax_%7Ba%2Cb%7D%5Csum_i%28y_i-ax_i-b%29%5E2%0A)
利用微积分求极值思路可求出估计量#card=math&code=%28%5Chat%7Ba%7D%2C%5Chat%7Bb%7D%29)
机器学习
首先定义损失函数
%3D%5Cfrac%7B1%7D%7B2n%7D%5Csum%7Bi%3D1%7D%5En(ax_i%2Bb-y_i)%0A#card=math&code=J%28a%2Cb%29%3D%5Cfrac%7B1%7D%7B2n%7D%5Csum%7Bi%3D1%7D%5En%28ax_i%2Bb-y_i%29%0A)
然后通过梯度下降对其进行迭代参数更新,直至参数收敛。
实践
步骤:
- 数据预处理
- 调用模型
- 预测结果
- 可视化
数据集(学习时间、学习成绩):
%0A#card=math&code=X%3A%282.5%2C%205.1%2C%203.2%2C%208.5%2C%203.5%2C%201.5%2C%209.2%2C%205.5%2C%208.3%2C%202.7%2C%207.7%2C%20%5C%5C%205.9%2C%204.5%2C%203.3%2C%201.1%2C%208.9%2C%202.5%2C%201.9%2C%206.1%2C%207.4%2C%202.7%2C%204.8%2C%203.8%2C%5C%5C%206.9%2C%207.8%2C%202.1%2C%202.2%2C%202.5%29%0A)
%0A#card=math&code=Y%3A%2821%2C%2047%2C%2027%2C%2075%2C%2030%2C%2020%2C%2088%2C%2060%2C%2081%2C%2025%2C%2085%2C%2062%2C%2041%2C%2042%2C%5C%5C%2017%2C%2095%2C%2030%2C%2024%2C%2067%2C%2069%2C%2030%2C%2054%2C%2035%2C%2076%2C%2086%2C%2093%2C%2093%2C%2093%29%0A)
数据预处理
此处仅需两个步骤:数据读取和数据集拆分
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dataset = pd.read_csv('studentscores.csv')
X = dataset.iloc[ : , : 1 ].values
Y = dataset.iloc[ : , 1 ].values
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 0.25, random_state = 0)
调用模型
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train.reshape(-1,1) , Y_train)
# 接收的X需为二维,因为LinearRegression并不只针对一元线性回归
'''
model.coef_:自变量和因变量的相关系数(回归系数),即一元函数y=ax+b中的a
model.intercept_:截距,b
'''
预测结果
Y_pre = model.predict(X_test.reshape(-1,1))
score = model.score(Y_test, Y_pre)
model.score
用于衡量模型的预测效果,定义如下
%0A#card=math&code=R%5E2%20%3D%201-%5CBig%28%5Cfrac%7Bu%7D%7Bv%7D%5CBig%29%0A)
其中,是预测值和真实值的残差和(系统误差和随机误差),
是真实值和真实值平均数的残差和(随机误差)
可视化
训练集
plt.scatter(X_train, Y_train, color='red')
plt.plot(X_train, model.predict(X_train.reshape(-1,1)), color='blue')
plt.show()
测试集
plt.scatter(X_test , Y_test, color = 'red')
plt.plot(X_test , Y_pre, color ='blue')
plt.show()