逻辑回归原理及代码

news2024/11/24 5:24:54

逻辑回归原理

线性回归主要用于预测连续的数值输出,基于线性关系模型,其目标是最小化实际值和预测值之间的差异。
逻辑回归主要用于分类问题,尤其是二元分类,它预测属于某一类别的概率,并基于概率输出进行决策,使用的是逻辑(Sigmoid)函数将线性模型的输出转换为概率值。简单说就是:找到一组参数,使得模型对分类结果的预测概率最大化。

举个例子:在预测银行贷款这件事上,线性回归可以帮你预测银行能发放的贷款额度是多少,逻辑回归则是尽可能准确地预测银行能否发放贷款(要么0,要么1)。

在线性回归中,我们着力于在U型曲线里找到局部最低点,以最小损失形成模型去预测结果。而在逻辑回归中,我们着力于最大化似然函数,这通常意味着找到一组参数,使得给定数据集中观测到的分类结果出现的概率最大。这个过程可以视为通过调整模型参数来提高正确分类的概率,从而在概率空间中寻找最优解。简单说:在逻辑回归中,我们致力于找到参数设置,使得模型对数据进行正确分类的可能性最大化。

对于最简单的逻辑回归,我们可以通过Sigmoid函数表示为下图,当预测值>0.5的时候预测结果为1。
Sigmoid函数
在线性回归中,我们使用特征的加权和: z = β 0 + β 1 x 1 + β 2 x 2 + . . . + β n x n z = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n z=β0+β1x1+β2x2+...+βnxn来代表最终预期得到的函数,而在逻辑回归中,要得到如上图的Sigmoid函数,我们就要使用 σ ( z ) = 1 1 + e − ( β 0 + β 1 x 1 + β 2 x 2 + . . . + β n x n ) \sigma(z) = \frac{1}{1 + e^{-(\beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n)}} σ(z)=1+e(β0+β1x1+β2x2+...+βnxn)1缩写为: σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1其中, e e e是自然对数的底数,约等于2.71828。因此Sigmoid函数的输出值始终位于0和1之间。这个特性使得Sigmoid函数非常适合用于将任意实数值映射为概率。

Sigmoid函数是一个非线性函数。这意味着使用Sigmoid函数可以帮助模型学习非线性关系,这是线性模型所做不到的。

如下图,逻辑回归需要计算出一个函数,来区分该值等于1的概率
在这里插入图片描述
有可能最终的结果就类似于下面的绿线范围,范围内的为1,外的为0
在这里插入图片描述
在逻辑回归中的似然函数用来评估模型参数 θ \theta θ的效果: L ( θ ) = ∏ i = 1 n p ( y ( i ) ∣ x ( i ) ; θ ) L(\theta) = \prod_{i=1}^{n} p(y^{(i)}|x^{(i)};\theta) L(θ)=i=1np(y(i)x(i);θ) 它是给定参数 θ \theta θ下,产生观察到的数据集的概率。似然函数的目标是找到最佳的参数集 θ \theta θ,使得观测到的数据出现的概率最大。
在逻辑回归中,这个概率 p ( y ∣ x ; θ ) p(y|x;\theta) p(yx;θ)就是由Sigmoid函数计算出来的。

简单来说,Sigmoid函数提供了一种机制来预测事件发生的概率,而似然函数则用这些概率来评估模型参数的好坏。在训练过程中,我们通过调整参数 θ \theta θ最大化似然函数(梯度上升),寻找能够最好地解释观测数据的模型参数。

所以从核心方法上来说,无论是线性回归还是逻辑回归都是在找到一组参数使得某个目标函数达到最优。

逻辑回归代码

逻辑回归示例代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as opt

# 导入数据并添加列名
data = pd.read_csv('ex2data1.txt', header=None, names=['Exam 1', 'Exam 2', 'Admitted'])

# 绘制散点图
def plot_data(data):
    positive = data[data['Admitted'] == 1]
    negative = data[data['Admitted'] == 0]

    plt.figure(figsize=(12,8))
    plt.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
    plt.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')
    plt.legend()
    plt.xlabel('Exam 1 Score')
    plt.ylabel('Exam 2 Score')
    plt.show()

plot_data(data)

# 定义sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 定义代价函数
def cost(theta, X, y):
    theta = np.matrix(theta)
    first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
    second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
    return np.sum(first - second) / len(X)

# 定义梯度函数
def gradient(theta, X, y):
    theta = np.matrix(theta)
    error = sigmoid(X * theta.T) - y
    return ((X.T * error) / len(X)).T

# 数据预处理
data.insert(0, 'Ones', 1)
X = data.iloc[:, :-1].values
y = data.iloc[:, -1:].values
theta = np.zeros(X.shape[1])

# 使用优化函数找到最优参数
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))

# 定义预测函数
def predict(theta, X):
    probability = sigmoid(np.dot(X, theta))
    return [1 if x >= 0.5 else 0 for x in probability]

# 计算准确率
theta_min = np.array(result[0])
predictions = predict(theta_min, X)
correct = [1 if a == b else 0 for (a, b) in zip(predictions, y.flatten())]
accuracy = sum(correct) / len(correct)
print('Accuracy = {}%'.format(accuracy * 100))

"""
绘制决策边界
"""
def plot_decision_boundary(data, theta):
    # 绘制原始数据的散点图
    positive = data[data['Admitted'].isin([1])]
    negative = data[data['Admitted'].isin([0])]

    plt.figure(figsize=(12,8))
    plt.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
    plt.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')

    # 添加决策边界
    x_value = np.array([np.min(X[:,1]), np.max(X[:,1])])
    y_value = -(theta[0] + theta[1]*x_value) / theta[2]
    plt.plot(x_value, y_value, 'g', label='Decision Boundary')

    plt.xlabel('Exam 1 Score')
    plt.ylabel('Exam 2 Score')
    plt.legend()
    plt.show()

# 使用最优化的theta绘制决策边界
plot_decision_boundary(data, result[0])

输出后的结果:

NIT(迭代次数)NF(函数评估次数)F(代价函数的值)GTG(梯度的平方和)
016.931471805599453E-012.71082898E+02
136.318123602631673E-017.89087138E-01
255.892425284546917E-017.39225968E+01
374.227824467516530E-011.85266404E+01
494.072926898646252E-011.68671176E+01
5113.818855078923481E-011.07734992E+01
6133.786234920021553E-012.31584985E+01
7162.389267774352392E-013.00820981E+00
8182.047203844871719E-011.52224659E-01
9202.046713871134023E-016.62490915E-02
10222.035303175123319E-019.30774264E-04
11242.035293534076603E-018.07450037E-06
12262.035251130726250E-011.80180151E-04
13282.034984116011556E-015.02836428E-04
14302.034978388892823E-019.96725740E-06
15322.034977911359196E-013.79191989E-06
16342.034977391259835E-011.95701962E-05
17362.034977015894753E-012.30450436E-13

NIT:迭代次数,表示优化过程中总共执行了多少次迭代。
NF:函数评估次数,即目标函数(在这种情况下是代价函数)计算了多少次。
F:代价函数的值,即当前参数下的代价。
GTG:梯度的平方和,用于评估优化的进度和停止条件。

模型预测正确率Accuracy = 89.0%

基于本数据的决策边界图:
在这里插入图片描述

注:本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex2-logistic%20regression/ex2data1.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

壹家人温暖宁夏中卫,34个孩子收到壹基金温暖包

这个12月,2023年度壹基金温暖包在宁夏中卫的发放活动顺利开展,镇罗中学的4个孩子和山羊场小学28个孩子领到了这份温暖的冬日礼物,后续还有丰台村2个孩子也会领到这份冬天的礼物。 2023年壹基金温暖包共筹集温暖包34个,经过我们…

数字图像处理(实践篇)二十四 使用dlib实现人脸对齐

目录 1 安装依赖库 2 下载shape_predictor_68_face_landmarks.dat文件 3 人脸对齐方案 4 涉及的函数 5 实践 1 安装依赖库 使用如下命令即可安装dlib: pip install dlib 在使用

AMEYA360:海康存储PCIe4.0固态硬盘A4000介绍

海康存储即将发布PCIe4.0固态硬盘新品A4000,搭载全新定制主控及高品质3D NAND闪存颗粒,最大顺序读取速度达7100MB/s,提供五年质保服务。 2022年,海康存储开始在PCIe 4.0固态硬盘领域全面发力,推出C4000 ECO、C4000等多…

多元统计课程 --整理

第五週 Principal components_哔哩哔哩_bilibili (【多变量分析 Multivariate Analysis】台湾交通大学 - 黃冠華 教授) 厦门大学多元统计课程-哔哩哔哩视频 (bilibili.com) 杰大大大大大人的个人空间哔哩哔哩视频 (bilibili.com) 【b站数学视频-知乎】…

解决方案-复杂电磁环境适应性试验系统

复杂电磁环境适应性试验系统 简述: 复杂电磁环境适应性试验系统主要用于构建想定场景下的复杂电磁环境,为通信、导航等无线收发设备的设计、开发、试验提供先进的仿真与试验验证评估条件,提高设计建模、在线仿真、半实物仿真验证及评估能力&…

【计算机设计大赛】冬残奥会可视化系统_附源码—信息可视化赛道获奖项目深入剖析【可视化项目案例-19】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

慢SQL的治理经验

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、慢SQL导致的后果 二、可能导致慢SQL的原因 三、如何发现慢SQL 3.1 JVM Sandbox 四、识别高危SQL 4.1 阿里的重点强制SQL规…

多线程案例-定时器(附完整代码)

定时器是什么 定时器是软件开发中的一个重要组件.类似于一个"闹钟".达到一个设定的时间之后,就执行某个指定好的代码. 定时器是一种实际开发中非常常用的组件. 比如网络通信种,如果对方500ms内没有返回数据,则断开尝试重连. 比如一个Map,希望里面的某个key在3s之后过…

MySQL一行记录是怎么存储的?

文章目录 MySQL 一行记录是怎么存储的?MySQL 的数据存放在哪个文件?表空间文件结构 InnoDB行格式有哪些Compact行格式varchar(n) 中 n 最大取值为多少?行溢出后,MySQL是怎么处理的? MySQL 一行记录是怎么存储的&#x…

SpringBoot 这么实现动态数据源切换,就很丝滑!

最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态数据源SpringBoot的starter:dynamic-datasource-spring-boot-starter来实现。 结果引入后发现由于…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程(1)准备工作-脚本1)、准备工作-编写运行脚本文件2)、给权限3)、运行脚本 (2)进入q…

亚马逊测评如何安全有效地进行?完整攻略解读

亚马逊测评一直是许多亚马逊卖家快速了解市场、获得评论和提高销售的方法之一。与此同时,亚马逊官方对测评的控制也越来越严格。测评越来越困难,如果操作不当,可能会导致账户被禁等严重后果。 因此,如何安全有效地测评亚马逊已经成…

防职业掉坑必看,电商设计主要做什么?

今年双十一刚结束,各电商平台不公布总销售额的新闻就上了热搜。外行人乍一看可能觉得消费意愿下降,消费水平降级,电商行业不景气,但实际上电商领域在国内突飞猛进了10几年后,仍然还有很大的上升空间。很多人说&#xf…

解决高风险代码(含前后端):Insecure Randomness

Abstract 标准的伪随机数值生成器不能抵挡各种加密攻击 Explanation 在对安全性要求较高的环境中,使用能够生成可预测值的函数作为随机数据源,会产生 Insecure Randomness 错误。 电脑是一种具有确定性的机器,因此不可能产生真正的随机性。伪…

招不到人?用C语言采集系统批量采集简历

虽说现在大环境不太好,很多人面临着失业再就业风险,包括企业则面临着招人人,找对口专业难得问题。想要找到适合自己公司的人员,还要得通过爬虫获取筛选简历才能从茫茫人海中找到公司得力干将。废话不多说,直接开整。 1…

汽车底盘市场分析:预计到2025年平均渗透率达到35%

汽车底盘由传动系、行驶系、转向系和制动系四部分组成。底盘作用是支承、安装汽车发动机及其各部件、总成,形成汽车的整体造型,并接受发动机的动力,使汽车产生运动,保证正常行驶。汽车底盘容易产生故障的部位主要集中在&#xff1…

如何本地搭建WampServer并结合cpolar内网穿透实现远程访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…

聚观早报 |小鹏P7i推出限时福利;荣耀90 GT外观曝光

【聚观365】12月13日消息 小鹏P7i推出限时福利 荣耀90 GT外观曝光 小米14 Ultra春节后登场 苹果新一代iPad Air将搭载M2芯片 Rambus发布内存控制器IP 小鹏P7i推出限时福利 小鹏汽车将旗下智驾主力车型P7i全系车型开启限时购车优惠政策,用户下定小鹏P7i即可享受…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及,医疗行业的各个场景都要求支持医保码一码通办,在此分享一下,在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

【干货分享】KingIOServer与三菱PLC的通讯的应用案例

哈喽,大家好,我是雷工! 最近一个项目涉及用KingIOServer采集三菱PLC数据,特记录通讯过程方便备忘。 一、版本说明: 1、KingIOServer版本:3.7SP2 2、PLC型号:Q03UDV 和Q03UDE自带以太网网口。…