文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-10-29   1.8k

Machine-Learning-Week2

多元线性回归

在上一周我们学了单变量线性回归方程及其梯度下降算法。但在实际运用的过程中,特征肯定是多样的,所以我们需要根据单变量线性回归方程推演出多元线性回归方程。比如说,一个二手房的价格可能会由房屋面积(Size)、房间数量(Number of bedrooms)、楼层数(Number of floor)、房屋年限(Age of home)这四个特征决定,如下图所示:

x(i)表示第i条训练样本,x(i)j表示第i条训练样本的第j个特征。

所以我们得到的线性回归函数为:
$$
h_\theta (x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3 + \cdots + \theta_n x_n
$$
如果把该函数的参数 θ 和变量 x 全部写成向量的形式,并且不妨假设x0=1就可以简化成下面这个函数:
$$
\begin{align*}h_\theta(x) =\begin{bmatrix}\theta_0 \hspace{2em} \theta_1 \hspace{2em} … \hspace{2em} \theta_n\end{bmatrix}\begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix}= \theta^T x\end{align*}
$$
进一步来讲,如果我们把上图的训练样本逐行的写到矩阵当中,且记为X,即(假设只有三条数据):
$$
\begin{align*}X = \begin{bmatrix}x^{(1)}_0 & x^{(1)}_1 & x^{(1)}_2 & x^{(1)}_3 & x^{(1)}_4 \newline x^{(2)}_0 & x^{(2)}_1 & x^{(2)}_2 & x^{(2)}_3 & x^{(2)}_4 \newline x^{(3)}_0 & x^{(3)}_1 & x^{(3)}_2 & x^{(3)}_3 & x^{(3)}_4 \end{bmatrix}&,\theta = \begin{bmatrix}\theta_0 \newline \theta_1 \newline \theta_2 \newline \theta_3 \newline \theta_4 \newline\end{bmatrix}\end{align*}
$$
那么假设函数就可以写为:

hθ(X)=Xθ

得到的结果就是一个m*1的向量。

多元梯度下降

上一篇学会了单变量的梯度下降算法,对于多元梯度下降算法,也就是一个照葫芦画瓢的过程了:
$$
\begin{align*}
& \text{repeat until convergence:} ; \lbrace \newline
; & \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_0^{(i)}\newline
; & \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_1^{(i)} \newline
; & \theta_2 := \theta_2 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_2^{(i)} \newline
& \cdots
\newline \rbrace
\end{align*}
$$
即:
$$
\begin{align*}& \text{repeat until convergence:} ; \lbrace \newline ; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} ; & \text{for j := 0…n}\newline \rbrace\end{align*}
$$

特征放缩和归一化

如果你想预测房价,现在有两个变量 x1 和 x2 来作为特征,其中 x1 为房子的大小,范围在 0 到 2000,x2 为房子中卧室的数目,范围在 0 到 5,那么画出这个代价函数的轮廓图就是这个样子,一个扁扁的椭圆形:

对这个函数进行梯度下降,就是途中蓝线的过程,这个路程很长很曲折,这样我们进行梯度下降所花费的时间就会很长。

为了使特征值在一个相似的范围内变化(比如-1到+1之间),可以将变量进行特征放缩,如下图所示:

但是又出现一个问题,你会发现,现在经过处理之后的数据全是正值,不分散,那么我们就要用稍微复杂一点的方法进行特征缩放。用**均值归一化(Mean normalization)**的方法处理数据:
$$
x_n = \frac{x_n - μ_n}{s_n}
$$
其中 μn 为平均值,Sn 为标准差,也可以用这个变量最大值与最小值的差。现在你就会发现,数据既有正值也有负值,分散在-1 到 1 这个区间,进行梯度下降就会很快。

迭代的有效性

我们知道梯度下降算法是一个递归的过程,那么我们如何确定这个递归的方向是正确的呢?视频中给出了两种方法。

Debugging gradient descent

以X轴为迭代次数,Y轴为每次迭代的代价函数值来作图,如果图像是一个下降的过程,并在最后趋于平缓,那么这种迭代是有效的。如果图像是一个上升的过程,那么应该试着减小α的值。

Automatic convergence test

通过设定一个阈值ε(比如ε=10-3),如果每次迭代之后,代价函数的减少量小于阈值ε,那么就认定迭代是有效的。但是这种方法在实际应用中,并不太容易去确定阈值ε。

多项式回归方程

如果假设函数不能很好地拟合数据,则它不一定必须是一个线性的(直线)。我们可以通过将其设为二次,三次或平方根函数(或任何其他形式)来更改假设函数的行为。比如说根据面积的大小来预测房价,如果给定的数据集如下图所示:

那么我们可以把假设函数变为三次函数或平方根函数(因为二次函数在最大值之后会下降,这不符合实际情况),即:
$$
h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_1^2 + \theta_3 x_1^3
$$
或者:
$$
h_\theta (x) = \theta_0 + \theta_1 x_1 + \theta_2 \sqrt {x_1}
$$

这个时候特征放缩就显得尤为重要。

正规方程(Normal Equation)

“正规方程”是一种无需迭代即可找到最佳θ的方法,公式如下:
$$
\theta = (X^T X)^{-1} X^T y
$$

无需对正规方程进行特征缩放。

举个例子,还是求房价,现在有 4 组训练集,如下表:

在这个例子中,矩阵X为:
$$
\begin{align*}X = \begin{bmatrix}1 & 2014 & 5 & 1 & 45 \newline 1 & 1416 & 3 & 2 & 40 \newline 1 & 1534 & 3 & 2 & 40 \newline 1 & 852 & 2 & 1 &36 \end{bmatrix} \end{align*}
$$
向量y为:
$$
\begin{align*} y = \begin{bmatrix} 460 \newline 232 \newline 315 \newline 178 \end{bmatrix} \end{align*}
$$
这样通过正规方程就可以很容易地求出参数 θ(一定要注意,这里的参数 θ 是一个向量)。

既然求参数 θ 有两种方法,一个为梯度下降法,一个为正规方程,那么他俩之间一定会有优缺点,下表就是这两种方法的优缺点的对比:

梯度下降 正规方程
需要选择学习速率α 不需要选择学习速率
需要迭代 不需要迭代
时间复杂度O (kn2) O (n3), 需要计算XTX的逆矩阵
当特征值很多的时候,效率也很高 当特征值很多的时候,效率很低(要求逆矩阵)

既然要求逆矩阵,那么就肯定会出现XTX不可逆的时候。

第一种情况: 出现了两个相似的特征,这个两个特征可以用一个线性关系进行表示。例如,米和英尺,这两个都是用来描述长度的单位,且他们之间可以进行相互转化,如果特征值同时出现他们两个,就会出现矩阵不可逆的情况。

解决方法:去掉任意一个即可。

第二种情况:特征值的数量特别多,但是数据集的数量特别少。

解决方法:增加数据集或减少特征值。

Copyright © ca01h 2019-2020 | 本站总访问量