逻辑回归原理及代码

逻辑回归原理

线性回归主要用于预测连续的数值输出,基于线性关系模型,其目标是最小化实际值和预测值之间的差异。
逻辑回归主要用于分类问题,尤其是二元分类,它预测属于某一类别的概率,并基于概率输出进行决策,使用的是逻辑(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.mfbz.cn/a/241167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这两个管理方法 在现货白银顺势交易中会用得上

我们常说,在现货白银交易中做顺势交易,那盈利的概率会高一些。但是这并不是说做顺势交易就肯定盈利,其实顺势交易也需要投资者去进行管理的,不要以为顺势交易入场之后就万事大吉了。那投资者该如何管理呢?下面我们就来…

桌面便签软件哪个好用?可以放在桌面上的便签软件使用哪个

在现代快节奏的生活中,我们时常感到生活与工作的节奏难以协调。繁琐的工作日程与待办任务繁杂交织,往往让我们束手无策,无法高效地进行协调与分配。 桌面便签工具成为了我们处理这些挑战的得力助手。它不仅能够随时提醒我们完成任务&#xf…

Leetcode—530.二叉搜索树的最小绝对差【简单】

2023每日刷题(五十八) Leetcode—530.二叉搜索树的最小绝对差 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ void dfs(struct TreeNode* roo…

UI设计中的肌理插画是什么样的?

肌理插画本质也和扁平插画差不多,相较扁平插画,肌理插画的层次感、细节更多,也会更立体生动。 肌理插画风格没有描边线,画面轻快,通过色块的明暗来区分每个元素,有点像色彩版的素描,但更简单&a…

6大最佳目标进度管理软件盘点——团队/个人

在当今快节奏的生活和工作中,有效地管理目标和任务对于每个人来说都至关重要。在工作中,我们需要清晰地规划项目目标、安排任务和追踪进度;在生活中,我们也需要合理安排时间、记录重要事项以及追踪个人目标的实现进度。为了更好地…

张雪峰推荐2023未来专业哪个就业前景好

张雪峰推荐未来比较好的专业有:计算机专业、金融专业、法学专业等。这些专业的专业性很强,学完后也容易找工作,就业前景很不错,薪资普遍高于其它行业。 2023年张雪峰推荐未来的专业有哪些? 1、人工智能专业…

运筹学经典问题(四):多商品网络流问题

问题描述 多商品网络流问题(Multicommodity Network Flow, MCNF)是指在一个图网络中,多个商品从各自起点运输到各自终点的问题。 更具体的,给定一个图网络 G ( V , A ) G(V, A) G(V,A): K K K:表示商品的…

SpringGateway网关

SpringGateway SpringGateway网关奈非框架简介什么是网关Spring Gateway简介为什么选择 GatewayGateway 的特性Gateway 与 Zuul 的区别 Gateway 的三大核心概念Route (路由)Predicate (断言)Filter (过滤)总结 Gateway 的工作流程简单网关演示网关多路由配置Gateway配置路由的两…

MySQL之创建表

创建emp表 #创建表的练习 -- 字段 属性 -- Id 整形 -- name 字符型 -- sex 字符型 -- birthday 日期型 -- entry_date 日期型 -- job 字符型 -- Salary 小数型 -- resume 文本型 CREATE TABLE emp(id INT,name VARCHAR(32),sex CHAR(1),birthday DATE,entry_date DAT…

python 使用linux find命令引导用户定位和选择文档

字多不看板(InsCode) 演示代码 # -*- coding:UTF-8 -*-# region import DebugInfo from DebugInfo.DebugInfo import *# endregion 画板 打印模板()# localSearch posix搜索接口类() localSearch 本地搜索接口类()用户选择 交互接口类.指定选择文档(…

羊大师,从对问题的认知到寻找答案

作为一个处于快速变化的世界中的个体,我们每天都要面对各种各样的问题。有些问题可能很小,可以迅速解决,而其他问题可能需要更多的时间和精力来应对。不管问题的大小,我们都希望能找到合适的解决方案,以便能够继续前进…

UI设计中的2.5D插画是什么?

2.5d插画,你可能第一时间会想2D应该是平面的,3D是立体的,介于2D和3D之间,那么它就是在平面上面看立体的2.5D透视原理图像,就是物体的正面、光面和暗面三面组成,也算是伪3D。 首先,设计师需要设…

【算法题】智能成绩表(js)

总分相同按名字字典顺序。 解法: function solution(lines) {const [personNum, subjectNum] lines[0].split(" ").map((item) > parseInt(item));const subjects lines[1].split(" ");const classMates [];let results [];for (let i…

数字社会观察:TikTok如何影响青少年文化?

TikTok,这个全球短视频巨头,正在成为塑造青少年文化的引领者。在这个数字社会中,TikTok的崛起不仅改变了信息传递的方式,更深刻地影响着青少年的价值观、审美观和社交方式。本文将深入探讨TikTok如何在数字社会中塑造和影响青少年…

Flutter工具安装与环境搭建

1、下载 Flutter SDK,下载完成后,在需要放置SDK的地方解压即可。 注意: 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。 2、配置环境变量 例如: …

RFID复习内容整理

第一章 日常生活中的RFID技术 身份证(高频) typeB13.56MHz 一卡通(高频) ISO/IEC 14443 typeA 图书馆门禁停车场门票ETC 微波段、超高频 服装快销品牌 物联网定义 最初的定义 将各种信息传感设备,如射频识别(RFID)…

富集分析后得到很多term,选谁为研究方向:直播分享不同大语言模型的回答(Claude、ChatGPT3.5、Gemini)

大家好,今天生信小博士再来聊一聊:如何选择富集分析的term进行下一步研究。如果你不想看文字,可以本周日晚八点十分来我视频号直播间一起聊聊,到时会有代码实战与经验分享。欢迎预约~ 我用同样的问题,问了不同的大预言…

1、Redis变慢原因排查(上)

感觉Redis变慢了,这些可能的原因你查了没 ?(上) Redis 作为一款业内使用率最高的内存数据库,其拥有非常高的性能,单节点的QPS压测能达到18万以上。但也正因此如此,当应用访问 Redis 时,如果发现响应延迟变…

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

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

数字基础设施及相关产业链报告:数据要素加快推进、AI终端应用加速发展

今天分享的AI系列深度研究报告:《数字基础设施及相关产业链报告:数据要素加快推进、AI终端应用加速发展》。 (报告出品方:长城证券) 报告共计:16页 1. 行业观点 在 TMT 各子板块:电子、通信、…
最新文章