问题描述
对于维度为
m+1
m
+
1
特征为
x
x
样本的二分类问题,有负类(Negative Class)记为0,正类(Positive Class)记为
1
1
,即对于类别y,有
y∈{0,1}.
y
∈
{
0
,
1
}
.
我们期望找到一个
hθ(x)
h
θ
(
x
)
,使得
0⩽hθ(x)⩽1.
0
⩽
h
θ
(
x
)
⩽
1
.
其中,
θ
θ
为待优化的参数,使得在对未知类别的样本
x0
x
0
分类时,
hθ(x0)
h
θ
(
x
0
)
为样本为正类的概率。即分类准则如下:
y0={0,1,if hθ(x0)<0.5;if hθ(x0)≥0.5.
y
0
=
{
0
,
if
h
θ
(
x
0
)
<
0.5
;
1
,
if
h
θ
(
x
0
)
≥
0.5.
Logistic回归
在线性回归(Linear Regression)中,我们常找一组参数
θ=⎛⎝⎜⎜⎜θ0θ1...θm⎞⎠⎟⎟⎟
θ
=
(
θ
0
θ
1
.
.
.
θ
m
)
计算
f(x)=θTx.
f
(
x
)
=
θ
T
x
.
设置阈值
T
T
,通过
f(x)与
T
T
的大小关系判断正负类。
而在Logistic回归中,我们引入Sigmoid函数
g(z)=11+e−z.
其图像如下
Logistic回归取hypothesis function为
hθ(x)=g(θTx)=11+eθTx=p(y=1|x;θ)=p(y=0|x;θ).
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
θ
T
x
=
p
(
y
=
1
|
x
;
θ
)
=
p
(
y
=
0
|
x
;
θ
)
.
即
hθ(x)
h
θ
(
x
)
等价于正类的概率,由Sigmoid函数图像可知,当
θTx≥0
θ
T
x
≥
0
时,判定为正类,当
θTx<0
θ
T
x
<
0
时,判定为负类。
代价函数(cost function)
与线性回归问题类似,Logistic同样需要定义代价函数使用梯度下降法优化参数
由于Sigmoid函数的使用,若使用与线性回归相同的二次损失函数,优化问题将变为非凸问题,即可能存在很多局部最优解。Logistic回归采用以下损失函数
cost(hθ(x),y)={−log(hθ(x)),−log(1−hθ(x)),if y=1;if y=0.
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
{
−
log
(
h
θ
(
x
)
)
,
if
y
=
1
;
−
log
(
1
−
h
θ
(
x
)
)
,
if
y
=
0.
为了方便计算,将分段损失函数改写为如下形式
cost(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x)).
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
log
(
h
θ
(
x
)
)
−
(
1
−
y
)
log
(
1
−
h
θ
(
x
)
)
.
优化目标
对于样本数目为
n
n
的训练集,定义目标函数为
J(θ)=1n∑i=1ncost(hθ(x(i)),y(i))=−1n[∑i=1ny(i)log(hθ(x(i))+(1−y(i))log(1−hθ(x(i))]
优化目标为:找到令
J(θ)
J
(
θ
)
最小的
θ
θ
.
算法描述
want
w
a
n
t
:
minθJ(θ)
m
i
n
θ
J
(
θ
)
Repeat
R
e
p
e
a
t
θj:=θj−α∂J(θ)θj,j=0,...,m.
θ
j
:=
θ
j
−
α
∂
J
(
θ
)
θ
j
,
j
=
0
,
.
.
.
,
m
.
其中,
α
α
为梯度下降法的学习率.
优化算法列举
1)Gradient descent
2)Conjugate gradient
3)BFGS
4)L-BFGS
利用Octave实现Logistic回归
Octave是一种高层解释类编程语言,旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件,早期版本为命令行交互方式,4.0.0版本发布基于QT编写的GUI交互界面。Octave语法与Matlab语法非常接近,可以很容易的将matlab程序移植到Octave。同时与C++,QT等接口较Matlab更加方便。
注:Octave与Matlab语法类似,下标从1开始。
例子:
θ=(θ1θ2)
θ
=
(
θ
1
θ
2
)
J(θ)=(θ1−1)2+(θ2−1)2
J
(
θ
)
=
(
θ
1
−
1
)
2
+
(
θ
2
−
1
)
2
∂J(θ)θ1=2(θ1−1)
∂
J
(
θ
)
θ
1
=
2
(
θ
1
−
1
)
∂J(θ)θ2=2(θ2−1)
∂
J
(
θ
)
θ
2
=
2
(
θ
2
−
1
)
代码:
定义函数,给出优化目标及对应的梯度,初始化梯度
function [jVal, gradient] = costFunction(theta)
jVal = (theta(1)-1)^2 + (theta(2)-1)^2;
gradient = zeros(2,1)
gradient(1) = 2 * (theta(1)-1);
gradient(2) = 2 * (theta(2)-1);
endfunction
设定option,设置梯度目标参数为打开,最大迭代次数为100,并初始化
θ
θ
.
options = optimset('GradObj', 'on', 'MaxIter','100')
initialTheta = zeros(2,1)
调用fminunc这个函数,传入三个参数,其中第一个参数@costFunction这里的@符号代表指向之前我们定义的costFunction函数的指针。后面两个参数分别是我们定义的thetatheta初始值和配置信息options。它会自动的从众多高级优化算法中挑选一个来使用。
[optTheta, functionVal, exitFlag]=...
fminunc(@costFunction, initialTheta, options)
输出结果
即
θ1=1
θ
1
=
1
,
θ2=1
θ
2
=
1
,
exitFlag=1
e
x
i
t
F
l
a
g
=
1
表明已经收敛.
注:本文内容为网易云课堂吴恩达机器学习视频学习时的记录的笔记,仅做学习使用,笔者对OCTAVE首次接触,仅仅实现了课堂上的例子。如有错误,欢迎联系笔者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)