吴恩达机器学习四——过拟合和正则化

过拟合问题

  • 概念

    • 欠拟合:不能很好的拟合所给数据

      线性回归欠拟合逻辑回归欠拟合

    • 过拟合:可以很好的拟合所给数据,但是并不能真实反映变化趋势,在训练集之外的数据上表现欠佳,无法泛化到更多数据。

      线性回归过拟合逻辑回归过拟合

  • 过拟合解决方案

    • 减少选取的变量x的数量。人工或者算法选择
    • 正则化。保留所有变量,但是降低阶数或者减小θj\theta_j

正则化

线性回归正则化

代价函数

假设拟合函数为θ0+θ1x+θ2x2+θ3x3+θ4x4\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4,代价函数为minθ12mi=1m(hθ(xi)yi)2\mathop{min}\limits_{\theta}\frac{1}{2m}\sum^m_{i=1}(h_\theta(x^i)-y^i)^2。此时出现过拟合现象。此时可以将代价函数改为minθ12mi=1m(hθ(xi)yi)2+1000θ32+1000θ42\mathop{min}\limits_{\theta}\frac{1}{2m}\sum^m_{i=1}(h_\theta(x^i)-y^i)^2+1000\theta_3^2+1000\theta_4^2,来使得θ3,θ4\theta_3,\theta_4的值最小,以此降低高阶项的影响,从而解除过拟合。即当拟合函数中存在高阶变量且出现过拟合时,可以给高阶变量的参数设定一定的惩罚机制,将高阶变量的影响降到最低。

如果只知道变量,而不知道啊变量的具体阶数,此时可以修改代价函数为12m[i=1m(hθ(xi)yi)2+λj=1mθj2]\frac{1}{2m}[\overset{m}{\mathop{\sum}\limits_{i=1}}(h_\theta(x^i)-y^i)^2+\lambda\overset{m}{\mathop{\sum}\limits_{j=1}}\theta_j^2]来缩小每一个参数。其中λ\lambda称为正则化参数,用于控制两项之间的关系,以更好的进行拟合。

注意,正则化惩罚的参数为θ1,θ1,,θn\theta_1,\theta_1,\dots,\theta_n,没有惩罚θ0\theta_0

梯度下降算法的正则化

重复执行

θ0:=θ0α1mi=1m(hθ(xi)yi)x0iθj:=θj(1αλm)α1mi=1m(hθ(xi)yi)xji , (j=1,2,3,,n)\begin{array}{ll}\theta_0&:=\theta_0-\alpha\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}(h_\theta(x^i)-y^i)x^i_0\\\theta_j&:=\theta_j(1-\alpha\frac{\lambda}{m})-\alpha\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}(h_\theta(x^i)-y^i)x^i_j\space,\space(j=1,2,3,\dots,n)\end{array}

标准方程算法的正则化

θ\theta的求解公式变为

θ=(XTX+λ[001101])1XTy\theta = (X^TX+\lambda\begin{bmatrix}0&&\cdots&&0\\&1&&&\\\vdots&&1&&\vdots\\&&&\ddots&\\0&&\cdots&&1\end{bmatrix})^{-1}X^Ty,矩阵为(n+1)×(n+1)(n+1)\times(n+1)阶,nn为变量数

λ>0\lambda>0时,括号内的矩阵一定可逆

逻辑回归正则化

代价函数

修改为J(θ)=1mi=1m[yilog(hθ(xi))+(1yi)log(1hθ(xi))]+λ2mj=1nθj2J(\theta) = -\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}[y^ilog(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))]+\frac{\lambda}{2m}\overset{n}{\mathop{\sum}\limits_{j=1}}\theta_j^2

梯度下降算法的正则化

重复执行

θ0:=θ0α1mi=1m(hθ(xi)yi)x0iθj:=θj(1αλm)α1mi=1m(hθ(xi)yi)xji , (j=1,2,3,,n)\begin{array}{ll}\theta_0&:=\theta_0-\alpha\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}(h_\theta(x^i)-y^i)x^i_0\\\theta_j&:=\theta_j(1-\alpha\frac{\lambda}{m})-\alpha\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}(h_\theta(x^i)-y^i)x^i_j\space,\space(j=1,2,3,\dots,n)\end{array}

高级算法的正则化

首先定义一个costFunction(theta),此函数返回代价函数值和代价函数的偏导数的值。

1
2
3
4
5
function [jVal,gradient] = costFunction(theta)
jVal = (theta(1)-5)^2+(theta(2)-5)^2;
gradient = zeros(2,1);
gradient(1) = 2*(theta(1)-5);
gradient(2) = 2*(theta(2)-5);

costFunction

然后设置参数,并调用高级优化函数

1
2
3
options = optimset('GradObj','on','MaxIter','100');
initialTheta = zeros(2,1);
[optTheta,functionVal,exitFlag] = fminunc(@costFunction,initialTheta,options)