吴恩达机器学习教程学习笔记 (4/16)
吴恩达教授(Andrew Ng)的机器学习可以说是一门非常重视ML理论基础的课程,做做一些简单的笔记加上个人的理解。本笔记根据吴恩达的课程顺序,以每章内容作为节点进行记录。(共18章,其中第3章“线性代数回顾”与第5章“Octava教程”的笔记就不总结了)
第六章 逻辑回归(Logistic Regression)
1、分类问题及函数表示
在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。
分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的还是良性的。
从二元的分类问题讨论:
如果我们要用线性回归算法来解决一个分类问题,对于分类,y取值为0或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于1,或者远小于0,即使所有训练样本的标签y都等于0或1。尽管我们知道标签应该取值0或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。
所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在0到1之间。逻辑回归算法是分类算法,我们将它作为分类算法使用。逻辑回归算法实际上是一种分类算法,它适用于标签 y 取值离散的情况,如:1 0 0 1。我们所希望的分类器的输出值在0和1之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间。
例子
一开始提到的乳腺癌分类问题,我们可以用线性回归的方法求出适合数据的一条直线:
根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:
当hθ(x)≥0.5时,预测 y=1。
当hθ(x)<0.5时,预测 y=0 。
对于上图所示的数据,这样的一个线性模型似乎能很好地完成分类任务。假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的直线。
这时,再使用0.5作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。
逻辑回归模型表示:
h
θ
(
x
)
=
g
(
θ
T
X
)
h_θ (x)=g(θ^TX)
hθ(x)=g(θTX)其中 X 代表代表特征向量,g代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
g
(
z
)
=
1
/
(
1
+
e
(
−
z
)
)
g(z)=1/(1+e^{(-z)} )
g(z)=1/(1+e(−z))
Python代码实现Sigmoid函数:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
函数图像为:
hθ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)。例如,如果对于给定的x,通过已经确定的参数计算得出hθ(x)=0.7,则表示有70%的几率y为正向类,相应地y为负向类的几率为1-0.7=0.3。
∵
0
≤
h
θ
(
x
)
≤
1
∵ 0≤h_θ(x)≤1
∵0≤hθ(x)≤1
又
∵
h
θ
=
g
(
θ
T
x
)
,
g
(
z
)
=
1
/
(
1
+
e
(
−
z
)
)
又∵h_θ = g(θ^Tx),g(z) = 1/(1 + e^{(-z)})
又∵hθ=g(θTx),g(z)=1/(1+e(−z))
∴
h
θ
(
x
)
=
1
/
(
1
+
e
(
−
θ
T
x
)
)
∴h_θ(x) =1/(1 + e^{(-θ^Tx)})
∴hθ(x)=1/(1+e(−θTx))
那么逻辑回归的假设函数在计算什么?
在逻辑回归中,我们预测:
当
h
θ
(
x
)
≥
0.5
时
,
预
测
y
=
1
。
当h_θ (x)≥0.5时,预测 y=1。
当hθ(x)≥0.5时,预测y=1。
当
h
θ
(
x
)
<
0.5
时
,
预
测
y
=
0
。
当h_θ (x)<0.5时,预测 y=0 。
当hθ(x)<0.5时,预测y=0。
根据上面绘制出的 Sigmoid 函数图像,我们知道当
z
=
0
时
g
(
z
)
=
0.5
z=0 时 g(z)=0.5
z=0时g(z)=0.5
z
>
0
时
g
(
z
)
>
0.5
z>0 时 g(z)>0.5
z>0时g(z)>0.5
z
<
0
时
g
(
z
)
<
0.5
z<0 时 g(z)<0.5
z<0时g(z)<0.5
则
,
θ
T
x
≥
0
时
,
预
测
y
=
1
则,θ^T x≥0 时,预测 y=1
则,θTx≥0时,预测y=1
θ
T
x
<
0
时
,
预
测
y
=
0
θ^T x<0 时,预测 y=0
θTx<0时,预测y=0
2、代价函数
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题来了,当将hθ(x)代入到这样定义的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
所以,重新定义的逻辑回归代价函数如下:
J
(
θ
)
=
1
/
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
,
其
中
J(θ)=1/m ∑_{i=1}^m Cost(h_θ (x^{(i)}) ,y^{(i)}) ,其中
J(θ)=1/mi=1∑mCost(hθ(x(i)),y(i)),其中
hθ(x)与 Cost(hθ(x),y)之间的关系如下图所示:
这样构建的Cost(hθ(x),y)函数的特点是:
当实际的 y=1 且hθ(x)也为 1 时误差为 0,当 y=1 但hθ(x)不为1时误差随着hθ(x)变小而变大;
当实际的 y=0 且hθ(x)也为 0 时代价为 0,当y=0 但hθ(x)不为 0时误差随着hθ(x)的变大而变大。
将构建的 Cost函数 简化如下:
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
×
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
Cost(h_θ (x),y)=-y×log(h_θ (x))-(1-y)×log(1-h_θ (x))
Cost(hθ(x),y)=−y×log(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(θ)=1/m ∑_{i=1}^m[-y^{(i)} log(h_θ (x^{(i)} ))-(1-y^{(i)} )log(1-h_θ (x^{(i)} ))]
J(θ)=1/mi=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]
即
:
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(θ)=-1/m ∑_{i=1}^m[y^{(i)} log(h_θ (x^{(i)} ))+(1-y^{(i)} )log(1-h_θ (x^{(i)} ))]
即:J(θ)=−1/mi=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
Python代码实现代价函数:
import numpy as np
from sigmoid inport *
def cost_function(X, y, theta):
cost = 0
h = sigmoid(X.dot(theta))
first = -y * np.log(h)
second = (1-y) * np.log(1-h)
cost = np.sum(first - second) / (len(x))
return cost
感谢黄海广博士团队的翻译和笔记
END