LR(Logistic Regression)算法详解

2024-08-21 11:08

本文主要是介绍LR(Logistic Regression)算法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Logistic Regression本质上还是Linear Regression的一种,只是用了一个Logistic Function将线性回归的连续值映射到了 { 0 , 1 } \{0, 1\} {0,1}空间。因此Linear Regression只能对具有线性边界的分类问题有很好的预测效果,对于非线性的边界是无能为力的。至于下面这张很经典的大家常用的图,只是做了一个feature mapping,根据已有的特征构造了其他的很多新的特征,跟Logistic Regression没有任何关系。而feature mapping的工作则是一项专门的工作,绝没有这么简单。
这里写图片描述
因此说白了,Logistic Regression就是试图找到不同类别之间的线性决策边界。

1. Logistic Regression的引出

对于 { 0 , 1 } \{0,1\} {0,1}二分类问题,使用Linear Regression难以模拟出一个合适的模型来拟合数据,因此我们试图采用另一种方法来拟合。对于二分类,其实就是某事件发生或者不发生。因此我们希望能计算出某事件发生的概率和不发生的概率。假设某事件发生的概率为 p p p,则不发生的概率为 1 − p 1-p 1p,定义一个让步值 o d d s odds odds为:
o d d s = P ( o c c u r i n g ) P ( n o t o c c u r i n g ) = p 1 − p odds=\frac {P(occuring)}{P(not occuring)}=\frac p{1-p} odds=P(notoccuring)P(occuring)=1pp
再定义一个让步比 O R ( o d d s r a t i o ) OR(odds ratio) OR(oddsratio)为两个事件 s 1 s_1 s1 s 2 s_2 s2 o d d s odds odds的比值:
O R = p 1 1 − p 1 p 0 1 − p 0 OR=\frac {\frac {p_1}{1-p_1}}{\frac {p_0}{1-p_0}} OR=1p0p01p1p1
其中 p 1 p_1 p1是实验组的事件发生概率,而 p 0 p_0 p0是对照组(一般事先已知)的事件发生概率。
在Logistic Regression问题中,因变量 y y y服从伯努利分布(又称二项分布),事件发生概率为 p p p。在Logistic Regression中,我们需要根据给定的一堆自变量,模拟出一个现象模型,来预测事件发生的概率 p p p。因此我们需要让自变量的分布和伯努利分布联系起来,这被称为 l o g i t logit logit。Logistic Regression的目标就是在统计学上预估出事件发生的概率 p ^ \hat p p^

基于以上思想,为了将自变量的线性模型和伯努利分布联系起来,我们需要一个函数来将线性模型映射到一个 { 0 , 1 } \{0, 1\} {0,1}伯努利分布上。因此上面提到的 O R OR OR的自然对数,就是我们需要的这样的一个完美的映射,也被称为 l o g i t logit logit
ln ⁡ ( o d d s ) = ln ⁡ ( p 1 − p ) \ln(odds)=\ln(\frac p{1-p}) ln(odds)=ln(1pp)
此时 p p p的范围是 ( 0 , 1 ) (0, 1) (0,1) ln ⁡ ( o d d s ) \ln(odds) ln(odds)的范围是 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)。我们需要求一下反函数:
p = l o g i t − 1 ( α ) = 1 1 + e − α p=logit^{-1}(\alpha)=\frac 1{1+e^{-\alpha}} p=logit1(α)=1+eα1
α \alpha α范围 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)。此时的 α \alpha α就是自变量的线性组合。图像为:
这里写图片描述
也就是著名的 s i g m o d sigmod sigmod函数,此函数极有利于数学计算。然后令:
ln ⁡ p 1 − p = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ j x j \ln\frac p{1-p}=\theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_jx_j ln1pp=θ0+θ1x1+θ2x2++θjxj
其中 j j j为特征的总数量。选择这个式子的原因是:假设我们的样本拥有线性决策边界(这是Logistics Regression的前提),当一个样本的特征 x ( j ) x^{(j)} x(j)的特征给出时,能够通过 θ 0 + ∑ i = 1 j θ j x j \theta_0+\sum_{i=1}^j\theta_jx_j θ0+i=1jθjxj很强烈的判断出该样本属于1类还是0类。因此此时 p p p最好无限接近1或者0,因此 p 1 − p \frac p{1-p} 1pp无限接近 + ∞ +\infty +或者 − ∞ -\infty ,而 ln ⁡ p 1 − p \ln\frac p{1-p} ln1pp无限接近1或者0,刚好能够对应起来。另外选择 e e e为底数,是为了方便计算。

2. 极大似然估计( M L E MLE MLE)

对于给定的一堆样本点,若已知其为第1类,但是我们的模型并不会算出是1,而是会根据自变量得出一个概率值。此概率为: P ( Y = y i = 1 ∣ X = x i ) P(Y=y_i=1|X=x_i) P(Y=yi=1∣X=xi)。若已知其为第0类,模型预测的概率值为: P ( Y = y i = 0 ∣ X = x i ) P(Y=y_i=0|X=x_i) P(Y=yi=0∣X=xi)。好的模型当然是两个概率尽可能越大越好,因此我们把它们乘起来,求其最大值对应的参数,求出来的就是最佳拟合模型。因此极大似然估计其实就是使得我们的模型正确地分类数据集的可能性到达最大。
P = ∏ y i = 1 P ( Y = y i = 1 ∣ X = x i ) × ∏ y i = 0 P ( Y = y i = 0 ∣ X = x i ) = ∏ i = 1 n P ( Y = y i = 1 ∣ X = x i ) y i ( 1 − P ( Y = y i = 1 ∣ X = x i ) ) 1 − y i P=\prod_{y_i=1} {P(Y=y_i=1|X=x_i)}\times \prod_{y_i=0} P(Y=y_i=0|X=x_i)=\prod_{i=1}^n{P(Y=y_i=1|X=x_i)^{y_i}(1-P(Y=y_i=1|X=x_i))^{1-y_i}} P=yi=1P(Y=yi=1∣X=xi)×yi=0P(Y=yi=0∣X=xi)=i=1nP(Y=yi=1∣X=xi)yi(1P(Y=yi=1∣X=xi))1yi
因此逻辑回归就是要求 P P P的最大值。这就是极大似然估计。
假设概率 P P P个自变量 X X X之间存在关系:
P ( y = 1 ∣ x ; θ ) = h θ ( x ) P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P(y=1|x;\theta)=h_\theta(x)\\ P(y=0|x;\theta)=1-h_\theta(x) P(y=1∣x;θ)=hθ(x)P(y=0∣x;θ)=1hθ(x)
合并为:
P ( y ∣ x ; θ ) = h θ y ( x ) ( 1 − h θ ( x ) ) 1 − y P(y|x;\theta)=h_\theta^y(x)(1-h_\theta(x))^{1-y} P(yx;θ)=hθy(x)(1hθ(x))1y
损失函数为:
L ( θ ) = ∏ i = 1 m h θ ( x ( i ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta)=\prod_{i=1}^mh_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i)
这个式子计算不方便,我们对其进行求对数:
l ( θ ) = ln ⁡ ( L ( θ ) ) = ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] \begin{align} l(\theta)&=\ln(L(\theta))\\ &=\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))] \end{align} l(θ)=ln(L(θ))=i=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]
然后对 l ( θ ) l(\theta) l(θ)求偏导:
∂ ( l ( θ ) ) ∂ θ j = ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ⋅ x j ( i ) ) \frac {\partial (l(\theta))}{\partial \theta_j}=\sum_{i=1}^m(y^{(i)}-h_\theta(x^{(i)})\cdot x_j^{(i)}) θj(l(θ))=i=1m(y(i)hθ(x(i))xj(i))
由于这里求最大值,因此是加号:
θ j : = θ j + α ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) ⋅ x j ( i ) \theta_j:=\theta_j+\alpha\sum_{i=1}^m(y^{(i)}-h_\theta(x{(i)}))\cdot x_j^{(i)} θj:=θj+αi=1m(y(i)hθ(x(i)))xj(i)
通过用类似线性回归的不断迭代,最终可以求出 θ ⃗ \vec \theta θ 的值(具体查看线性回归的求解,此处略去)。求解方法其实有很多,最常用的用是牛顿法。

3. 正则化

为了避免模型的过拟合,需要加上正则项,则:
l ′ ( θ ) = l ( θ ) + r e g u l a r i z a t i o n l'(\theta)=l(\theta)+regularization l(θ)=l(θ)+regularization
常用的正则化方法有2个,分别是

  • L1
    θ = arg ⁡ min ⁡ θ ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] + λ ∑ i = 0 k ∣ θ i ∣ \theta=\arg\min_\theta\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))]+\lambda\sum_{i=0}^k|\theta_i| θ=argθmini=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]+λi=0kθi

  • L2
    θ = arg ⁡ min ⁡ θ ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] + λ ∑ i = 0 k θ i 2 \theta=\arg\min_\theta\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))]+\lambda\sum_{i=0}^k\theta_i^2 θ=argθmini=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]+λi=0kθi2

适用情况如下:

L2L1
由于有分析解决方案,计算效率高数据不稀疏的时候计算效率不高
产生非稀疏的输出产生稀疏的输出
没有特征选择有内置的特征选择

4. 牛顿法求解

牛顿法是一种进行 M L E MLE MLE的优化方法,牛顿法在求解逻辑回归时比梯度下降法收敛速度快。

4.1 Hessian

Hessian是一个多变量实值函数的二阶偏导数组成的方块矩阵,假设有一实数函数 f ( x 1 , x 2 , ⋯ , x m ) f(x_1,x_2,\cdots, x_m) f(x1,x2,,xm)。如果 f f f 所有的二阶偏导数都存在,那么 f f f的海森矩阵的第 i j ij ij项即:
H ( f ) i j ( x ) = D i D j f ( x ) H(f)_{ij}(x)=D_iD_jf(x) H(f)ij(x)=DiDjf(x)
其中 x = ( x 1 , x 2 , ⋯ , x m ) x=(x_1,x_2,\cdots,x_m) x=(x1,x2,,xm),即
H ( f ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 x 2 ⋯ ∂ 2 f ∂ x 1 x m ∂ 2 f ∂ x 2 x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 x m ⋮ ∂ 2 f ∂ x m x 1 ∂ 2 f ∂ x m x 2 ⋯ ∂ 2 f ∂ x m 2 ] H(f)= \begin{bmatrix} \frac {\partial^2f}{\partial x_1^2} \frac {\partial^2f}{\partial x_1x_2} \cdots\frac {\partial^2f}{\partial x_1x_m}\\ \frac {\partial^2f}{\partial x_2x_1} \frac {\partial^2f}{\partial x_2^2} \cdots\frac {\partial^2f}{\partial x_2x_m}\\ \vdots\\ \frac {\partial^2f}{\partial x_mx_1} \frac {\partial^2f}{\partial x_mx_2} \cdots\frac {\partial^2f}{\partial x_m^2}\\ \end{bmatrix} H(f)= x122fx1x22fx1xm2fx2x12fx222fx2xm2fxmx12fxmx22fxm22f

Hessian matrix在用牛顿法解决大规模优化问题时经常用到。

4.2 牛顿法步骤:

不断进行下面的迭代:
β n e w = β o l d − H f ( β ) − 1 ∇ f ( β ) \beta^{new}=\beta^{old}-Hf(\beta)^{-1}\nabla f(\beta) βnew=βoldHf(β)1f(β)
其中 H f ( β ) = − X T W X Hf(\beta)=-X^TWX Hf(β)=XTWX,为函数 f ( x ) f(x) f(x)的海森矩阵。 ∇ f ( β ) = X T ( y − p ) \nabla f(\beta)=X^T(y-p) f(β)=XT(yp)是函数的梯度。 W : = d i a g ( p ( 1 − p ) ) W:=diag(p(1-p)) W:=diag(p(1p))是权重, p p p是在当前 β \beta β下的概率预测值。代码为:

def new_step(curr_beta, X, lam=None):p = np.array(sigmod(X.dot(curr[:,0])), ndmin=2).T #计算新的概率pW = np.diag((p(1-p))[:, 0]) #计算新的权重hessian = X.T.dot(W).dot(X) #计算当前权重的hessian矩阵grad = X.T.dot(y-p) #计算梯度if lam:#正则化step, *_ = np.linalg.lstsq(hessian + lam*np.eye(curr_beta.shape[0]), grad)else:step, *_ = np.linalg.lstsq(hessian, grad)beta_new = curr_beta + stepreturn beta_newbeta_old, beta = np.ones((len(X.columns),1)), np.zeros((len(X.columns),1))coefs_converged = Falsewhile not coefs_converges:beta_old = betabeta = newton_step(beta, X, lam=lam)coef_converged = check_coefs_convergence(beta_old, beta, tolerance, itercount)

这篇关于LR(Logistic Regression)算法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092984

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)