线性回归
Linear Regression——线性回归
是什么?
是机器学习中有监督机器学习下的一种简单的回归算法。
分为一元线性回归(简单线性回归)和多元线性回归,其中一元线性回归是多元线性回归的一种特殊情况,我们主要讨论多元线性回归
做什么?
回归问题关注的是一个因变量和一个或多个自变量的关系,根据已知的自变量来预测因变量.
如果因变量和自变量之间的关系满足线性关系(自变量的最高幂为一次),那么我们可以用线性回归模型来拟合因变量与自变量之间的关系.
怎么做?
简单线性回归的公式如下:
y^=ax+b
多元线性回归的公式如下:
y^=θTx
上式中的θ为系数矩阵,x为单个多元样本.
由训练集中的样本数据来求得系数矩阵,求解的结果就是线性回归模型,预测样本带入x就能获得预测值y^,求解系数矩阵的具体公式接下来会推导.
推导过程
推导总似然函数
假设线性回归公式为y^=θx.
真实值y与预测值y^之间必然有误差ϵ=y^−y,按照中心极限定理(见知识储备),我们可以假定ϵ服从正态分布,正态分布的概率密度公式为:
ρ(x)=σ2π1e−2σ2(x−μ)2
为了模型的准确性,我们希望ϵ的值越小越好,所以正态分布的期望μ为0.概率函数需要由概率密度函数求积分,计算太复杂,但是概率函数和概率密度函数呈正相关,当概率密度函数求得最大值时概率函数也在此时能得到最大值,因此之后会用概率密度函数代替概率函数做计算.
我们就得到了单个样本的误差似然函数(μ=0,σ为某个定值):
ρ(ϵ)=σ2π1e−2σ2(ϵ−0)2
而一组样本的误差总似然函数即为:
Lθ(ϵ1,⋯,ϵm)=f(ϵ1,⋯,ϵm∣μ,σ2)
因为我们假定了ϵ服从正态分布,也就是说样本之间互相独立,所以我们可以把上式写成连乘的形式:
f(ϵ1,⋯,ϵm∣μ,σ2)=f(ϵ1∣μ,σ2)∗⋯∗f(ϵm∣μ,σ2)
所以
Lθ(ϵ1,⋯,ϵm)=i=1∏mf(ϵi∣μ,σ2)=i=1∏mσ2π1e−2σ2(ϵi−0)2
在线性回归中,误差函数可以写为如下形式:
ϵi=∣yi−y^i∣=∣yi−θTxi∣
最后可以得到在正态分布假设下的总似然估计函数如下:
Lθ(ϵ1,⋯,ϵm)=i=1∏mσ2π1e−2σ2(ϵi−0)2=i=1∏mσ2π1e−2σ2(yi−θTxi)2
推导损失函数
按照最大总似然的数学思想(见知识储备),我们可以试着去求总似然的最大值.
遇到连乘符号的时候,一般思路是对两边做对数运算(见知识储备),获得对数总似然函数:
l(θ)=loge(Lθ(ϵ1,⋯,ϵm))=loge(i=1∏mσ2π1e−2σ2(yi−θTxi)2)
l(θ)=loge(i=1∏mσ2π1e−2σ2(yi−θTxi)2)=i=1∑mlogeσ2π1exp(−2σ2(yi−θTxi)2)=mlogeσ2π1−2σ21i=1∑m(yi−θTxi)2
前部分是一个常数,后部分越小那么总似然值越大,后部分则称之为损失函数,则有损失函数的公式J(θ):
J(θ)=21i=1∑m(yi−θTxi)2=21i=1∑m(yi−hθ(xi))2=21i=1∑m(hθ(xi)−yi)2
解析方法求解线性回归
要求的总似然最大,需要使得损失函数最小,我们可以对损失函数求导.
首先对损失函数做进一步推导:
J(θ)=21i=1∑m(hθ(xi)−yi)2=21(Xθ−y)T(Xθ−y)
注意上式中的X是一组样本形成的样本矩阵,θ是系数向量,y也是样本真实值形成的矩阵,这一步转换不能理解的话可以试着把21(Xθ−y)T(Xθ−y)带入值展开试试.
所以
J(θ)=21i=1∑m(hθ(xi)−yi)2=21(Xθ−y)T(Xθ−y)=21((Xθ)T−yT)(Xθ−y)=21(θTXT−yT)(Xθ−y)=21(θTXTXθ−yTXθ−θTXTy+yTy)
根据黑塞矩阵可以判断出J(θ)是凸函数,即J(θ)的对θ的导数为零时可以求得J(θ)的最小值.
对J(θ)求导,对矩阵求导的知识可以参考’知识储备’章节:
∂θ∂J(θ)=21(2XTXθ−(yTX)T−XTy)=21(2XTXθ−XTy−XTy)=XTXθ−XTy
当上式等于零时可以求得损失函数最小时对应的θ,即我们最终想要获得的系数矩阵:
XTXθ−XTy=0XTXθ=XTy((XTX)−1XTX)θ=(XTX)−1XTyEθ=(XTX)−1XTyθ=(XTX)−1XTy
(顺便附上一元线性回归的系数解析解公式:θ=∑i=1m(xi−x)2∑i=1m(xi−x)(yi−y))
实例
简单实现
import numpy as np
import matplotlib.pyplot as plt
X = 2 * np.random.rand(100, 1)
y = 5 + 4 * X + np.random.randn(100, 1)
X = np.c_[np.ones((100,1)),X]
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
print(theta)
X_test = np.array([[0],
[2]])
X_test = np.c_[(np.ones((2, 1))), X_test]
print(X_test)
y_predict = X_test.dot(theta)
print(y_predict)
plt.plot(X_test[:,-1], y_predict, 'r-')
plt.plot(X[:,-1], y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()
sklearn实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
X = 2 * np.random.rand(100, 1)
y = 5 + 4 * X + np.random.randn(100, 1)
X = np.c_[np.ones((100,1)),X]
model = LinearRegression(fit_intercept=False)
model.fit(X,y)
print(model.intercept_,model.coef_)
X_test = np.array([[0],
[2]])
X_test = np.c_[(np.ones((2, 1))), X_test]
print(X_test)
y_predict =model.predict(X_test)
print(y_predict)
plt.plot(X_test[:,-1], y_predict, 'r-')
plt.plot(X[:,-1], y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()
优点
使用解析解的公式来求得地模型是最准确的.
缺点
计算量非常大,这会使得求解耗时极多,因此我们一般用的都是梯度下降法求解.
知识储备
距离公式
机器学习中常见的距离公式 - WingPig - 博客园
中心极限定理
是什么?
是讨论随机变量序列部分和分布渐近于正态分布的一类定理。这组定理是数理统计学和误差分析的理论基础,指出了大量随机变量累积分布函数逐点收敛到正态分布的积累分布函数的条件。线性回归中的误差ϵ就可以看作是一个随机变量.
做什么?
在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的,中心极限定理从数学上证明了这一现象.
怎么做?
按照中心极限定理,我们可以认为当随机变量ϵ足够多的时候,是服从正态分布(即高斯分布).正态分布的概率密度函数公式为:
f(x)=σ2π1e−2σ2(x−μ)2
机器学习中我们常常假设误差符合均值为0,方差为定值的正态分布!!
最大似然值估计
是什么?
是一种统计方法
做什么?
求一个样本集的相关概率密度函数的参数,即估计一个数据集的概率密度函数.在线性回归算法中,要做的就是求正态分布函数中的μ,这里用来估计正态分布中的方差参数值.
我们要求得的是似然值最大时的参数.
怎么做?
假设每一个误差ϵ都服从正态分布,将所有的ϵ叠加起来可以获得总似然,即将每一个ϵ的概率函数相乘.
但是要求正态分布的概率函数需要对概率密度函数做积分,为了便于运算这里可以直接把正态分布的概率密度函数相乘,找到概率密度相乘最大时相当于找到了概率相乘最大的时候.
矩阵求导
常用的矩阵求导公式有: