1.正则化引入:
首先给出房价线性回归预测的例子:
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
在逻辑回归中也是如此:
以多项式理解,푥 的次数越高,对于样本拟合的越好,但相应的预测的能力就可能变差,也就是会出现过拟合问题,为了解决这个问题,有以下两种方案。
1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA) 2.正则化:保留所有的特征,但是减少参数的大小(加入惩罚项)。
2.线性回归正则化
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J(theta)=frac{1}{2 m}left[sum_{i=1}^{m}left(h_{theta}left(x^{(i)}right)-y^{(i)}right)^{2}+lambda sum_{j=1}^{n} theta_{j}^{2}right] J(θ)=2m1[∑i=1m(hθ(x(i))−y(i))2+λ∑j=1nθj2]
其中휆又称为正则化参数(Regularization Parameter)。 注:一般不对휃0 进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:
直线出现的原因:
因为如果我们令 휆 的值很大的话,为了使 Cost Function 尽可能的小,所有的 휃 的值(不包括휃0)都会在一定程度上减小。但若 λ 的值太大了,那么휃(不包括휃0)都会趋近于 0,这样我们所得到的只能是一条平行于푥轴的直线。
线性回归的求解:
1)梯度下降法:
Repeat until convergence{
θ
0
:
=
θ
0
−
a
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
θ
j
:
=
θ
j
−
a
[
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
m
θ
j
]
theta_{0}:=theta_{0}-a frac{1}{m} sum_{i=1}^{m}left(h_{theta}left(x^{(i)}right)-y^{(i)}right) x_{0}^{(i)} \ theta_{j}:=theta_{j}-aleft[frac{1}{m} sum_{i=1}^{m}left(h_{theta}left(x^{(i)}right)-y^{(i)}right) x_{j}^{(i)}+frac{lambda}{m} theta_{j}right]
θ0:=θ0−am1∑i=1m(hθ(x(i))−y(i))x0(i)θj:=θj−a[m1∑i=1m(hθ(x(i))−y(i))xj(i)+mλθj]
}
Repeat
对上面的算法中
j
=
1
,
2
,
…
,
n
j=1,2, ldots, n
j=1,2,…,n 时的更新式子进行调整可得:
θ j : = θ j ( 1 − a λ m ) − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) theta_{j}:=theta_{j}left(1-a frac{lambda}{m}right)-a frac{1}{m} sum_{i=1}^{m}left(h_{theta}left(x^{(i)}right)-y^{(i)}right) x_{j}^{(i)} θj:=θj(1−amλ)−am1∑i=1m(hθ(x(i))−y(i))xj(i)
可以看出, 正则化线性回归的梯度下降算法的变化在于, 每次都在原有算法更新规则的 基础上令 θ theta θ 值减少了一个额外的值。
2)正规方程法:
矩阵尺寸为 (푛 + 1) ∗ (푛 + 1)。
3.逻辑回归正则化
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) log ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(theta)=frac{1}{m} sum_{i=1}^{m}left[-y^{(i)} log left(h_{theta}left(x^{(i)}right)right)-left(1-y^{(i)}right) log left(1-h_{theta}left(x^{(i)}right)right)right]+frac{lambda}{2 m} sum_{j=1}^{n} theta_{j}^{2} J(θ)=m1∑i=1m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]+2mλ∑j=1nθj2
逻辑回归的求解:
1)梯度下降法:
Repeat until convergence{
θ
0
:
=
θ
0
−
a
1
m
∑
i
=
1
m
(
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
)
θ
j
:
=
θ
j
−
a
[
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
m
θ
j
]
for
j
=
1
,
2
,
…
n
theta_{0}:=theta_{0}-a frac{1}{m} sum_{i=1}^{m}left(left(h_{theta}left(x^{(i)}right)-y^{(i)}right) x_{0}^{(i)}right) \ theta_{j}:=theta_{j}-aleft[frac{1}{m} sum_{i=1}^{m}left(h_{theta}left(x^{(i)}right)-y^{(i)}right) x_{j}^{(i)}+frac{lambda}{m} theta_{j}right] \ text { for } j=1,2, ldots n
θ0:=θ0−am1∑i=1m((hθ(x(i))−y(i))x0(i))θj:=θj−a[m1∑i=1m(hθ(x(i))−y(i))xj(i)+mλθj] for j=1,2,…n
}
import numpy as np def costReg(theta, X, y, learningRate): theta = np.matrix(theta) X = np.matrix(X) y = np.matrix(y) first = np.multiply(-y, np.log(sigmoid(X*theta.T))) second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T))) reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:theta.shape[1]],2)) return np.sum(first - second) / (len(X)) + reg
2)高级函数法:
在这里还是可以用逻辑回归中的fminuc方法,但是参数的更新规则有所不同:
tips:
-
虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的ℎ휃(푥)不同所以还是有很大差别。
-
휃0不参与其中的任何一个正则化。



