算法原理
线性回归遇到的问题一般是这样的。我们有m个样本,每个样本对应于n维特征和一个结果输出,如下: $(x^{(0)}_1,x^{(0)}_2,…x^{(0)}_n,y_0),(x^{(1)}_1,x^{(1)}_2,…x^{(1)}_n,y_1),…(x^{(m)}_1,x^{(m)}_2,…x^{(m)}_n,y_m)$
我们的问题是,对于一个新的 $(x^{(x)}_1,x^{(x)}_2,…x^{(x)}_n)$, 其所对应的 $y_x $是多少呢? 如果这个问题里面的 $y $是连续的,则是一个回归问题,否则是一个分类问题。
对于 $n$维特征的样本数据,如果我们使用线性回归,那么对应的模型是这样的:
其中 $θ_i (i = 0,1,2… n)$为模型参数, $x_i (i = 0,1,2… n)$为每个样本的 $n$个特征值。
这个表示可以简化,我们增加一个特征 $x_{0} = 1$ ,这样
进一步用矩阵形式表达更加简洁:
其中, 假设函数 $h_{\theta}(\bf X)$为 $m\times 1$的向量, $\mathbf \theta$为 $n\times 1$的向量,里面有 $n$个模型参数。 $\mathbf X$为 $m\times n$维的矩阵。 $m$代表样本的个数, $n$代表样本的特征数。
得到了模型,我们需要求出损失函数,一般线性回归我们用均方误差作为损失函数。损失函数的代数法表示如下:
进一步用矩阵形式表达损失函数:
我们常用的有两种方法来求损失函数最小化时候的θ参数:一种是梯度下降法,一种是最小二乘法。
公式推导
梯度下降法
假设样本数目为m
,样本特征维度为n
,$x$的形状为(m, n)
,$y$的形状为(m,)
。
对应的,$w$的形状为(n, 1)
,$b$形状为(1,1)
。
线性回归的初始抽象为下式,对于$x^{(i)}$的每个特征$x_j^{(i)}$,求解一个权重$w_j$,以及一个常数项(截距)$b$,使得加权得到的预测值与真实值尽可能相等。
为了方便,可以将$w$和$b$合并,即一个形状为(n+1, 1)
的向量$\theta$:
定义均方差误差(MSE)作为损失函数(关于为何采用MSE损失函数,详见这里),其损失函数为:
对应参数$\theta_j$的求导为:
最小二乘法
线性回归的目的是求解参数向量$\mathbf w$使得 $\mathbf {x} \mathbf {w}=\mathbf {y}$。
一般来说,在等式两边同时左乘 $\mathbf x^{-1}$即可得到 $\mathbf {w}=\mathbf {x^{-1}y}$。
然而,前提是得保证 $\mathbf {x}$可逆。因此为了使得 $\mathbf {x}$可逆,我们将其转换为 $\mathbf {x^Tx}$,即先同时左乘 $\mathbf{x^T}$使其成为一个方阵,再求逆。
具体的公式推导为:
Python 实现
1 | # -*- utf-8 -*- |
1 | # result of mini-batch gradient descent |
Scikit-learn API
1 | from sklearn.linear_model import LinearRegression, SGDRegressor |
1 | mse: 1712.1583441068674 |