逻辑回归——公式推导详情

记录Logistic的一次详尽公式推导及使用

  • 简介
    文章针对像我一样数学弱又想学好机器的朋友们!手写推导过程尽可能的详尽。后面还有案例实现,希望也能帮助大家理解。
    Logistic 回归模型和线性回归一样,都是 y = wx + b ,其中 x 可以是一个多维特征,唯一不同的地方在于Logistic 回归会对 y 作用一个Logistic 函数,将其变为一种概率结果,Logistic 函数作为逻辑回归核心,也称谓sigmod函数。

  • 基本公式
    下面公式不好表示,就用图片形式展示了。
    这里写图片描述
    假设:
    这里写图片描述

  • 代价函数
    效果的好坏需要定义一个代价函数来反映。如果将线性回归的代价函数(平方误差等)用在非线性中,那J(θ)很有可能就是非凸函数,即存在很多局部最优解,但不一定是全局最优解。我们希望构造一个凸函数,也就是一个碗型函数做为逻辑回归的代价函数。联想到高数的似然方程,按照求最大似然函数的方法,定义逻辑回归似然函数:
    这里写图片描述
    问题转换为求L(θ)的极值。其中,m为样本总数,y(i)表示样本的类别,x(i)表示第i个样本,需要注意的是θ为多维向量,x(i)也是多维向量。下面利用似然函数常处理的方法,两边去log将乘法运算转换为加法。
    这里写图片描述
    然后就是求导取极值(如果存在)。

  • 求导过程
    根据公式:
    这里写图片描述
    我们可以把logL(θ)看成3部分处理。
    这里写图片描述
    最终求得:
    这里写图片描述

  • 代码实现
    最后我们用代码实现来加深下这个公式的理解。自己实现一个梯度下降或者上升的方法。

import numpy as np;
from tensorflow import sigmoid

# 梯度上升方法
def gradAscent(dataMatIn , classLabels):
    dataMatrix = np.mat(dataMatIn)  #转换成numpy 的mat
    labelMat = np.mat(classLabels).transpose()  #转换成numpy的mat格式,再装置
    m,n = np.shape(dataMatrix);  #获取dataMatrix的行列数
    alpha = 0.01     #更新速率
    maxCycles = 5000   #迭代次数
    weights = np.ones((n,1))    #初始化权重矩阵
    for i in range(maxCycles):
        h = sigmoid(dataMatrix * weights)    # 计算预测值h
        error = labelMat - h
        # 我们刚才推导的公式!
        weights = weights + alpha * dataMatrix.transpose() * error    
    return weights.getA()                       #将矩阵转换为数组,返回权重数组
### 逻辑回归数学公式推导 #### 1. Sigmoid 函数定义 为了实现二分类任务,逻辑回归采用了一种特殊的激活函数——Sigmoid函数。该函数能够将线性模型的输出压缩至(0,1)之间,从而表示事件发生的概率。 \[ \sigma(z)=\frac{1}{1+e^{-z}} \] 其中 \( z=\theta^{T}X \),\( X \)代表特征向量而\( \theta \)则是参数向量[^2]。 #### 2. 损失函数构建 对于单个样本而言,在给定参数的情况下,如果实际标签为y,则预测正确的似然可表达如下: 当 y=1 时: \[ P(y=1|x;\theta )=\hat{y}=h_\theta(x)=\sigma(\theta^Tx)\] 反之,若 y=0 : \[P(y=0|x;θ)=1−\hat{y}=1-h_\theta(x)=1-\sigma(\theta^Tx)\] 综合上述两种情况,可以得出单一训练实例上的似然估计形式;进一步取其负对数获得成本项。最终整个数据集的成本函数J(θ)被定义成所有个体成本之平均值[^1]。 #### 3. 偏导数计算与梯度下降更新规则 利用链式求导法则来分别针对各个权重w_i以及截距b求解损失函数关于它们的一阶偏微分。具体来说就是先算出σ'(z),再乘上内部变量z相对于对应位置的变化率dz/dwi 或 dz/db 。最后按照标准SGD算法调整各系数直至收敛于局部最优解处停止迭代过程。 ```python import numpy as np def sigmoid(z): return 1 / (1 + np.exp(-z)) def compute_gradient(X, y, theta): m = len(y) predictions = sigmoid(np.dot(X, theta)) error = predictions - y grad = (1/m) * np.dot(X.T, error) return grad ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值