logistic回归详解

article/2025/9/12 5:09:35

逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法,虽然带有回归的字眼,但是该模型是一种分类算法,逻辑斯谛回归是一种线性分类器,针对的是线性可分问题。利用logistic回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归公式,以此进行分类。这里的“回归”一词源于最佳拟合,表示要找到最佳拟合参数集,因此,logistic训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化方法,接下来我们都会讲到。

一、Logistic回归函数:

我们先说一个概念,事件的几率(odds),是指该事件发生的概率与该事件不发生的概率的比值。如果事件发生的概率是p,那么该事件的几率是p/(1-p)。取该事件发生几率的对数,定义为该事件的对数几率(log odds)或logit函数:
logit(p)=log \frac{p}{1-p}

事件发生的概率p的取值范围为[0,1],对于这样的输入,计算出来的几率只能是非负的,而通过取对数,便可以将输出转换到整个实数范围内。
那我们将输出转换到整个实数范围内的目的是什么呢?因为这样,我们就可以将对数几率记为输入特征值的线性表达式 :

其中,p(y =1|x)是条件概率分布,表示当输入为x时,实例被分为1类的概率,依据此概率我们能得到事件发生的对数几率。但是,我们的初衷是做分类器,简单点说就是通过输入特征来判定该实例属于哪一类别或者属于某一类别的概率。所以我们取logit函数的反函数,令w^{T}x的线性组合为输入,p为输出,经如下推导

公式1就是logistic函数。大家应该对Φ(x)很熟悉,是一个sigmoid函数,类似于阶跃函数的S型生长曲线。

上图给出了sigmoid函数的曲线图。当x为0时,sigmoid函数值为0.5。随着x的增大,对应的sigmoid函数的值将逼近于1;而随着x的减小,sigmoid函数的值将逼近于0。

       那么对于公式1,我们可以这样解释:为了实现logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和带入sigmoid函数中。进而得到一个范围在0-1之间的数值。最后设定一个阈值,在大于阈值时判定为1,否则判定为0。以上便是逻辑斯谛回归算法是思想,公式就是分类器的函数形式。

二、最佳回归系数w的确定(极大似然估计+最优化方法)

       上一节我们已经确定了logistic分类函数,有了分类函数,我们输入特征向量就可以得出实例属于某个类别的概率。但这里有个问题,权重w(回归系数)我们是不确定的。正如我们想的那样,我们需要求得最佳的回归系数,从而使得分类器尽可能的精确。

       如何才能获得最佳的回归系数呢?这里就要用到最优化方法。在很多分类器中,都会将预测值与实际值的误差的平方和作为损失函数(代价函数),通过梯度下降算法求得函数的最小值来确定最佳系数

from numpy import *
import matplotlib.pyplot as plt######################################################读取数据############################################################
def loadDataSet():'''数据集的前两个值分别为X1和X2,第三个值是数据对应的类别标签,为了方便计算,把X0的值设置成了1.0'''dataMat = []labelMat = []fr = open('testSet.txt')for line in fr.readlines():lineArr = line.strip().split()  #按行读取并按空格拆分,每一行为一个列表, ['-0.017612', '14.053064', '0']# 为了方便计算,我们将 X0 的值设为 1.0 ,也就是在每一行的开头添加一个 1.0 作为 X0# 因为线性回归化式为 H(x) = W0 + W1*X1 + W2*X2,即为 (W0, W1, W2)*(1.0, X1, X2),其中 (W0, W1, W2) 即为所求回归系数 W,所以模拟了一个数据列全为1.0dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #[[1.0, -0.017612, 14.053064], [1.0, -1.395634, 4.662541],........]含有100个元素的列表,每一个元素都为一个列表,包含3个元素labelMat.append(int(lineArr[2])) #100个元素(类别标签)的列表return dataMat, labelMat################################################分类器的分类(转换)函数#####################################################
def sigmoid(inX):return 1.0 / (1 + exp(-inX))################################### 梯度上升算法,用来计算出最佳回归系数w(weights)#############################################
#输入数据特征与数据的类别标签,dataMatIn存放的是100*3的矩阵"""第一个参数(dataMatIn)是3维数组,每列代表每个不同特征,每行代表每个训练样本第二个参数(labelMat)是类别标签,1*100的行向量,为便于计算,将其转换为列向量,即进行转置,并赋值给labelMat转化矩阵[[0,1,0,1,0,1.....]]为[[0],[1],[0].....]"""
def gradAscent(dataMatIn, classLabels):dataMatrix = mat(dataMatIn) #转为100*3的矩阵 [ 1.0000000e+00 -1.7612000e-02  1.4053064e+01]labelMat = mat(classLabels).transpose()  #转为100*1的矩阵,transpose() 行列转置函数,将行向量转化为列向量   =>  矩阵的转置# m->数据量、样本数100    n->特征数3m, n = shape(dataMatrix)# shape()函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数alpha = 0.001  # 步长,向函数增长最快的方向的移动量,即学习率maxCycles = 500# 迭代次数weights = ones((n, 1))  # 转为3*1的矩阵,元素为1的矩阵赋给weihts,即回归系数初始化为1# 循环 maxCycles次, 每次都沿梯度向真实值 labelMat 靠拢for k in range(maxCycles):# 求当前sigmoid函数的值h = sigmoid(dataMatrix * weights)  # 矩阵相乘 包含了300次的乘积 [100*3] * [3*1] = [100*1]error = (labelMat - h)  # 向量减法,计算真实类别与预测类别的差值,h是一个列向量,列向量的元素个数等于样本数,即为100weights = weights + alpha * dataMatrix.transpose() * error  # 矩阵相乘,dataMatrix.transpose()* error 就是梯度f(w),按照该差值的方向调整回归系数return weights###################################################分析数据:画出决策边界####################################################
# 画出数据集和Logistic回归最佳拟合直线
def plotBestFit(weights):dataMat, labelMat = loadDataSet()dataArr = array(dataMat)n = shape(dataArr)[0]   # n->数据量、样本数# xcord1,ycord1代表正例特征1,正例特征2# xcord2,ycord2代表负例特征1,负例特征2xcord1 = []; ycord1 = []xcord2 = []; ycord2 = []# 循环筛选出正负集for i in range(n):if int(labelMat[i]) == 1:xcord1.append(dataArr[i, 1]); ycord1.append(dataArr[i, 2])else:xcord2.append(dataArr[i, 1]); ycord2.append(dataArr[i, 2])fig = plt.figure()# “111”表示“1×1网格,第一子图”,“234”表示“2×3网格,第四子图”。ax = fig.add_subplot(111)ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')ax.scatter(xcord2, ycord2, s=30, c='green')# 画线# 设定边界直线x和y的值,并且以0.1为步长从-3.0到3.0切分。x = arange(-3.0, 3.0, 0.1)#[-3.000000000 -2.90000000 -2.80000000 -2.70000000"""y的由来?首先理论上是这个样子的:dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])w0*x0+w1*x1+w2*x2=f(x)x0最开始就设置为1, x2就是我们画图的y值。0是两个类别的分界处所以: w0+w1*x+w2*y=0 => y = (-w0-w1*x)/w2   """y = (-weights[0] - weights[1] * x) / weights[2]  #最佳拟合直线ax.plot(x, y)plt.xlabel('X1');plt.ylabel('X2');plt.show()# 输出运用梯度上升优化算法后得到的最理想的回归系数的值
if __name__ =='__main__':dataArr,labelMat=loadDataSet()weights=gradAscent(dataArr,labelMat)plotBestFit(weights.getA())
















 


http://chatgpt.dhexx.cn/article/Qh7nYSXZ.shtml

相关文章

机器学习笔记(六)Logistic回归

目录 一、什么是Logistics回归 二、sigmoid函数 三、梯度上升法 四、代码实现 数据导入 决策边界 梯度上升 五、总结 一、什么是Logistics回归 logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相…

【机器学习】Logistic回归(重新整理)

Logistic回归学习笔记 Logistic回归学习线路预备知识:建议先去B站学习一下信息量,熵,BL散度,交叉熵的概念。Logistic回归的函数模型损失函数、损失最小化架构对数损失作为损失函数损失最小化架构 分类函数最大概率分类函数阈值分类…

C语言 fprintf 函数 - C语言零基础入门教程

目录 一.fprintf 函数简介二.fprintf 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fprintf 函数简介 fprintf 是 C / C 中的一个格式化库函数,位于头文件 中,其作用是格式化输出到一个流文件中&#xff1…

【printf函数的具体用法】

一、printf()函数 1、基本输出语句 printf()函数是C语言的输出函数,功能是按指定的输出格式把相应的参数值在标准的输出设备中显示出来。 printf 的格式 printf(格式控制串,参数1,参数2,…),…

C语言printf函数详解

文章目录 1、类型符(type)2、宽度(width)3、对齐标志(flags)4、精度(prec)5、格式化输出到字符串6、版权声明 C语言格式化输出的函数有printf、sprintf和snprintf等,功能…

printf函数讲解

printf函数讲解 #include <stdio.h>/*辗转相除法求最大公约数*/ int gcd(int m, int n); int factrial(int a); int main(void){int m, n, t;scanf_s("%d %d", &m, &n);if (m < n){t m;m n;n t;}//n gcd(m, n);//printf("%d", n);pr…

C语言中fscanf和fprintf函数的使用

目录 一、前言 二、对比 1、scanf和fscanf&#xff1a; 2、printf和fprintf&#xff1a; 三、结论&#xff1a; 四、代码实现 1、fprintf相关代码 2、fscanf代码实现 3、 用fscanf和fprintf实现scanf和printf功能&#xff1a; 一、前言 在了解fscanf和fprintf之前我…

printf()函数详解

感谢博主的分享&#xff1a;https://me.csdn.net/blog/K346K346 1.printf()简介 printf()是C语言标准库函数&#xff0c;用于将格式化后的字符串输出到标准输出。标准输出&#xff0c;即标准输出文件&#xff0c;对应终端的屏幕。printf()申明于头文件stdio.h。 函数原型&am…

有关于fprintf()函数的用法

fprintf&#xff08;简介&#xff09; fprintf是C/C中的一个格式化库函数&#xff0c;位于头文件中&#xff0c;其作用是格式化输出到一个流文件中&#xff1b;函数原型为int fprintf( FILE *stream, const char *format, [ argument ]…)&#xff0c;fprintf()函数根据指定的格…

雷达理论的模糊函数

在雷达理论中&#xff0c;模糊与分辨是两个既有联系又有区别的概念。对多个目标来说&#xff0c;模糊就是不能分辨。雷达的分辨力取决于模糊图中心主瓣的宽度。雷达模糊度不仅考虑主瓣宽度&#xff0c;还考虑模糊图旁瓣的影响。因此&#xff0c;在研究雷达分辨理论之前&#xf…

驱动板LVDS输出接口(发送器),液晶面板LVDS输入接口(接收器)

1&#xff0e;LVDS输出接口概述 液晶显示器驱动板输出的数字信号中&#xff0c;除了包括RGB数据信号外&#xff0c;还包括行同步、场同步、像素时钟等信号&#xff0c;其中像素时钟信号的最高频率可超过28MHz。采用TTL接口&#xff0c;数据传输速率不高&#xff0c;传输距离较短…

两种LVDS数传接口--车载视频传输

本文介绍两种LVDS数传接口&#xff1a;GMSL和FPD Link&#xff0c;这两种接口在汽车视频传输方面的应用是比较广泛的&#xff0c;尤其是Camera和处理器之间的链路&#xff0c;通过STP或者同轴电缆能使整个链路达到15m。 1、FPD Link Flat Panel Display Link(FPD Link)最早是…

LVDS接口分类与数据格式

转发路径&#xff1a;https://blog.csdn.net/a617996505/article/details/82386952 1.LVDS接口分类与数据格式 单路6it LVDS 这种接口电路中&#xff0c;采用单路方式传输&#xff0c;每个基色信号采用6位数据&#xff0c;共18位RGB数据&#xff0c;因此&#xff0c;也称18位…

Xilinx fpga实现LVDS高速ADC接口

LVDS 即Low-Voltage Differential Signaling。FPGA的selecteIO非常强大&#xff0c;支持各种IO接口标准&#xff0c;电压电流都可以配置。其接口速率可以达到几百M甚至上千M。使用lvds来接收高速ADC产生的数据会很方便。像ISERDES&#xff0c;IDDR&#xff0c;IDELAY&#xff0…

LVDS接口和接口电路概述

1、LVDS接口概述 LVDS&#xff0c;即Low Voltage Differential Signaling&#xff0c;是一种低压差分信号技术接口。克服以TTL电平方式传输宽带高码率数据时功耗大、EMI电磁干扰大等缺点而研制的一种数字视频信号传输方式。LVDS输出接口利用非常低的电压摆幅&#xff08;约350m…

常见视频高速接口分析MIPI,LVDS,RGB,HDMI

文章目录 一、RGB接口二、LVDS接口三、MIPI接口四、HDMI接口 一、RGB接口 &#xff08;1&#xff09;接口定义 RGB颜色是工业界的一种颜色标准&#xff0c;是通过对红、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的&#xff0c;RGB即是代表红…

接口mipi和lvds的区别

原文&#xff1a;http://m.elecfans.com/article/578395.html MIPI &#xff08;Mobile Industry Processor Interface&#xff09; 是2003年由ARM&#xff0c; Nokia&#xff0c; ST &#xff0c;TI等公司成立的一个联盟&#xff0c;目的是把手机内部的接口如摄像头、显示屏接…

液晶屏接口LVDS接口与MIPI DSI接口区别

LVDS与MIPI DSI区别_那个苏轼回不来了丶的博客-CSDN博客_“mipi dsi接口与LVDS与MIPI DSI区别_那个苏轼回不来了丶的博客-CSDN博客_“mipi dsi接口与lvds接口区别LVDS与MIPI DSI区别_那个苏轼回不来了丶的博客-CSDN博客_“mipi dsi接口与 1、LVDS接口只用于传输视频数据&#x…

液晶屏接口-LVDS

LVDS是英文Low Voltage Differential Signaling的缩写&#xff0c;它是一种低压差分信号技术接口。采用LVDS接口&#xff0c;可以使得信号在差分PCB线或平衡电缆上以几百Mbps的速率传输&#xff0c;推荐的最高数据传输速率是655Mbps&#xff0c;而理论上可以达到1.923Gbps。 【…

LVDS高速接口测试

话不多说&#xff0c;直接测试 1. OUTPUT&#xff1a;LVDS_TX 2. SDR&#xff1a;代表着速率&#xff0c;测试选的SDR&#xff08;单速率&#xff09; 3. 8&#xff1a;串换因子&#xff0c;就是一对LVDS转化几bit的并行数据&#xff08;和后面的clk&#xff0c;clk_div有关系…