多元线性回归
一元线性回归只有一个特征$x$,而多元线性回归可以有多个特征$x_1, x_2, ldots, x_n$
假设 (Hypothesis):$h_ heta(x)= heta^Tx= heta_0x_0+ heta_1x_1+ldots+ heta_nx_n$
参数 (Parameters):$ heta_0, heta_1, ldots, heta_n$
代价函数 (Cost function):$J( heta_0, heta_1, ldots, heta_n)=frac{1}{2m}sumlimits_{i=1}^{m}(h_ heta(x^{(i)}) - y^{(i)})^2$
目标 (Goal):$min_ heta J( heta)$
梯度下降 (Gradient Descent)
迭代更新参数$ heta$: $ heta_j = heta_j - alpha frac{1}{m}sumlimits_{i=1}^{m}(h_ heta(x^{(i)})-y^{(i)})x_j^{(i)}$ for $j = 0, 1, 2, ldots, n$
向量化实现 (Vectorized Implementation):$ heta = heta - alpha frac{1}{m}(X^T(X heta-y))$
Feature Scaling
动机:如果不同特征之间的数值量级差别太大,那么梯度下降的速度非常慢,为了加快算法的收敛速度,将各个特征划归到统一数量级,一般是[0, 1]或者[-1, 1]之间
Trick1: $x_j = frac{x_j - mu_j}{s_j}$, 其中 $mu_j$表示第j个特征的均值, $s_j$表示第j个特征的范围(max - min)或者标准差(standard deviation)
Trick2: 学习速率的选择
- 合理的选择学习速率,保证$J( heta)$的值在每一次迭代后都是下降的;
- 如果$J( heta)$随迭代次数单调递增或者$J( heta)$随迭代次数成波浪形(例如: //////), 这时候应该考虑选择较小的$alpha$; 但是$alpha$太小会导致收敛速度过慢
- 为了正确的选择 $alpha$,尝试序列 0.001, 0.01, 0.1, 1等
Normal Equation的数学推导
解析推导过程:
$$J( heta)=frac{1}{2m}sumlimits_{i=1}^{m}left(h_ heta(x^{x(i)})-y^{(i)}
ight)$$
可以简化写成向量的形式:
$$J( heta)=frac{1}{2m}||X heta-y||^2=frac{1}{2m}(X heta-y)^T(X heta-y)$$
展开可得:
$$J( heta)=frac{1}{2m}[ heta^TX^TX heta-y^TX heta- heta^TX^Ty+y^Ty]$$ 注意到$y^TX heta$是一个标量,因此它与其转置$ heta^TX^Ty$是相等的,即中间两项是相等的,从而$J( heta)$可以进一步化简为:
$$J( heta) = frac{1}{2m}[X^TX heta-2 heta^TX^Ty+y^Ty]$$
对向量的求导与单变量的求导法则有诸多不同,这里不加证明给出如下两个重要的向量求导结论(具体可参照向量矩阵求导)
egin{equation}d(X^TAX)/dX = (dX^T/dX)AX + (d(AX)^T/dX)X = AX + A^TX end{equation}
egin{equation}d(X^TA)/dX = (dX^T/dX)A + (dA/dX)X^T = IA + 0X^T = Aend{equation}
根据结论(1), 第一项的求导结果为$X^TX heta+X^TX heta=2X^TX heta$; 根据结论(2),第二项的求导结果为$-2x^Ty$;第三项不含$ heta$,求导结果当然为0,整合三项我们可以得到$J( heta)$的导数$frac{dJ( heta)}{d heta}$,
$$frac{dJ( heta)}{d heta}=frac{1}{2m}(2X^TX heta-2X^Ty)$$
令该导数等于0,我们很容易得到
$$ heta=(X^X)^{-1}X^Ty$$
这就是使得代价函数$J( heta)$取得最小值对应的$ heta$。
梯度下降和Normal Equation优劣对比
Gradient Descent | Normal Equation |
需要选择合适的$alpha$ | 不需要选择$alpha$ |
需要不断的迭代 | 不需要迭代 |
当特征非常多时(n非常大),算法依然表现良好 | 当n非常大时,计算速度非常慢,因为需要计算$(X^TX)^{-1}$复杂度为$O(n^3)$ |
参考文献
[1] Andrew Ng Coursera 公开课第二周