logistic回归中cost函数J(θ)的公式推导

本文详细解析Logistic回归中Cost函数的推导过程,包括Sigmoid函数的应用、极大似然估计的概念及其在确定θ参数值中的作用,以及如何通过梯度下降算法求得最优参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在此讲一下logistic回归中cost函数的推导过程

在此之前,先回顾一下Logistic回归。

Logistic回归

  基本原理:“回归”就是用一条直线对一堆数据点进行拟合,这个拟合过程就称为“回归”。利用Logistic回归进行分类的主要思想是,根据现有数据对分类边界线建立回归公式,以此进行分类。

  以Andrew公开课的例子说明:

 

 

  圆(蓝色)和叉(红色)是两类数据点,我们需要找到一个决策边界将其划分开,如图所示的边界形式显然是线性的形式,如图中所描述的:

  我们记为:

  这里,括号里的就是决策边界的表达式,我们找一个函数g,将表达式结果作为输入,生成一个预测函数hθ(x).这里我们使用Sigmoid函数

  从而:

 

  然而有时候,决策边界用一维直线无法区分,也就是这里的θ参数个数是变数,比如下面这堆数据

  这是一种非线性的决策边界。

  可以看到这里,将x1,x2参数全部平方处理,找得一个圆形边界。

  

公式推导

  讲到这里,我们可以把边界形式做如下推广:

  

  边界的最后一项是向量相乘的形式,即:

 

 

  将其输入到sigmoid函数去判断其所属类别,就有了我们的预测函数,记为:

  根据sigmoid图像,这个预测函数输出值大于0.5,那么代表x(数据点)所属类别为1,否则是0(对于二分类问题)。

  但是别忘了我们的最初的目标,这里的θ向量未知。我们的目的是:

    确定θ的参数值,使得我们这个决策边界能更好地划分数据集。

  这个过程,在Andrew的课程里,被略过了,他直接给出了cost函数和J(θ)函数,然后通过梯度下降求得最优的θ参数。其中,J(θ)函数是这样的:

  利用上面的公式以及梯度下降算法,我们就能求出θ的值。也就能求出最能拟合数据的决策边界。

  接下来就要讲讲这个公式是怎么被推导出来的。

  我们先来看看现在我们已经知道什么:

      1、一堆数据点+它们的类别(2类)

      2、它们的概率分布hθ(x):虽然目前θ仍然是未知参数

  我们的目标是求出未知参数,使得每个样本数据点属于它当前所标记的类别的概率最大。

  于是就引出了Fisher的极大似然估计

  这里就不讲极大似然估计的具体概念和公式推导了,不过还是用个例子来形象的说明极大似然估计的作用吧:

        一个猎人和一个学生一起走在山路上,突然从山间跑出一只兔子,啪一声枪响,兔子倒地而亡。问:谁最有可能杀死了兔子?

  答案显而易见:猎人。那么这里,猎人就是那个参数θ。极大似然估计的目标就是预测出待估参数,使得样本事件发生的概率最大。

  对于上述例子,用极大似然估计的思想来说明其中的几个重要信息:

样本事件兔子被枪杀
待估参数射死了兔子的人(记为θ:θ属于{猎人,学生})

 

  极大似然估计就是找出最有可能杀死兔子的人。

  同样,对于本实验的一堆数据点,我们对应着看:

 

样本事件每个样本数据点属于他自己的label  
待估参数决策边界参数向量θ

        P.S.虽然样本里的每条数据都表明了数据点本身的类别,但是使用极大似然估计的时候,你并不知道样本本身所属的类别,样本数据自带的类别标签是你估计好坏的一个评价标准。换句话说,数据点全体就是一个样本事件

  接下来就是估计所需要的数学推导了。

  对于一个连续性的分布,我们需要它的概率密度函数,在本例中,其实就是那个sigmoid函数(取值范围0-1刚好表示的是发生概率),我们重新写在这里:

  把这两个式子写在一起:

 

  可以验证一下,当y=1或者y=0的时候,上式分别满足上上式。对每个样本数据点,满足上式,所以对于群体,我们接下来继续。

  根据极大似然估计的求解步骤,取似然函数:

    

  要求L(θ)的最大值对应的θ参数。其中m是样本数据点的个数

  连乘不容易求解,同时又容易造成下溢出。这里由于x和ln(x)单调性相同,两边取对数

  这个就是Andrew给的那个J(θ)了,唯一的区别就是,Andrew在前面乘了一个负系数,使得这里求最大值变成了最小值,从而可以使用梯度下降算法。

  不过其实用本式也可以完成任务,只是用的算法就变成梯度上升了,其实没有区别。

### 基于Logistic回归和Sigmoid函数实现分类 #### 1. Logistic回归简介 Logistic回归是一种用于解决二分类问题的统计方法。其目标是通过输入特征预测离散的结果变量 \( y \in \{0, 1\} \),其中 \( 0 \) 表示负类(Negative Class),\( 1 \) 表示正类(Positive Class)。它利用假设函数(Hypothesis Function)来建模数据之间的关系。 假设函数的形式如下: \[ h_\theta(x) = g(\theta^T x), \quad g(z) = \frac{1}{1 + e^{-z}} \] 这里,\( g(z) \) 是 Sigmoid 函数[^2],它的取值范围为 \( [0, 1] \),能够很好地表示概率分布。 --- #### 2. Python 实现逻辑回归 以下是基于 `scikit-learn` 的库函数以及手动实现逻辑回归的方法: ##### 方法一:使用 scikit-learn 库函数 可以调用 `sklearn.linear_model.LogisticRegression` 来快速构建模型并训练数据集。该模块提供了许多可配置参数,例如正则化强度、求解器类型等。 ```python from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 数据准备 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 初始化模型 model = LogisticRegression(penalty='l2', C=1.0, solver='liblinear') # 训练模型 model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 输出准确率 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.4f}") ``` 上述代码中,`penalty='l2'` 和 `C=1.0` 控制 L2 正则化的强度;`solver='liblinear'` 使用适合小型数据集的优化算法[^1]。 --- ##### 方法二:手动实现逻辑回归 如果希望深入理解内部机制,则可以通过梯度下降法自行编写逻辑回归程序。 ###### (a) 定义损失函数与梯度计算 逻辑回归的目标是最小化代价函数 \( J(\theta) \),定义如下: \[ J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_\theta(x^{(i)})) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))] \] 对应的梯度更新规则为: \[ \nabla_\theta J(\theta) = \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \] 加入正则化项后,梯度变为: \[ \nabla_\theta J(\theta) = \frac{1}{m} X^\top(g(X\theta) - y) + \frac{\lambda}{m} \theta \] 注意:对于截距项 \( \theta_0 \),不应用正则化处理[^3]。 ###### (b) 编写代码 下面是一个完整的实现过程: ```python import numpy as np def sigmoid(z): """Sigmoid激活函数""" return 1 / (1 + np.exp(-z)) def compute_cost(theta, X, y, lambd=0): """ 计算带正则化的成本函数 :param theta: 参数向量 :param X: 特征矩阵 :param y: 标签向量 :param lambd: 正则化系数 """ m = len(y) predictions = sigmoid(np.dot(X, theta)) cost = (-1/m) * (np.dot(y.T, np.log(predictions)) + np.dot((1-y).T, np.log(1-predictions))) reg_term = (lambd / (2*m)) * np.sum(theta[1:] ** 2) # 不对θ₀施加惩罚 total_cost = cost + reg_term return total_cost.flatten() def gradient_descent(theta, X, y, alpha, iterations, lambd=0): """ 执行批量梯度下降 :param theta: 初始参数向量 :param X: 特征矩阵 :param y: 标签向量 :param alpha: 学习速率 :param iterations: 迭代次数 :param lambd: 正则化系数 """ m = len(y) costs = [] for _ in range(iterations): z = np.dot(X, theta) predictions = sigmoid(z) error = predictions - y grad = (1/m) * np.dot(X.T, error) reg_grad = (lambd/m) * theta reg_grad[0] = 0 # 截距项无需正则化 theta -= alpha * (grad + reg_grad) current_cost = compute_cost(theta, X, y, lambd=lambd) costs.append(current_cost) return theta, costs # 示例运行 if __name__ == "__main__": # 构造简单数据集 X = np.array([[1, 2], [1, 3], [1, 4]]) y = np.array([0, 0, 1]) # 添加偏置列 X_b = np.c_[np.ones((len(X), 1)), X[:, 1].reshape(-1, 1)] initial_theta = np.zeros(X_b.shape[1]) # 初始化参数 learning_rate = 0.1 num_iterations = 1000 regularization_lambda = 0.1 final_theta, cost_history = gradient_descent(initial_theta, X_b, y, learning_rate, num_iterations, regularization_lambda) print("Final Theta:", final_theta) ``` 此代码实现了带有正则化的逻辑回归,并展示了如何逐步调整参数以最小化误差。 --- ### 总结 逻辑回归的核心在于通过 Sigmoid 函数将线性组合映射到概率空间,从而完成分类任务。无论是借助成熟的机器学习框架还是手动生成解决方案,都可以灵活应对实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值