简介
说到回归一般都指线性回归,回归的目的是预测数值型的目标值。线性回归模型的优点在于结果易于理解,计算简单,缺点在于对非线性的数据拟合不好。
原理
线性回归就是对输入特征加权求和,在加上偏置项进行预测。公式如下所示:
$$
\widehat{h}=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n}
\tag{1}
$$
其中,$\widehat{h}$代表预测值,$n$是特征的个数,${x_i}$代表第i个特征值,$\theta_{i}$ 代表第i个特征的权重,将上式向量化有
$$
\widehat{h}=h_{\theta}(X)=X\theta
\tag{2}
$$
其中$\theta$是模型的参数向量,X是实例的特征向量,$h_{\theta}$是使用模型参数$\theta$做参数的假设函数。
* 注:这里为什么写成$X\theta$的形式,而不是$\theta X$呢?在实际使用中,实例的特征是行向量,由多个实例构成输入矩阵,而权重是列向量,其具体形式如下$$
X\theta=
\begin{bmatrix}
x_0^1 & x_0^2 & … &x_0^n \\
x_1^1 & x_1^2 & … &x_1^n \\
… & … & … &… \\
x_m^1 & x_m^1 & … &x_m^1
\end{bmatrix}
\begin{bmatrix}
\theta_0 \\
\theta_1 \\
… \\
\theta_n
\end{bmatrix}
$$
为了衡量模型效果,一般使用MSE(均方误差,Mean Square Error)描述线性回归的预测值和真实值之间的偏差。假设输入的样本特征为$x_1,x_2,…,x_n$,对应的样本值为$y_1,y_2,y_3,…,y_n$,则MSE的定义为
$$
J(\theta)=\frac{1}{2}(\widehat{y}_i-y_i)^2=\frac{1}{2}\sum^n_{i=1}(h_{\theta}(x_i)-y_i)^2
\tag{3}
$$
写成向量形式有
$$
J(\theta)=\frac{1}{2}(X\theta-Y)^2
\tag{4}
$$
以上就是线性回归的基本公式和损失函数。
求解
我们的目标是找到合适的一组权重$\theta$让$J(\theta)$最小,这样就说明我们的模型越符合实际效果越好。一般有两种方式进行求解,直接求解和梯度下降。
解析求解
我们已经拿到了损失函数的表达形式,可以从公式$(4)$中直接推到出$\theta$,过程如下。
$$
\begin{split}
J(\theta)=\frac{1}{2}(X\theta-Y)^2&=\frac{1}{2}(X\theta-Y)^T(X\theta-Y)\\
&=\frac{1}{2}(\theta^TX^T-Y^T)(X\theta-Y)\\
&=\frac{1}{2}(\theta^TX^TX\theta-\theta^TX^TY-Y^TX\theta-Y^TY)
\end{split}
\tag{5}
$$
接下来对$J(\theta)$求偏导
$$
\begin{split}
\frac{\partial^{2}J(\theta)}{\partial\theta^{2}}&=\frac{1}{2}(2 \cdot X^TX\theta-2 \cdot X^TY)\\
&=X^TX\theta-X^TY
\end{split}
\tag{6}
$$
$$\frac{dAB}{dB}=A^T$$
$$\frac{dA^TB}{dA}=B$$
$$\frac{dX^TAX}{dX}=(A+A^T)X$$
令导数为0,有
$$\frac{\partial^{2}J(\theta)}{\partial\theta^{2}}=0$$
$$X^TX\theta-X^TY=0$$
$$X^TX\theta=X^TY$$
$$\theta=(X^TX)^{-1}X^TY \tag{7}$$
最终推到出$(7)$,直接求解需要用到实例数据$X$及对应的预测值$Y$,在输入不大的情况下可以快速求得权重矩阵。但$(7)$中含有矩阵求逆运算,其算法复杂度通常在$O(n^2.4)$到$O(n^3)$之间,在高维大数据量的情况下直接求解的计算量很大;而且对于某些损失函数是凸函数的模型($X^TX$不可逆)来说,无法求得损失函数的偏导,该方法失效,只能使用梯度下降算法。
梯度下降
梯度下降是一种通用的优化算法,梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化。
* 注:梯度下降的形象解释:假设你迷失在山上的迷雾中,你能感受到的只有脚下地面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量$\theta$相关的误差函数的局部梯度,并不断沿着梯度的方向调整,直到梯度降为0,到达最小值。
具体来说,首先使用一个随机的$\theta$值,即随机初始化,然后逐步改进,每次踏出一步,每一步都尝试降低成本函数,直到算法收敛到一个最小值。梯度下降中一个重要的参数是每一步的步长,该参数被称为学习率。如果学习率太低,算法需要经过大量迭代才能收敛,如果太高,有可能越过最小值甚至比上一步迭代的结果还大,导致模型无法收敛。
对于线性回归,梯度下降的数学表达形式如下。假设第$i$次迭代的权重为$\theta_i$,学习率为$\eta$,第$i+1$次迭代的权重为
$$
\theta_{i+1}=\theta_i-\eta \cdot \frac{\partial^2J(\theta)}{\partial\theta^2}
\tag{8}
$$
实现
下面使用tensorflow实现两种求解方式,以加州房价预测数据为例。
tensorflow实现解析求解
1 | # coding=utf-8 |
tensorflow实现梯度下降
1 | # coding=utf-8 |
以上代码详见线性回归tensorflow实现
#参考
- 【TensorFlow篇】–Tensorflow框架初始,实现机器学习中多元线性回归
- 机器学习实战-基于Scikit-Learn和Tensorflow,机械工业出版社
- 机器学习实战,人民邮电出版社