浅谈Logisitic Regression

本文介绍了Logistic回归的基本原理及应用。通过引入sigmoid函数解决分类问题,并使用极大似然估计来确定模型参数。同时,文章对比了Logistic回归与线性回归的不同之处,并详细讲解了如何通过梯度上升算法来优化参数。

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

浅谈Logisitic Regression

引言

这一篇呢主要是谈谈我自己对于Logisitic Regression的一些理解。这里呢,Regression虽然中文是回归的意思,但是Logisitic Regression可不是预测连续值的那个回归哦。它是主要用来分类的一种方法。(敲黑板) 这里的分类不仅仅可以进行二分类,多分类当然也是可以哒!只不过咱们进行一丢丢小的改进就ok啦!这个关于多分类的问题嘛,咱们后面再说哈,这里先以最简单的二分类为模型细细掰扯掰扯。

小tips:在学习Logisitic Regression回归之前,希望大家都已经对Linear Regression有所了解哦。

正文
Now, let’s begin!
首先,我们来看一张图:
样本集

这是一个二维的数据集,每个样本拥有两个特征(x1,x2),下面我们的任务就是用Logisitic Regression将这两类样本点用类似这一条红线分类开来:
这里写图片描述

在Linear Regression中,我们预测一个连续值的方法是先提取样本的特征,如x=(x0,x1,x2……xn),n属于正整数。然后训练每个特征的权重θ,使θT.x=y,y即为预测的连续值结果。然而,这个连续的结果并不能直接用于分类,而我们的分类也必须用到数据集的各个特征,使之能够表征到分类模型中,那么怎么办呢?我们现在引入一个函数名为sigmoid函数:

g(z)=11+ez

这个函数来源于一种分布名为逻辑斯谛分布(logisitic distribution)。关于这方面的知识,请参阅李航老师的《统计学习方法》,这里就不再深入讨论了。
g(z)的函数图象如下:
sigmoid函数图像
该函数为单调递增函数,定义域为整个实数集,值域为(0,1) 横轴越大,越趋近于1,相反,越趋近于0。
看到这儿的时候有没有猛然想起《信号与系统》里的单位跃迁函数呀?(恩,你很机智^-^)

sigmoid函数中的z,其实就是我们用类似于Linear Regression中的y=θTx(只是形式相同啊喂),我们将其代入到g(z)中就得到了:

hθ(x)=g(θTx)=11+eθTx

不难看出,输出的结果是个属于(0,1)的数。我们假设分类标签为{0,1},输出的标签为,若h>0.5 则令y=1,即为正例;相反,若h<0.5 则令y=0,即y为反例。 如下图所示 这样我们就可以对上面那个样本集点的图进行分类啦!这里写图片描述

下面一个比较关键的问题就是如何让这个model的分类效果最好呢?
这个问题里包含了两个方面:1.如何选取各个特征xi的权重θ  2.如何定义这个model的目标函数?
其实这两个问题是可以统一到一起的,我们先定义目标函数,然后利用最优化算法求解其权重参数θ。
在一般模型中,会采用MSE(最小误差平方和的准则函数)来作为目标函数,若我们在Logisitic Regression中采用如下目标函数J(θ)

Cost(hθ(x(i)),y(i))=12(hθ(xi)y(i))2

Stanford的Andrew Ng老师说,这是一个关于θ的非凸函数,我们可能会得到如下图像:
非凸MSE

所以,MSE就明显不适用于Logisitic Regression了。那我们怎么办呢?我们需要求得权重θ,那么也就是说我们需要估计θ,使θ最接近于实际值对吧?既然我们现在已经有了样本集了,那么……对!这不就是可以利用极大似然估计吗!下面的式子我们就信手拈来啦!
在这里假设类别标签为{0,1},那么

P(y=1|x;θ)=hθ(x)
P(y=0|x;θ)=1hθ(x)

这个分段函数我们可以整合成一个式子:
p(y|x;θ)=(hθ(x))y(1(hθ(x))1y

Obviously,对于一个样本集,可以得到其似然函数L(θ):
L(θ)=p(y⃗ |X;θ)
=i=1mp(y(i)|x(i);θ)
=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

将其转化为对数形式:
l(θ)=logL(θ)=i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))

接下来我们求得这个对数似然函数的偏导,就可以为后面的最优化算法做铺垫啦!
l(θ)(θj)=i=1m(y(i)g(θTx(i)))x(i)j

有了这些条件之后,梯度上升算法已经饥渴难耐啦!(梯度上升算法可以求得l(θ)的最大值,属于最优化算法中一种常用的方法。在Andrew Ng老师视频中,他将目标函数J(θ)前加了”-“,使最小化目标函数,对应的,采用的应是梯度下降法。其实两者原理一样,只不过训练参数时一个是“+”,一个是“-”。关于梯度下降或者上升算法,希望不了解的同学看一下最优化方法方面的书籍哦,都会有介绍的。)
我们下面利用梯度上升算法开始训练权重参数θ:

Repeat until convergence{

θj:θj+αi=1m(y(i)hθ(x(i)))x(i)j

}

这样,Logisitic Regression中的参数θ就训练出来啦!
但是注意!如果数据量很大的情况下,这种梯度算法就出问题了。因为每次更新都要遍历数据集,计算复杂度很高。所以每次用一个样本点更新权重的“随机梯度上升法”就更适用于数据量大的场景下。

随机梯度上升算法伪代码:
   所有回归系数初始化为1
   对数据集中每个样本
        计算该样本的梯度
        使用alpha×gradient更新回归系数值
   返回回归系数值

但是再注意!等迭代次数多了以后会发现,回归系数会在一个稳定的数值上下震荡。这不难理解,产生这种现象的原因是存在一些不能正确分类的样本点(数据集并非线性可分),在每次迭代时会引发系数的剧烈改变。于是,我们再一次改进,使步长alpha随着迭代次数的增多变得越来越小,这样有利于回归系数值收敛,使收敛速度加快。

关于Logisitic Regression就先简单讲到这里啦,等后面其他的模型与之有联系的话,会再补充。如有错误和不正之处,恳请指正!

<think>好的,我现在需要回答用户关于贝叶斯与Logistic回归的实现方法的问题。首先,我得回顾一下用户提供的引用内容,看看有哪些信息可以利用。用户引用了四篇资料,其中前三篇涉及朴素贝叶斯和Logistic回归的概述、原理、项目案例以及代码实现,第四篇提到了测试结果和一些代码片段。 用户的问题是想了解贝叶斯与Logistic回归在机器学习中的相关内容或实现方法。我需要将这两个算法分开解释,说明它们的原理、实现步骤以及可能的代码示例,并确保符合用户给出的格式要求,比如使用正确的中文回答,数学公式用$...$,独立公式用$$...$$,生成相关问题,并在引用处标注。 首先,关于朴素贝叶斯。根据引用[1]和[3],朴素贝叶斯是基于贝叶斯定理的分类方法,假设特征之间相互独立。实现步骤包括计算先验概率P(c_i)和条件概率P(w|c_i),然后使用这些概率进行分类。需要提到拉普拉斯平滑,避免零概率问题。代码部分可以参考引用[3]中的trainNB0函数,但可能需要稍作调整,比如使用log转换来防止下溢。 接下来是Logistic回归。引用[2]和[4]指出,Logistic回归通过sigmoid函数将线性回归的结果映射到(0,1)区间,用于分类。需要解释梯度下降法的参数更新过程,以及如何使用最大似然估计。代码示例可能包括梯度上升法的实现,如引用[4]中的gradAscent函数,以及如何绘制决策边界。 需要注意两者的区别和联系:朴素贝叶斯是生成模型,基于概率分布;Logistic回归是判别模型,直接建模分类边界。在实现上,贝叶斯需要计算条件概率,而Logistic回归需要优化权重参数。 在数学公式方面,贝叶斯分类器使用$P(c_i|w) = \frac{P(w|c_i)P(c_i)}{P(w)}$,而Logistic回归的sigmoid函数是$\sigma(z) = \frac{1}{1+e^{-z}}$。这些需要用独立公式格式,即$$...$$。 然后需要生成相关问题,可能涉及两种方法的对比、应用场景、优化方法等,确保问题与内容相关且有助于用户进一步学习。 最后,检查是否所有数学表达式都正确使用LaTeX格式,引用标记是否正确添加,回答结构是否清晰,分点说明。确保没有使用Markdown格式,代码块用三个反引号包裹,并标明语言。</think>### 一、贝叶斯分类与Logistic回归实现方法对比 #### 1. 朴素贝叶斯分类器 **核心公式**: $$ P(c_i|w) = \frac{P(w|c_i)P(c_i)}{P(w)} $$ 其中$w=(w_1,w_2,...,w_n)$为特征向量,$c_i$为类别标签。通过**拉普拉斯平滑**避免零概率问题[^3]。 **实现步骤**: 1. 计算每个类别的先验概率$P(c_i)=\frac{\text{类别i的文档数}}{\text{总文档数}}$ 2. 计算条件概率$P(w_j|c_i)=\frac{\text{特征w_j在类别i中出现的次数+1}}{\text{类别i总词数+特征维度}}$ 3. 预测时选择使$P(c_i)\prod P(w_j|c_i)$最大的类别 **Python代码示例**(基于词袋模型): ```python import numpy as np def trainNB0(trainMatrix, trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) p1 = np.sum(trainCategory)/float(numTrainDocs) # 侮辱类概率 p0Num = np.ones(numWords) # 拉普拉斯平滑 p1Num = np.ones(numWords) p0Denom = 2.0 # 特征维度为2(侮辱/非侮辱) p1Denom = 2.0 for i in range(numTrainDocs): if trainCategory[i] == 1: p1Num += trainMatrix[i] p1Denom += np.sum(trainMatrix[i]) else: p0Num += trainMatrix[i] p0Denom += np.sum(trainMatrix[i]) p1Vect = np.log(p1Num/p1Denom) # 对数防止下溢 p0Vect = np.log(p0Num/p0Denom) return p0Vect, p1Vect, p1 ``` #### 2. Logistic回归 **核心公式**: - Sigmoid函数: $$ \sigma(z) = \frac{1}{1+e^{-z}} $$ - 权重更新规则(梯度上升): $$ w := w + \alpha \nabla \ell(w) $$ 其中$\nabla \ell(w) = X^T(y - \sigma(Xw))$,$\alpha$为学习率[^2][^4] **实现步骤**: 1. 初始化权重向量$w$ 2. 迭代计算梯度$\nabla \ell(w)$ 3. 更新权重直至收敛 **Python代码示例**(梯度上升法): ```python def sigmoid(z): return 1.0/(1+np.exp(-z)) def gradAscent(dataMat, labels, maxCycles=500): dataMatrix = np.mat(dataMat) labelMat = np.mat(labels).T m,n = dataMatrix.shape weights = np.ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) error = labelMat - h weights += dataMatrix.T * error # 矩阵运算加速 return weights ``` #### 3. 核心差异对比 | 维度 | 朴素贝叶斯 | Logistic回归 | |------------|------------------------------------|-------------------------------| | 模型类型 | 生成模型(估计联合分布) | 判别模型(直接建模决策边界) | | 假设条件 | 特征条件独立 | 无独立性假设 | | 数据需求 | 小样本即可工作 | 需要更多样本避免过拟合 | | 计算效率 | 训练快,预测$O(1)$ | 训练慢,预测$O(n)$ | | 适用场景 | 文本分类、垃圾邮件过滤[^1][^3] | 疾病预测、广告点击率预估[^2] |
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值