1.分类问题
你要预测的变量
y
y
y是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。
从二元的分类问题开始讨论。
我们将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class) 和正向类(positive class) ,则因变量
y
∈
0
,
1
y \in 0,1
y∈0,1 ,其中 0 表示负向类,1 表示正向类 。
如果我们要用线性回归算法来解决一个分类问题,对于分类,
y
y
y取值为 0 或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签
y
y
y都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法 ,这个算法的性质是:它的输出值永远在0到1之间。
逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 y y y取值离散的情况,如:1 0 0 1。
2.假说表示
在分类问题中,要用什么样的函数来表示我们的假设。我们希望分类器的输出值在0和1之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间。
根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:
当
h
θ
(
x
)
>
=
0.5
h_{\theta}(x)>=0.5
hθ(x)>=0.5 时,预测
y
=
1
y=1
y=1。
当
h
θ
(
x
)
<
0.5
h_{\theta}(x)< 0.5
hθ(x)<0.5 时,预测
y
=
0
y=0
y=0。
对于上图所示的数据,这样的一个线性模型似乎能很好地完成分类任务。假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的直线。
这时,再使用0.5作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。
我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是:
h
θ
(
x
)
=
g
(
θ
T
X
)
h_{\theta}(x)=g\left(\theta^{T} X\right)
hθ(x)=g(θTX) 其中:
X
X
X代表特征向量,
g
g
g代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1 。
PS:函数g使得所有的
θ
T
X
\theta^{T} X
θTX输入到
g
g
g中得到值域在0-1之间。
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
函数图像为:
合起来,我们得到逻辑回归模型的假设:
对模型的理解:
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1
h
θ
(
x
)
h_{\theta}(x)
hθ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量
y
=
1
y=1
y=1的可能性(estimated probablity)即
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
h_{\theta}(x)=P(y=1 | x ; \theta)
hθ(x)=P(y=1∣x;θ) 。
例如,如果对于给定的
x
x
x,通过已经确定的参数计算得出
h
θ
(
x
)
=
0.7
h_{\theta}(x)=0.7
hθ(x)=0.7,则表示有70%的几率
y
y
y为正向类,相应地
y
y
y为负向类的几率为
1
−
0.7
=
0.3
1-0.7=0.3
1−0.7=0.3。
3.判定边界
决策边界(decision boundary)
在逻辑回归中,我们预测:
当
h
θ
(
x
)
>
=
0.5
h_{\theta}(x)>=0.5
hθ(x)>=0.5 时,预测
y
=
1
y=1
y=1。
当
h
θ
(
x
)
<
0.5
h_{\theta}(x)< 0.5
hθ(x)<0.5 时,预测
y
=
0
y=0
y=0。
根据上面绘制出的 S 形函数图像,我们知道当
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
又
z
=
θ
T
x
z=\theta^{T}x
z=θTx ,即:
θ
T
x
>
=
0
\theta^{T}x>=0
θTx>=0 时,预测
y
=
1
y=1
y=1
θ
T
x
<
0
\theta^{T}x<0
θTx<0 时,预测
y
=
0
y=0
y=0
现在假设我们有一个模型:
并且参数
θ
\theta
θ 是向量[-3 1 1]。 则当
−
3
+
x
1
+
x
2
≥
0
-3+x_{1}+x_{2} \geq 0
−3+x1+x2≥0,即
x
1
+
x
2
≥
3
x_{1}+x_{2} \geq 3
x1+x2≥3时,模型将预测
y
=
1
y=1
y=1。 我们可以绘制直线
x
1
+
x
2
=
3
x_{1}+x_{2}=3
x1+x2=3,这条线便是我们模型的分界线,将预测为1的区域和预测为 0的区域分隔开。
假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?
因为需要用曲线才能分隔
y
=
0
y=0
y=0 的区域和
y
=
1
y=1
y=1 的区域,我们需要二次方特征:
h
θ
(
x
)
=
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
+
θ
4
x
2
2
)
h_{\theta}(x)=g\left(\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\theta_{3} x_{1}^{2}+\theta_{4} x_{2}^{2}\right)
hθ(x)=g(θ0+θ1x1+θ2x2+θ3x12+θ4x22)且
θ
=
[
−
1
0
0
1
]
\theta=\left[ \begin{array}{c}{-1} \\ {0} \\ {0} \\ {1}\end{array}\right]
θ=⎣⎢⎢⎡−1001⎦⎥⎥⎤,则我们得到的判定边界恰好是圆点在原点且半径为1的圆形。
我们可以用非常复杂的模型来适应非常复杂形状的判定边界。
4.代价函数
那么我们如何拟合逻辑回归模型的参数 θ \theta θ呢?
训练集: { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , ⋯   , ( x ( m ) , y ( m ) ) } \left\{\left(x^{(1)}, y^{(1)}\right),\left(x^{(2)}, y^{(2)}\right), \cdots,\left(x^{(m)}, y^{(m)}\right)\right\} {(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))}
m examples:
x
∈
[
x
0
x
1
⋯
x
n
]
x
0
=
1
,
y
∈
{
0
,
1
}
x \in \left[ \begin{array}{l}{x_{0}} \\ {x_{1}} \\ {\cdots} \\ {x_{n}}\end{array}\right] \quad x_{0}=1, y \in\{0,1\}
x∈⎣⎢⎢⎡x0x1⋯xn⎦⎥⎥⎤x0=1,y∈{0,1}
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T} x}}
hθ(x)=1+e−θTx1
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T} x}}
hθ(x)=1+e−θTx1带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
线性回归的代价函数为: J ( θ ) = 1 m ∑ i = 1 m 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} J(θ)=m1∑i=1m21(hθ(x(i))−y(i))2
逻辑回归的代价函数为: J ( θ ) = 1 m ∑ i = 1 m cost ( h θ ( x ( i ) ) , y ( i ) ) J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right) J(θ)=m1∑i=1mcost(hθ(x(i)),y(i))
其中:
cost
(
h
θ
(
x
)
,
y
)
=
{
−
log
(
h
θ
(
x
)
)
if
y
=
1
−
log
(
1
−
h
θ
(
x
)
)
if
y
=
0
\operatorname{cost}\left(h_{\theta}(x), y\right)=\left\{\begin{array}{cl}{-\log \left(h_{\theta}(x)\right)} & {\text { if } y=1} \\ {-\log \left(1-h_{\theta}(x)\right)} & {\text { if } y=0}\end{array}\right.
cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0
![](https://img-blog.csdnimg.cn/20190530163258240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvMTY0NjgzODEy,size_16,color_FFFFFF,t_70)
为什么用log还有点懵逼,弹幕说是最大似然,学了之后再回来填坑~
h
θ
x
h_\theta{x}
hθx与
cost
(
h
θ
(
x
)
,
y
)
\operatorname{cost}\left(h_{\theta}(x), y\right)
cost(hθ(x),y)之间的关系如下图所示:
这样构建的
cost
(
h
θ
(
x
)
,
y
)
\operatorname{cost}\left(h_{\theta}(x), y\right)
cost(hθ(x),y)函数的特点是:
- 当实际的 y = 1 y=1 y=1 且 h θ ( x ) h_\theta(x) hθ(x)也为 1 时误差为 0,当 y = 1 y=1 y=1 但 h θ ( x ) h_\theta(x) hθ(x)不为1时误差随着 h θ ( x ) h_\theta(x) hθ(x)变小而变大;
- 当实际的 y = 0 y=0 y=0且 h θ ( x ) h_\theta(x) hθ(x)也为 0 时代价为 0,当 y = 0 y=0 y=0但不为 h θ ( x ) h_\theta(x) hθ(x) 0时误差随着 h θ ( x ) h_\theta(x) hθ(x)的变大而变大。
将构建的
cost
(
h
θ
(
x
)
,
y
)
\operatorname{cost}\left(h_{\theta}(x), y\right)
cost(hθ(x),y)简化如下:
cost
(
h
θ
(
x
)
,
y
)
=
−
y
×
log
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
log
(
1
−
h
θ
(
x
)
)
\operatorname{cost}\left(h_{\theta}(x), y\right)=-y \times \log \left(h_{\theta}(x)\right)-(1-y) \times \log \left(1-h_{\theta}(x)\right)
cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
带入代价函数得到:
J
(
θ
)
=
1
m
∑
i
=
1
m
[
−
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
−
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
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]
J(θ)=m1i=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(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(\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]
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
Python代码实现:
import numpy as np
def cost(theta, X, y):
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)))
return np.sum(first - second) / (len(X))
在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
Repeat
{
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
(
simultaneously update all
)
}
\text { Repeat }\left\{\theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta)(\text { simultaneously update all })\right\}
Repeat {θj:=θj−α∂θj∂J(θ)( simultaneously update all )}
PS : 我们没必要对所有的
J
(
θ
)
J(\theta)
J(θ)都求导,
∇
J
(
θ
)
=
(
∂
J
(
θ
)
∂
θ
0
∂
J
(
θ
)
∂
θ
1
⋯
∂
J
(
θ
)
∂
θ
n
)
\nabla J(\theta)=\left( \begin{array}{c}{\frac{\partial J(\theta)}{\partial \theta_{0}}} \\ {\frac{\partial J(\theta)}{\partial \theta_{1}}} \\ {\cdots} \\ {\frac{\partial J(\theta)}{\partial \theta_{n}}}\end{array}\right)
∇J(θ)=⎝⎜⎜⎜⎛∂θ0∂J(θ)∂θ1∂J(θ)⋯∂θn∂J(θ)⎠⎟⎟⎟⎞,求了其中一个之后,整个矩阵就都知道了。
求导后得到:
Repeat
{
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
(simultaneously update all)
}
\text { Repeat }\left\{\theta_{j} :=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} \text { (simultaneously update all) }\right\}
Repeat {θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i) (simultaneously update all) }
在这个视频中,我们定义了单训练样本的代价函数,凸性分析的内容是超出这门课的范围的,但是可以证明我们所选的代价值函数会给我们一个凸优化问题。代价函数
J
(
θ
)
J(\theta)
J(θ)会是一个凸函数,并且没有局部最优值,求出来就是全局最优解。
推导过程:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] 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] J(θ)=−m1∑i=1m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
考虑到
h
θ
(
x
(
i
)
)
=
1
1
+
e
−
θ
T
α
(
i
)
h_{\theta}\left(x^{(i)}\right)=\frac{1}{1+e^{-\theta T_{\alpha}(i)}}
hθ(x(i))=1+e−θTα(i)1,所以:
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 h θ ( x ) = g ( θ T X ) h_\theta(x)=g(\theta^{T}X) hθ(x)=g(θTX)与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) ,fminunc是 matlab和octave 中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,下面是 octave 中使用 fminunc 函数的代码示例:
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
5.简化的成本函数和梯度下降
逻辑回归的代价函数:
J
(
θ
)
=
1
m
∑
i
=
1
m
cost
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right)
J(θ)=m1i=1∑mcost(hθ(x(i)),y(i))
cost
(
h
θ
(
x
)
,
y
)
=
{
−
log
(
h
θ
(
x
)
)
if
y
=
1
−
log
(
1
−
h
θ
(
x
)
)
if
y
=
0
\operatorname{cost}\left(h_{\theta}(x), y\right)=\left\{\begin{array}{cc}{-\log \left(h_{\theta}(x)\right)} & {\text { if } y=1} \\ {-\log \left(1-h_{\theta}(x)\right)} & {\text { if } y=0}\end{array}\right.
cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0
P
s
:
y
=
0
或
y
=
1
Ps: y=0或y=1
Ps:y=0或y=1
这个式子可以合并成:
cost
(
h
θ
(
x
)
,
y
)
=
−
y
×
log
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
log
(
1
−
h
θ
(
x
)
)
\operatorname{cost}\left(h_{\theta}(x), y\right)=-y \times \log \left(h_{\theta}(x)\right)-(1-y) \times \log \left(1-h_{\theta}(x)\right)
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
)
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
\operatorname{cost}\left(h_{\theta}(x), y\right)=-y \times \log \left(h_{\theta}(x)\right)-(1-y) \times \log \left(1-h_{\theta}(x)\right)\\=-\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]
cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
根据这个代价函数,为了拟合出参数,该怎么做呢?我们要试图找尽量让 J ( θ ) J(\theta) J(θ) 取得最小值的参数 θ \theta θ。 min θ J ( θ ) \min _{\theta} J(\theta) minθJ(θ)所以我们想要尽量减小这一项,这将我们将得到某个参数 θ \theta θ。 如果我们给出一个新的样本,假如某个特征 x x x ,我们可以用拟合训练样本的参数 θ \theta θ,来输出对假设的预测。 另外,我们假设的输出,实际上就是这个概率值: p ( y = 1 ∣ x ; θ ) p(y=1 | x ; \theta) p(y=1∣x;θ),就是关于 x x x以 θ \theta θ为参数, y = 1 y=1 y=1的概率,你可以认为我们的假设就是估计 的概率,所以,接下来就是弄清楚如何最大限度地最小化代价函数 J ( θ ) J(\theta) J(θ),作为一个关于 θ \theta θ的函数,这样我们才能为训练集拟合出参数 θ \theta θ。
最小化代价函数的方法,是使用梯度下降法(gradient descent)。这是我们的代价函数:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
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]
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
最小化
min
θ
J
(
θ
)
\min _{\theta} J(\theta)
minθJ(θ)
反复更新每个参数,用这个式子来更新,就是用它自己减去学习率
α
\alpha
α乘以后面的微分项。求导后得到:
如果你计算一下的话,你会得到这个等式:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_{j} :=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)把它写在这里,将后面这个式子,在
i
=
1
i=1
i=1 到
m
m
m 上求和,其实就是预测误差乘以
x
j
(
i
)
x^{(i)}_j
xj(i),所以你把这个偏导数项
∂
∂
θ
j
J
(
θ
)
\frac{\partial}{\partial \theta_{j}} J(\theta)
∂θj∂J(θ) 放回到原来式子这里,我们就可以将梯度下降算法写作如下形式:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_{j} :=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
所以,如果你有
n
n
n个特征,也就是说:
θ
=
[
θ
0
θ
1
θ
2
…
θ
n
]
\theta=\left[ \begin{array}{c}{\theta_{0}} \\ {\theta_{1}} \\ {\theta_{2}} \\ {\dots} \\ {\theta_{n}}\end{array}\right]
θ=⎣⎢⎢⎢⎢⎡θ0θ1θ2…θn⎦⎥⎥⎥⎥⎤参数向量
θ
\theta
θ包括
θ
0
\theta_0
θ0
θ
1
\theta_1
θ1
θ
2
\theta_2
θ2 一直到
θ
n
\theta_n
θn,那么你就需要用这个式子:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_{j} :=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
来同时更新所有
θ
\theta
θ的值。
现在,如果你把这个更新规则和我们之前用在线性回归上的进行比较的话,你会惊讶地发现,这个式子正是我们用来做线性回归梯度下降的。
那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看看发生了哪些变化。实际上,假设的定义发生了变化。
对于线性回归假设函数:
h
θ
(
x
)
=
θ
T
X
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
…
+
θ
n
x
n
h_{\theta}(x)=\theta^{T} X=\theta_{0} x_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n}
hθ(x)=θTX=θ0x0+θ1x1+θ2x2+…+θnxn
而现在逻辑函数假设函数:
h
θ
(
x
)
=
1
1
+
e
−
θ
T
X
h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T} X}}
hθ(x)=1+e−θTX1
因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛。
当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数
θ
\theta
θ,就是
θ
0
\theta_0
θ0
θ
1
\theta_1
θ1
θ
2
\theta_2
θ2 一直到
θ
n
\theta_{n}
θn ,我们需要用这个表达式来更新这些参数。我们还可以使用 for 循环来更新这些参数值,用 for i=1 to n
,或者for i=1 to n+1
。当然,不用 for 循环也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些 个参数同时更新。
最后还有一点,我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。
就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。