逻辑回归的数学推导和其python实现

对于逻辑回归模型,我们有如下假设:

$$ y=h(x)=sigmoid(g(x))=\frac{1}{1+\exp(-g(x))}=\frac{1}{1+\exp(-W.T\times x)} $$

其中有:

$$ sigmoid(x)=\frac{1}{1+exp(-x)} $$$$ g(x)=W.T\times x $$

这里的 $ h(x) $ 可以理解成当输入特征为 $ x $ 时,输出为 $ y=1 $ 的概率,即:

$$ P(y=1|x;W)=h(x) $$$$ P(y=0|x;W)=1-h(x) $$

把上面两个公式联合在一起,得出如下方程:

$$ P(y|x;W)=h(x)^{y}(1-h(x))^{1-y} $$

这里可以理解成 $ P(y|x;W) $ 是服从伯努利分布的,即:

$$ P(y|x;W)\sim Bernoulli(h(x)) $$

为了使我的假设的模型尽量和真实的情况相符,亦即求出模型的最大似然:

$$ \max \prod_{i=1}^{m}P(y_i|x_i;W_i) $$

令 $ L(W) $ 为模型关于参数 $ W $ 的似然函数:

$$ L(W)=\prod_{i=1}^{m}P(y_i|x_i;W_i) $$
$$ l(W)=ln(L(W)) $$
$$ l(W)=ln(\prod_{i=1}^{m}P(y_i|x_i;W_i))=ln(\prod_{i=1}^{m}h(x_i)^{y_i}(1-h(x_i))^{1-y_i}) $$
$$ l(W)=\sum_{i=1}^{m}ln(h(x_i)^{y_i}(1-h(x_i))^{1-y_i}) $$
$$ l(W)=\sum_{i=1}^{m}y_iln(h(x_i))+(1-y_i)ln(1-h(x_i)) $$
$$ \max L(W)\sim \max l(W)=\max \sum_{i=1}^{m}y_iln(h(x_i))+(1-y_i)ln(1-h(x_i)) $$

采用梯度上升算法求解,令:

$$ Q=\sum_{i=1}^{m}y_iln(h(x_i))+(1-y_i)ln(1-h(x_i)) $$

其梯度表达式为:

$$ \frac{\partial Q}{\partial W_i}=\frac{y_i}{h(x_i)}\frac{\partial h(x_i)}{\partial W_i}-\frac{1-y_i}{1-h(x_i)}\frac{\partial h(x_i)}{\partial W_i} $$
$$ \frac{\partial Q}{\partial W_i}=(\frac{y_i}{h(x_i)}-\frac{1-y_i}{1-h(x_i)})\frac{\partial h(x_i)}{\partial W_i} $$
$$ \frac{\partial Q}{\partial W_i}=(\frac{y_i-h(x_i)}{h(x_i)(1-h(x_i))})\frac{\partial h(x_i)}{\partial W_i} $$
$$ \frac{\partial Q}{\partial W_i}=(\frac{y_i-h(x_i)}{\frac{\exp(-g(x_i))}{(1+\exp(-g(x_i)))^2}})(\frac{\exp(-g(x_i))}{(1+exp(-g(x_i)))^2})\frac{\partial g(x_i)}{\partial W_i} $$
$$ \frac{\partial Q}{\partial W_i}=(y_i-h(x_i))x_i $$

因此我们可以得出参数 $ W $ 的更新方程为:

$$ W^k_i=W^{k-1}_i+a\frac{\partial Q}{\partial W_i} $$

其中 $ a $ 为学习率,一下为逻辑回归的python实现:


In [1]:
import numpy as np

# y的列向量
y = np.mat([
    [1],
    [1],
    [1],
    [0],
    [0]
]).T # 1,5

# x的列向量
x = np.mat([
    [1,2,1],
    [2,2,1],
    [3,1,1],
    [7,8,1],
    [9,10,1]
]).T # 3,5

# 权重
W = np.mat([1.0,1.0,1.0]) # 1,3

# 迭代次数
niter = 20000
# 学习率
lr = 0.001

def sigmoid(x):
    return 1.0 / (1 + np.exp(-x))

for i in range(niter):
    W = W + lr * (y - sigmoid(W * x)) * x.T
    
print(W)


[[ 0.03618177 -1.16880035  5.33487419]]

其实大家有没有留意,其实logistic regression,就是神经网络的一个神经元。