分类问题-逻辑回归
其实对于分类问题的本质还是选择合适的函数h(x),通过改变函数的系数Θ使其代价cost(i)之和J(Θ)最小.
得出合适的hθ(x)函数。
逻辑回归
分类问题不一定都是线性可分的,还有很多是非线性分类的。
回归函数选择
对于01分类问题,由于正常的线性回归方程的局限性,采用非线性模型
模
型
函
数
:
h
θ
(
x
)
=
g
(
θ
T
x
)
θ
T
x
可
以
表
示
为
多
项
式
如
:
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
x
2
+
.
.
.
其
中
g
(
z
)
=
1
1
+
e
−
z
所
以
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
模型函数:h_{\theta}(x)=g(\theta ^T x)\\ \theta^T x可以表示为多项式如:\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1^2x_2+...\\ 其中g(z)=\frac{1}{1+e^{-z}}\\ 所以h_{\theta}(x)=\frac{1}{1+e^{-\theta^Tx}}
模型函数:hθ(x)=g(θTx)θTx可以表示为多项式如:θ0+θ1x1+θ2x2+θ3x12x2+...其中g(z)=1+e−z1所以hθ(x)=1+e−θTx1
代价函数选择
线性回归模型代价函数:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
使
用
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
1
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2\\ 使用Cost(h_\theta(x),y)=\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2\\
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2使用Cost(hθ(x),y)=21(hθ(x(i))−y(i))2
这里的代价函数表示的是我们希望学习算法付出的代价
直接使用欧氏距离代价函数,会有两个问题。
- 误差不合适的问题。
- 非凸函数出现的多个局部最优点。
所以我们要使用交叉熵损失函数来优化。
合适的代价函数如下所示,可以使得代价函数为θ的凸函数,便于使用梯度下降算法
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
l
o
g
(
h
θ
(
x
)
)
i
f
y
=
1
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
l
o
g
(
1
−
h
θ
(
x
)
)
i
f
y
=
0
因
此
其
误
差
函
数
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost(h_\theta(x),y)=-log(h_\theta(x))\ \ \ if\ y=1\\ Cost(h_\theta(x),y)=-log(1-h_\theta(x))\ \ \ if\ y=0\\ 因此其误差函数J(\theta)=\frac{1}{m}\sum_{i=1}^mCost(h_\theta(x),y)
Cost(hθ(x),y)=−log(hθ(x)) if y=1Cost(hθ(x),y)=−log(1−hθ(x)) if y=0因此其误差函数J(θ)=m1i=1∑mCost(hθ(x),y)
其中,y只属于0或1.
这里使用了交叉熵损失函数来代替欧式距离函数。
具体区别和解析见博客:为什么不用平方误差(MSE)作为Logistic回归的损失函数
简化代价函数
因为分段函数,所以我们将其按y和(1-y)来组合即可将整个函数放在一个式子中。
使用极大似然估计法求得
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
1
m
[
∑
i
=
1
m
(
y
(
i
)
l
o
g
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
使
得
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
y
(
i
)
l
o
g
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
J(\theta)=\frac{1}{m}\sum_{i=1}^mCost(h_\theta(x),y)\\ =-\frac{1}{m}[\sum_{i=1}^m(y^{(i)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]\\ 使得Cost(h_\theta(x),y)=y^{(i)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))
J(θ)=m1i=1∑mCost(hθ(x),y)=−m1[i=1∑m(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]使得Cost(hθ(x),y)=y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))
求最小化J(θ)的θ组合-梯度下降
根 据 梯 度 下 降 算 法 , 更 新 每 一 项 θ , 使 其 延 代 价 函 数 对 θ 的 切 线 方 向 ( 偏 导 数 ) 下 降 θ j : = θ j − α ∂ ∂ θ j J ( θ ) 其 中 J ( θ ) = 1 m ∑ i = 1 m C o s t ( h θ ( x ) , y ) θ j : = θ 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,使其延代价函数对\theta的切线方向(偏导数)下降\\ \theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta)\\ 其中J(\theta)=\frac{1}{m}\sum_{i=1}^mCost(h_\theta(x),y)\\ \theta_j:=\theta_j-\alpha\frac{\partial (\frac{1}{m}[\sum_{i=1}^my^{(i)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))])}{\partial\theta_j}\\ 根据梯度下降算法,更新每一项θ,使其延代价函数对θ的切线方向(偏导数)下降θj:=θj−α∂θj∂J(θ)其中J(θ)=m1i=1∑mCost(hθ(x),y)θj:=θj−α∂θj∂(m1[∑i=1my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))])
比较之前的欧式代价函数梯度下降:
由
于
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
θ
j
:
=
θ
j
−
α
∂
(
1
m
∑
i
=
1
m
1
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
)
∂
θ
j
手
动
求
导
后
得
到
具
体
的
表
达
式
:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
由于J(\theta)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2\\ \theta_j:=\theta_j-\alpha\frac{\partial(\frac{1}{m}\sum_{i=1}^m\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2)}{\partial\theta_j}\\ 手动求导后得到具体的表达式:\\ \theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}
由于J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2θj:=θj−α∂θj∂(m1∑i=1m21(hθ(x(i))−y(i))2)手动求导后得到具体的表达式:θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
之后执行梯度下降算法即可求出要求的θ
优化库函数实现
(这里用的octave语言。)
首先给出求导函数
这里使用下面公式表示代价函数
j
(
θ
)
=
(
θ
1
−
5
)
2
+
(
θ
2
−
5
)
2
j(\theta)=(\theta_1-5)^2+(\theta_2-5)^2
j(θ)=(θ1−5)2+(θ2−5)2
function [jVal,gradient] = costFunction(theta)
jVal = (theta(1)-5)^2+(theta(2)-5)^2;
gradient=zeros(2,1);
gradient(1)=2*(theta(1)-5);
gradient(2)=2*(theta(2)-5);
其次调用函数
options = optimset('GradObj','on','MaxIter','100'); %%优化算法的记号
initialTheta=zeros(2,1); %初始的梯度值
[optTheta,functionVal,exitFlag] = fminunc(@costFunction,initialTheta,options);
可以运行得出,最后的θ为[5,5]
参考资料
B站课吴恩达机器学习:https://www.bilibili.com/video/BV164411b7