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

article/2025/9/12 5:15:55

目录

一、什么是Logistics回归

二、sigmoid函数

三、梯度上升法

四、代码实现

数据导入

 决策边界

 梯度上升

 五、总结


一、什么是Logistics回归

logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。

logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。

二、sigmoid函数

使用逻辑回归进行分类,就是要找到绿色这样的分界线,使其能够尽可能地对样本进行正确分类,也就是能够尽可能地将两种样本分隔开来。因此我们可以构造这样一个函数,来对样本集进行分隔:

其中 i=1,2,...m,表示第 i个样本, n 表示特征数,当 z(x^{(i)})>0 时,对应着样本点位于分界线上方,可将其分为"1"类;当  z(x^{(i)})<0 时 ,样本点位于分界线下方,将其分为“0”类。

 

逻辑回归作为分类算法,它的输出是0/1。那么如何将输出值转换成0/1呢?

这就需要一个新的函数——sigmoid 函数

sigmoid 函数:

函数图像为:

img

三、梯度上升法

梯度上升法基于的思想是:要找到某函数的 最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为∇,则函数f(x,y)的梯度由 下式表示:

这个梯度意味着要沿x的方向移动 ,沿y的方向移动 。其中,函数f(x,y) 必须要在待计算的点上有定义并且可微。如下图:

        如图,梯度上升算法到达每个点后都会重新估计移动的方向。从P0开始,计算完该点的梯度,函数就根据梯度移动到下一点P1。在P1点,梯度再次被重新计算,并沿新的梯度方向移动到P2。如此循环迭代,直到满足停止条件。迭代的过程中,梯度算子总是保证我们能选取到最佳的移动方向。

        梯度上升算法沿梯度方向移动了一步。可以看到,梯度算子总是指向函数值增长最快的方向。这里所说的是移动方向,而未提到移动量的大小。该量值称为步长,记做α。用向 量来表示的话,梯度上升算法的迭代公式如下:

        该公式将一直被迭代执行,直至达到某个停止条件为止,比如迭代次数达到某个指定值或算 法达到某个可以允许的误差范围。

四、代码实现

数据导入

# 加载数据集
def loadDataSet():dataMat = []                                                      # 数据列表labelMat = []                                                     # 标签列表fr = open('testSet.txt')                                          # 打开文件for line in fr.readlines():                                       # 遍历每行,读取数据lineArr = line.strip().split()                                # 去除回车符dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])   # 把此行的数据添加到数据列表里面labelMat.append(int(lineArr[2]))                              # 添加标签进列表return dataMat, labelMat
# 绘制数据集
def showData():dataMat, labelMat = loadDataSet()                      # 加载数据集,标签dataArr = array(dataMat)                               # 转换成umPy的数组n = shape(dataArr)[0]                                  # 获取数据总数xcord1 = []; ycord1 = []                               # 存放正样本xcord2 = []; ycord2 = []                               # 存放负样本for i in range(n):                                     # 依据数据集的标签来对数据进行分类if int(labelMat[i]) == 1:                          # 数据的标签为1,表示为正样本xcord1.append(dataArr[i, 1]); ycord1.append(dataArr[i, 2])else:                                              # 否则,若数据的标签不为1,表示为负样本xcord2.append(dataArr[i, 1]); ycord2.append(dataArr[i, 2])fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcord1, ycord1, s=15, c='blue')             # 绘制正样本ax.scatter(xcord2, ycord2, s=15, c='red', marker='s')  # 绘制负样本plt.title('DateSet')                                   # 标题plt.xlabel('X1'); plt.ylabel('X2')                     # x,y轴的标签plt.show()

决策边界

# sigmoid函数
def sigmoid(inX):return 1.0 / (1 + exp(-inX))
# 梯度上升算法
def gradAscent(dataMatIn, classLabels):                            # dataMatIn数据集、classLabels数据标签dataMatrix = mat(dataMatIn)                                    # 转换为NumPy矩阵labelMat = mat(classLabels).transpose()                        # 转换为NumPy矩阵,并且矩阵转置m, n = shape(dataMatrix)                                       # 获取数据集矩阵的大小,m为行数,n为列数alpha = 0.001                                                  # 目标移动的步长maxCycles = 500                                                # 迭代次数weights = ones((n, 1))                                         # 权重初始化为1for k in range(maxCycles):                                     # 重复矩阵运算h = sigmoid(dataMatrix * weights)                          # 矩阵相乘,计算sigmoid函数error = (labelMat - h)                                     # 计算误差weights = weights + alpha * dataMatrix.transpose() * error # 矩阵相乘,更新权重return weights
# 获得回归系数
dataMat, labelMat = loadDataSet()
weigths = gradAscent(dataMat, labelMat)
print("w0: %f, w1: %f, W2: %f" % (weigths[0], weigths[1], weigths[2]))
# 绘制数据集和Logistic回归最佳拟合直线
def plotBestFit(weights):dataMat, labelMat = loadDataSet()                      # 加载数据集,标签dataArr = array(dataMat)                               # 转换成umPy的数组n = shape(dataArr)[0]                                  # 获取数据总数xcord1 = []; ycord1 = []                               # 存放正样本xcord2 = []; ycord2 = []                               # 存放负样本for i in range(n):                                     # 依据数据集的标签来对数据进行分类if int(labelMat[i]) == 1:                          # 数据的标签为1,表示为正样本xcord1.append(dataArr[i, 1]); ycord1.append(dataArr[i, 2])else:                                              # 否则,若数据的标签不为1,表示为负样本xcord2.append(dataArr[i, 1]); ycord2.append(dataArr[i, 2])fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')  # 绘制正样本ax.scatter(xcord2, ycord2, s=30, c='green')            # 绘制负样本x = arange(-3.0, 3.0, 0.1)                             # x区间y = (-weights[0] - weights[1] * x) / weights[2]        # 最佳拟合直线ax.plot(x, y)plt.title('BestFit')                                   # 标题plt.xlabel('X1'); plt.ylabel('X2')                     # x,y轴的标签plt.show()
# 运行画出图
dataMat, labelMat = loadDataSet()
weigths = gradAscent(dataMat, labelMat)
plotBestFit(weigths.getA())
print("w0: %f, w1: %f, W2: %f" % (weigths[0], weigths[1], weigths[2]))

在这里插入图片描述

梯度上升

#随机梯度上升算法
def stocGradAscent0(dataMatrix,classLabels):m,n = np.shape(dataMatrix)alpha = 0.1weights = np.ones(n)for i in range(m):h = sigmoid(sum(dataMatrix[i]*weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i]return weightsdataArr,labelMat = loadDataSet()weights = stocGradAscent0(array(dataArr),labelMat)
plotBestFit(weights)

在这里插入图片描述

 随机梯度上升算法在上述数据集上的执行结果,最佳拟合直线并非最佳分类线,可以看出拟合曲线出现了很大的偏差。所以我们对随机梯度上升算法进行改进:

#改进的随机梯度上升算法
def stocGradAscent1(dataMatrix,classLabels,numIter=150):m,n = np.shape(dataMatrix)weights = np.ones(n)for j in range(numIter):dataIndex = list(range(m))for i in range(m):alpha = 4/(1.0+j+i)+0.01randIndex = int(random.uniform(0,len(dataIndex)))h = sigmoid(sum(dataMatrix[randIndex]*weights))error = classLabels[randIndex] - hweights = weights + alpha * error * dataMatrix[randIndex]del(dataIndex[randIndex])return weightsdataArr,labelMat = loadDataSet()
weights = stocGradAscent1(array(dataArr),labelMat)
plotBestFit(weights)

在这里插入图片描述


http://chatgpt.dhexx.cn/article/4KFaks1P.shtml

相关文章

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

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

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

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

【printf函数的具体用法】

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

C语言printf函数详解

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

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有关系…

MIPI、LVDS、RGB、HDMI等接口对比

液晶屏有RGB TTL、LVDS、MIPI、HDMI接口&#xff0c;这些接口区别于信号的类型&#xff08;种类&#xff09;&#xff0c;也区别于信号内容。 具体RGB TTL接口信号类型是TTL电平&#xff0c;信号的内容是RGB666或者RGB888还有行场同步和时钟&#xff1b; LVDS接口信号类型是LVD…