吴恩达机器学习
本文是在学习吴恩达老师机器学习课程的基础上结合老师的ppt文献然后加上自身理解编写出来的,有些地方可能有遗漏或错误,欢迎大家批评指正。希望我们一起学习,一起进步!
第三个星期
1.分类和表示
1.1 分类
一般来说,分类算法可以应用在以下领域,这里有三个例子:
- 邮件分类:垃圾邮件/正常邮件?
- 在线交易:诈骗?(是/否)?
- 肿瘤:恶性/良性?
我们可以用 y ∈ { 0 , 1 } y∈\{0,1\} y∈{0,1}来表示二分类,0表示Negative Class(负类),1表示Positive Class(正类)。
有的同学可能会说,我可不可以用线性回归做分类问题呢?
答案是:不合适。
在这里,如果恶性肿瘤的样本出现一个极端值(如上图右上角×),使用线性回归模型,那么良恶性概率0.5的点将落在偏向恶性肿瘤的 范围内,使得模型不是很准确。
在二分类问题中, y = 0 或 者 y = 1 y=0或者y=1 y=0或者y=1,一般的线性回归模型, h θ ( x ) h_{\theta}(x) hθ(x)可能会>1或者<0。所以不太合适,我们就提出一种新的模型——逻辑回归(Logistic Regression),在逻辑回归中 0 ≤ h θ ( x ) ≥ 1 0≤h_{\theta}(x)≥1 0≤hθ(x)≥1。
1.2 假设的表示
为了保证满足
0
≤
h
θ
(
x
)
≤
1
0≤h_{\theta}(x)≤1
0≤hθ(x)≤1,我们引入Logistic Function-逻辑函数,因为它的值域是(0,1)。
逻辑函数的定义为
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1,图像为:
接下来,我们让
z
=
θ
T
x
z=\theta^Tx
z=θTx,令
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
h_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}
hθ(x)=g(θTx)=1+e−θTx1。
问题来了,现在
h
θ
(
x
)
h_{\theta}(x)
hθ(x)的含义是什么呢?
在这里,我们可以将之理解为一种概率,一种使得输出为1的概率,例如:在上一节的肿瘤问题中,
h
θ
(
x
)
=
0.7
h_{\theta}(x)=0.7
hθ(x)=0.7代表肿瘤为恶性的概率为0.7。
另外,公式之间的转化如下:
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
=
1
−
P
(
y
=
0
∣
x
;
θ
)
h_{\theta}(x)=P(y=1|x;\theta)=1-P(y=0|x;\theta)
hθ(x)=P(y=1∣x;θ)=1−P(y=0∣x;θ)
P
(
y
=
0
∣
x
;
θ
)
+
P
(
y
=
1
∣
x
;
θ
)
=
1
P(y=0|x;\theta)+P(y=1|x;\theta)=1
P(y=0∣x;θ)+P(y=1∣x;θ)=1
1.3决策边界
本节,我们用图像来展示一下逻辑回归的决策边界。
首先,我们进行一些必要的解释和推理。假设
y
=
1
y=1
y=1也就是说
h
θ
(
x
)
≥
0.5
h_{\theta}(x)≥0.5
hθ(x)≥0.5,可以得到,
g
(
z
)
≥
0.5
,
∴
z
≥
0
,
∴
θ
T
x
≥
0
g(z)≥0.5,∴z≥0,∴\theta^Tx≥0
g(z)≥0.5,∴z≥0,∴θTx≥0。
反之
y
=
0
y=0
y=0,则
θ
T
x
<
0
\theta^Tx<0
θTx<0
举个栗子(下饭):
可以看出,我们给出这样一个数据集和一个假设函数
h
θ
(
x
)
=
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
)
,
这
里
θ
=
[
−
3
1
1
]
T
h_{\theta}(x)=g(\theta_{0}+\theta_1x_1+\theta_2x_2),这里\theta=[-3 \;\;1\;\; 1]^T
hθ(x)=g(θ0+θ1x1+θ2x2),这里θ=[−311]T,在
y
=
1
y=1
y=1时,
h
θ
(
x
)
≥
0.5
=
>
θ
0
+
θ
1
x
1
+
θ
2
x
2
≥
0.5
h_\theta(x)≥0.5=>\theta_{0}+\theta_1x_1+\theta_2x_2≥0.5
hθ(x)≥0.5=>θ0+θ1x1+θ2x2≥0.5。这样,我们就得到了一条决策线过
(
0
,
3
)
和
(
3
,
0
)
(0,3)和(3,0)
(0,3)和(3,0)两个点。线的上方就是分类为1的点。
另外还有一个例子供大家参考:
原理一样,这里就不多说了。
2.逻辑回归(Logistic Regression)模型
2.1代价函数
在逻辑回归中,它的代价函数不可能像线性回归一样,因为逻辑函数的输出是一种震荡型的,有很多的局部最优点。所以逻辑回归的代价函数我们准备这样定义:
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
J(θ)=m1∑i=1mCost(hθ(x(i)),y(i))
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
log
(
h
θ
(
x
)
)
if y = 1
\mathrm{Cost}(h_\theta(x),y) = -\log(h_\theta(x)) \; \text{if y = 1}
Cost(hθ(x),y)=−log(hθ(x))if y = 1
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
log
(
1
−
h
θ
(
x
)
)
if y = 0
\mathrm{Cost}(h_\theta(x),y) = -\log(1-h_\theta(x)) \; \text{if y = 0}
Cost(hθ(x),y)=−log(1−hθ(x))if y = 0
通过观察上面的公式,我们也大致对公式有了一定的认识,接下来我们将它们的图像画出来看一看。
当
y
=
1
y=1
y=1时,我们画出
J
(
θ
)
J(\theta)
J(θ)随
h
θ
(
x
)
h_\theta(x)
hθ(x)变化的图像
当
y
=
0
y=0
y=0时,我们画出
J
(
θ
)
J(\theta)
J(θ)随
h
θ
(
x
)
h_\theta(x)
hθ(x)变化的图像
我们单独把Cost()拿出来讨论一下。
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
0
if
h
θ
(
x
)
=
y
\mathrm{Cost}(h_\theta(x),y) = 0 \text{ if } h_\theta(x) = y
Cost(hθ(x),y)=0 if hθ(x)=y
C
o
s
t
(
h
θ
(
x
)
,
y
)
→
∞
if
y
=
0
a
n
d
h
θ
(
x
)
→
1
\mathrm{Cost}(h_\theta(x),y) \rightarrow \infty \text{ if } y = 0 \; \mathrm{and} \; h_\theta(x) \rightarrow 1
Cost(hθ(x),y)→∞ if y=0andhθ(x)→1
C
o
s
t
(
h
θ
(
x
)
,
y
)
→
∞
if
y
=
1
a
n
d
h
θ
(
x
)
→
0
\mathrm{Cost}(h_\theta(x),y) \rightarrow \infty \text{ if } y = 1 \; \mathrm{and} \; h_\theta(x) \rightarrow 0
Cost(hθ(x),y)→∞ if y=1andhθ(x)→0
2.2简易的代价函数和梯度下降方法
因为
y
=
0
o
r
y
=
1
y=0\;or\;y=1
y=0ory=1,从数学的角度,我们可以将上一节的代价函数进行一个整合,结果如下:
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
h
θ
(
x
)
)
)
Cost(h_\theta(x),y)=-y\;log(h_\theta(x))-(1-y)\;log(1-h_\theta(x)))
Cost(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x)))
这样一来,
J
(
θ
)
=
1
m
∑
i
=
1
m
[
−
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
−
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}[-y^{(i)}log(h_\theta(x^{(i)}))-(1-y^{(i)})log(1-h_\theta(x^{(i)}))]
J(θ)=m1i=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]
如果用向量来表示,我们可以这样写:
h
=
g
(
X
θ
)
h=g(X\theta)
h=g(Xθ)
J
(
θ
)
=
1
m
⋅
(
−
y
T
log
(
h
)
−
(
1
−
y
)
T
log
(
1
−
h
)
)
J(\theta)=\frac{1}{m}\cdot \left(-y^{T}\log(h)-(1-y)^{T}\log(1-h)\right)
J(θ)=m1⋅(−yTlog(h)−(1−y)Tlog(1−h))
接下来,就是梯度下降的方法,常规下,梯度下降这样来表示:
R
e
p
e
a
t
{
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
}
Repeat\{ \newline\;\;\;\theta_j:=\theta_j-\alpha \dfrac{\partial}{\partial \theta_j}J(\theta) \newline\}
Repeat{θj:=θj−α∂θj∂J(θ)}
我们将
J
(
θ
)
J(\theta)
J(θ)展开计算,结果如下。
R
e
p
e
a
t
{
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
[
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
]
}
Repeat\{ \newline\;\;\;\theta_j:=\theta_j-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}[(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}] \newline\}
Repeat{θj:=θj−αm1i=1∑m[(hθ(x(i))−y(i))xj(i)]}
注意:
θ
\theta
θ同时更新。
如果用向量来表示更新过程,那么
θ
:
=
θ
−
α
1
m
X
T
(
g
(
X
θ
)
−
y
)
\theta:=\theta-\alpha\frac{1}{m}X^T(g(X\theta)-y)
θ:=θ−αm1XT(g(Xθ)−y)
2.3高级优化方案
除了gradient decent(梯度下降)。在这里,还有很多用于计算
m
i
n
(
J
(
θ
)
)
min(J(\theta))
min(J(θ))的方法。比如conjugate gradient(共轭梯度),BFGS,L-BFGS等。
这些方法相对于梯度下降有下面的优缺点:
- 优点
不需要手动的选择学习率 α \alpha α;并且速度比梯度下降要快 - 缺点
相较于梯度下降更为复杂
鉴于这些方法比较复杂,同时matlab/octave工具箱内也包含了相应的计算工具,这里就不再展开讲解,有兴趣的同学可以看看相应的博客讲解。
从代码层面来讲,无论使用什么方法,都要计算
J
(
θ
)
J(\theta)
J(θ)及其导数
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
如果决定使用这些高级优化方法,matlab工具箱提供了fminunc()方法来进行计算。下面是一个代码例子。
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
3.多类别分类
在二分类中,分类情形比较简单,我们仅仅需要单条回归线即可解决,但是在多类别分类中,我们该如何解决呢?其实也不难,你可以把当前类别分为该类别(1)和其他类别(0),这样就转化为了二分类问题,不同的是在多分类中,需要多条回归线分类解决。
假设
y
∈
{
0
,
1...
n
}
y∈\{0,1...n\}
y∈{0,1...n},针对0至n类别,我们的不同假设函数将表达下列含义:
h
θ
(
0
)
(
x
)
=
P
(
y
=
0
∣
x
;
θ
)
h_\theta^{(0)}(x)=P(y=0|x;\theta)
hθ(0)(x)=P(y=0∣x;θ)
h
θ
(
1
)
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
h_\theta^{(1)}(x)=P(y=1|x;\theta)
hθ(1)(x)=P(y=1∣x;θ)
…
h
θ
(
n
)
(
x
)
=
P
(
y
=
n
∣
x
;
θ
)
h_\theta^{(n)}(x)=P(y=n|x;\theta)
hθ(n)(x)=P(y=n∣x;θ)
p
r
e
d
i
c
t
i
o
n
=
max
i
(
h
θ
(
i
)
(
x
)
)
prediction=\max\limits_{i}(h_\theta^{(i)}(x))
prediction=imax(hθ(i)(x))
下面是一个例子
需要注意的一点是,在预测时,我们需要将输入值
X
X
X代入到每一个
h
θ
(
i
)
(
x
)
h_\theta^{(i)}(x)
hθ(i)(x)中,选取可能性最大的那一个作为最终的分类类别(因为
h
θ
(
i
)
(
x
)
h_\theta^{(i)}(x)
hθ(i)(x)本身是一个概率值)。
4.解决过拟合问题
4.1什么是过拟合问题
首先来看几张图
最左面的那张图使用的假设模型是
y
=
θ
0
+
θ
1
x
y=\theta_0+\theta_1x
y=θ0+θ1x,但是从效果上来看,直线的拟合度似乎没有那么好,事实上,这个假设模型它发挥它天大的本事也没能把训练集数据拟合的特别好,更别说让它去预测了,这种我们称之为underfitting(欠拟合)。
然后来看最右面那张图,它使用的假设模型是
y
=
∑
j
=
0
5
θ
j
x
j
y=\sum\limits_{j=0}^{5}\theta_jx^j
y=j=0∑5θjxj,从直观效果上来看,我们的假设曲线Amazing地穿过了每一个数据点,非常的精确,然而,呵呵,轮到它去预测的时候会让你大跌眼镜,比如当x=0时,从图上找一找,几乎达到了最大值啊,肉眼可见的不准确。这种训练猛如虎,预测250的行为我们称之为overfitting(过拟合)。
你再看中间那张图就很舒服啦,它的假设模型为
y
=
θ
0
+
θ
1
x
+
θ
2
x
2
y=\theta_0+\theta_1x+\theta_2x^2
y=θ0+θ1x+θ2x2,从效果上来看,在训练的时候基本上穿过了每一个点,在预测的时候也会比较合情合理。这样的就属于正常人啦。
那么上面那两个妖怪(underfitting和overfitting)是怎么形成的呢
underfitting欠拟合是因为假设模型中的参数太简单或者说特征太少,导致假设模型没有能力表现出数据所想表达的姿态。
overfitting过拟合是因为假设模型太复杂或者说无用特征太多,导致假设模型太敏感而延伸一些不必要的曲线和角度,与数据大相庭径。
对于underfitting欠拟合,我们多发现几个关键特征,提升一下维度或许就可以解决。
对于overfitting过拟合,我们一般采取下面的方法予以解决。
- 减少特征的数量
- 手动筛选所要保留的特征
- 使用模型筛选算法
- 正则化
- 保持所有特征不变,削减参数 θ j \theta_j θj的权重
- 当我们有很多稍微有用的特性时,正则化效果很好
4.2代价函数
上节我们提到,遇到overfitting的情况,我们可以采取削减参数
θ
j
\theta_j
θj权重的方式来解决。
假设
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4
hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4,我们认为,
x
3
a
n
d
x
4
x^3 and x^4
x3andx4是比较干扰的项,所以我们修改
J
(
θ
)
J(\theta)
J(θ)为
m
i
n
θ
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
+
1000
∗
θ
3
2
+
1000
∗
θ
4
4
min_\theta\frac{1}{2m}\sum\limits_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2+1000*\theta_3^2+1000*\theta_4^4
minθ2m1i=1∑m(h(x(i))−y(i))2+1000∗θ32+1000∗θ44
在这里可以看出,我们添加了
1000
∗
θ
3
2
+
1000
∗
θ
4
4
1000*\theta_3^2+1000*\theta_4^4
1000∗θ32+1000∗θ44项,这样会使
θ
3
a
n
d
θ
4
\theta_3and\theta_4
θ3andθ4比较小,从而使得
x
3
a
n
d
x
4
x^3 and x^4
x3andx4的影响力降低,达到相应的效果。
然而一般来说,我们不知道要削减的参数具体是哪个,所以可以进行统一正则化,如下。
m
i
n
θ
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
min_\theta\frac{1}{2m}\sum\limits_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2+λ\sum\limits_{j=1}^{n}\theta_j^2
minθ2m1i=1∑m(h(x(i))−y(i))2+λj=1∑nθj2
其中,
λ
λ
λ是正则参数,
λ
λ
λ过小,还是会过拟合,
λ
λ
λ过大,就会欠拟合
注意,正则项是从
θ
1
\theta_1
θ1开始的,除非必要,一般不会动
θ
0
\theta_0
θ0
4.3线性回归正则化
上节讲到,我们不会对
θ
0
\theta_0
θ0进行正则化,所以梯度下降算法这样写:
Repeat
{
\text{Repeat}\ \lbrace
Repeat {
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
\theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)}
θ0:=θ0−α m1 ∑i=1m(hθ(x(i))−y(i))x0(i)
θ
j
:
=
θ
j
−
α
[
(
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
)
+
λ
m
θ
j
]
j
∈
{
1
,
2...
n
}
\theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right) + \frac{\lambda}{m}\theta_j \right] \ j \in \lbrace 1,2...n\rbrace
θj:=θj−α [(m1 ∑i=1m(hθ(x(i))−y(i))xj(i))+mλθj] j∈{1,2...n}
}
\rbrace
}
就
θ
j
\theta_j
θj的更新而言,我们也可以将其整理成下面这个样子:
θ
j
:
=
θ
j
(
1
−
α
λ
m
)
−
α
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_j:=\theta_j(1-\alpha\frac{\lambda}{m})-\frac{\alpha}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_{j}^{(i)}
θj:=θj(1−αmλ)−mαi=1∑m(hθ(x(i))−y(i))xj(i)
这里面
(
1
−
α
λ
m
)
(1-\alpha\frac{\lambda}{m})
(1−αmλ)项总是小于1
我们知道对于线性回归,还有一种解法就是使用正规方程,那么添加正则化之后的正规方程将如何改变?
原正规方程:
θ
=
(
X
T
X
)
−
1
X
T
y
\theta=(X^TX)^{-1}X^Ty
θ=(XTX)−1XTy
正则化:
θ
=
(
X
T
X
+
λ
Z
)
−
1
X
T
y
,
Z
=
[
0
0
.
.
.
0
0
0
1
0
.
.
.
0
.
.
.
0
0
.
.
.
1
0
0
0
.
.
.
0
1
]
\theta=(X^TX+\lambda Z)^{-1}X^Ty,Z=\left[ \begin{matrix} 0 & 0 & ... & 0 & 0\\ 0& 1 & 0 & ... & 0 \\ & & ... & & \\ 0 & 0 & ... & 1 & 0 \\ 0 & 0 & ... & 0 & 1\end{matrix} \right]
θ=(XTX+λZ)−1XTy,Z=⎣⎢⎢⎢⎢⎡00000100...0.........0...100001⎦⎥⎥⎥⎥⎤
Z其实就是单位矩阵第一个元素将1换为了0
值得注意的一点是假设样本数m小于特征数n,
(
X
T
X
)
(X^TX)
(XTX)是不可逆的,但是我们加上了
λ
Z
\lambda Z
λZ之后,
(
X
T
X
+
λ
Z
)
(X^TX+\lambda Z)
(XTX+λZ)整体会变得可逆。
4.4逻辑回归的正则化
类似于线性回归的正则化,我们可以向下面这张图所示的那样去对逻辑回归进行正则化。
原来的逻辑回归代价函数为:
J
(
θ
)
=
−
1
m
[
∑
i
=
1
m
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
(
1
)
J(\theta)=-\frac{1}{m}\left[ \sum\limits_{i=1}^{m}y^{(i)}log\left(h_\theta(x^{(i)})\right)+(1-y^{(i)})log\left( 1-h_\theta(x^{(i)})\right)\right]\;\;\;\;\;(1)
J(θ)=−m1[i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))](1)
增加正则项的逻辑回归代价函数为:
J
(
θ
)
=
−
1
m
[
∑
i
=
1
m
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
(
2
)
J(\theta)=-\frac{1}{m}\left[ \sum\limits_{i=1}^{m}y^{(i)}log\left(h_\theta(x^{(i)})\right)+(1-y^{(i)})log\left( 1-h_\theta(x^{(i)})\right)\right]+\frac{\lambda}{2m}\sum\limits_{j=1}^{n}\theta_j^2\;\;\;\;\;(2)
J(θ)=−m1[i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2(2)
对(2)式进行求导、梯度下降,结果为: