65.9K
CodeProject 正在变化。 阅读更多。
Home

实现机器学习的分步指南 IV - 逻辑回归

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (6投票s)

2019 年 5 月 13 日

CPOL

2分钟阅读

viewsIcon

6945

易于实现的机器学习

引言

逻辑回归是统计学习中的一种经典方法,它计算条件概率 P(Y|X) 并使用较大的那个标签作为预测结果。具体来说,二项式逻辑回归模型是

P\left(Y=1|x\right)=\frac{exp\left(w\cdot x+b\right)}{ 1 + exp\left(w\cdot x+b\right)}

P\left(Y=0|x\right)=\frac{1}{ 1 + exp\left(w\cdot x+b\right)}

其中 wb 分别是权重和偏置。为了方便起见,展开权重向量和偏置向量,即

\theta = \left(w^{(1)},w^{(1)},...,w^{(n)},b\right)\\ x =  \left(x^{(1)},x^{(1)},...,x^{(n)},1\right)\\

那么,二项式逻辑回归模型是

P\left(Y=1|x\right)=\frac{exp\left(\theta^{T} x\right)}{ 1 + exp\left(\theta^{T} x\right)}

P\left(Y=0|x\right)=\frac{1}{ 1 + exp\left(\theta^{T} x\right)}

逻辑回归模型

逻辑回归模型包括参数估计、优化算法和分类。

参数估计

逐步指南:实现机器学习 III - 朴素贝叶斯 中,我们使用最大似然函数来估计贝叶斯模型中的参数。 类似地,我们使用最大似然函数来估计逻辑回归模型中的参数。 记

P\left(Y=1|x\right)=\pi_{\theta}\left(x\right)

P\left(Y=0|x\right)=1-\pi_{\theta}\left(x\right)

其中

\pi_{\theta}\left(x\right) =g\left(\theta^{T}x\right)=\frac{1}{1+e^{-\theta^{T}x}}

g(x) 也被称为 **Sigmoid 函数**。 似然函数是

\prod_{i=1}^{N}\left[\pi\left(x^{(i)}\right)\right]^{y^{(i)}}\left[1-\pi\left(x^{(i)}\right)\right]^{1-y^{(i)}}

为了方便起见,我们取似然函数的对数,即

L\left(\theta\right)=\sum_{i=1}^{N}\left[ y^{(i)}\log\pi_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right)\log\left(1-\pi_{\theta}\left(x^{(i)}\right)\right)\right]\\

然后,问题就转化为计算似然函数的最大值。

优化算法

由于,**我们无法获得似然函数导数的解析解**。 为了获得似然函数的最大值,我们应用 **梯度上升法**,即

\theta:=\theta+\alpha \nabla_{\theta}L\left(\theta\right)

计算似然函数的导数

\begin{align*}  \frac{\partial }{\partial \theta_{j}}L\left(\theta\right) & = \left(y{\frac{1}{g\left(\theta^Tx\right)}}-\left(1-y\right)\frac{1}{1-g\left(\theta^Tx\right)}\right)\frac{\partial}{\partial\theta_{j}}g\left(\theta^Tx\right)\\ &=\left(y{\frac{1}{g\left(\theta^Tx\right)}}-\left(1-y\right)\frac{1}{1-g\left(\theta^Tx\right)}\right)g\left(\theta^Tx\right)\left(1-g\left(\theta^{T}x\right)\right)\frac{\partial}{\partial\theta_{j}}\theta^Tx\\ &=\left(y\left(1-g\left(\theta^{T}x\right)\right)-\left(1-y\right)g\left(\theta^{T}x\right)\right)x_{j}\\ &=\left(y-\pi_{\theta}\left(x\right)\right)x_{j}  \end{align*}

令导数等于零,我们可以得到

\theta := \theta+\alpha\sum_{i=1}^{m}\left(y^{(i)}-\pi_{\theta}\left(x^{(i)}\right)\right)x^{(i)}_{j}

因此,我们可以通过上述方程获得优化的参数。 梯度上升法的代码如下所示

    if method == "GA":
    weights = np.random.normal(0, 1, [feature_dim, 1])
    for i in range(iterations):
        pred = self.sigmoid(np.dot(train_data, weights))
        errors = train_label - pred
        # update the weights
        weights = weights + alpha * np.dot(train_data.T, errors)
    self.weights = weights
    return self

分类

在逻辑回归模型中,Sigmoid 函数被用来计算概率,表示为

sigmoid\left(x\right)=\frac{1}{1+e^{-x}}

当结果大于 0.5 时,样本属于类别 1,否则属于类别 0

def sigmoid(self, x, derivative=False):
    output = 1/(1 + np.exp(-x))
    if derivative:
       output = output * (1 - output)
    return output

结论与分析

为了获得逻辑回归模型的参数,我们也可以最小化损失函数。 最后,让我们将我们的逻辑回归与 Sklearn 的进行比较,检测性能如下所示

两者的检测性能相似。

本文相关的代码和数据集可以在 MachineLearning 中找到。

历史

  • 2019 年 5 月 13 日:初始版本
© . All rights reserved.