在线性和逻辑回归中,如果选择的特征过多,会出现overfitting的情况:回归函数匹配训练集内的数据特别好,但是不能很好的预测新数据。解决overfitting的方法一般有两种:
1. 减少特征的数量 - 用老婆的话说,就是控制参数的稀疏性,不让参数过多,防止过拟合。很专业的说,赞一个:)
2. 正则化 - 保留所有的特征,但是让theta的取值小些,这样每个特征对最终结果的影响就减小了。
这里呢介绍正则化这种方法。
正则化对线性回归和逻辑回归是一致的,都是cost function加上额外的一项来平衡theta的取值。线性回归的cost function如下:
对应的逻辑回归的cost function为:
注意theta的平方和是从theta1开始,不包括theta0。这样按照梯度下降求偏导的公式变为:
从而:
可以看出,这里对theta乘了一个小于但接近于1的系数,相当于迭代的时候对theta进行了衰减。这个公式讲义里面有点错误。
对线性回归normal equation方法进行正则化,theta的计算公式如下。矩阵为(n+1)*(n+1)维。
对逻辑回归的库函数fminunc进行正则化,纯粹套用公式如下:
J = y' * log(sigmoid(X*theta)) + (1 - y)' * log(1 - sigmoid(X*theta)); J = -J/m; reg = 0; for j = 2:size(theta) reg = reg + theta(j)^2; end; reg = reg * lambda / (2*m); J = J + reg; for j = 1:size(theta) grad(j) = (sigmoid(X*theta) - y)' * X(:,j); grad(j) = grad(j) / m; end for j = 2:size(theta) grad(j) = grad(j) + theta(j) * lambda / m; end