动手学机器学习逻辑斯谛回归+习题

逻辑斯谛函数下的线性模型

现需要用线性模型做分类问题,简单的阶跃函数在阈值处不可导,可导处导数均为0,性质不好

所以把0,1问题转化成P(y=0|x),P(y=1|x)的问题,这样就把离散的分类任务变成了求概率分布的回归任务,概率分布要求在(0,1)之间,且需要光滑连续的曲线才会有较好的梯度,所以定义逻辑斯谛函数

 

最大似然估计

对于有关概率分布的问题,我们常常使用最大似然估计(maximum likelihood estimation,MLE)的思想来优化模型,也即是寻找逻辑斯谛回归的参数使得模型在训练数据上预测出正确标签的概率最大。

对应梯度下降算法的矩阵形式为

再加入L2正则化

扩展到多分类上:

疑惑:sigmoid与softmax
sigmoid也是将x压缩到0~1之间,和softmax的区别在哪呢?

(1)在实际应用中,一般将softmax用于多类分类的使用之中,而将sigmoid用于多标签分类之中。sigmoid函数,我们可以当作成它是对一个类别的“建模”,将该类别建模完成,另一个相对的类别就直接通过1减去得到。而softmax函数,是对两个类别建模,同样的,得到两个类别的概率之和是1

(2)softmax求出的概率不是相互独立,而是有关的。而sigmoid求出的概率之间互不影响,只和Xi大小有关。

(3)虽然都将输出激活到0-1,但softmax更离散,sigmoid更加均衡。在网络学习不到东西时,softmax通常会全部学习到一个类别上,全1。而sigmoid一般导致所有预测都是0.5。

分类问题的评价指标

正负类对目标的影响程度是不一样的,有的时候不容许犯错,有的时候宁可判对

需要混淆矩阵来充当评价指标

真阳性率(true positive rate,TPR),也称查全率或召回率(recall):

假阳性率(false positive rate,FPR):

查准率(precision):

F1 分数(F1 score),定义为精确率和召回率的调和平均值:

ROC曲线:

我们希望 ROC 曲线能尽可能偏向左上方,即所有的正样本都归为正类,所有的负样本都归为负类

AUC:ROC曲线与x轴和直线x=1围成面积,也就是图中的蓝色部分;AUC越大表示效果越好;AUC 的值事实上与阈值是的选取无关的,只与模型本身对正负类的预测结果有关。

动手实现逻辑斯谛回归

pos_index = np.where(y_total == 1)
neg_index = np.where(y_total == 0)
plt.scatter(x_total[pos_index, 0], x_total[pos_index, 1], 
    marker='o', color='coral', s=10)
plt.scatter(x_total[neg_index, 0], x_total[neg_index, 1], 
    marker='x', color='blue', s=10)

np.where提取符合要求的行的索引

x_total[pos_index, 0]是提取y为1的行的第一列数据,即点的x坐标;x_total[pos_index, 1]是点的y坐标

def acc(y_true, y_pred):
    return np.mean(y_true == y_pred)

def auc(y_true, y_pred):
    # 按预测值从大到小排序,越靠前的样本预测正类概率越大
    idx = np.argsort(y_pred)[::-1]
    y_true = y_true[idx]
    y_pred = y_pred[idx]
    # 把y_pred中不重复的值当作阈值,依次计算FP样本和TP样本数量
    # 由于两个数组已经排序且位置对应,直接从前向后累加即可
    tp = np.cumsum(y_true)
    fp = np.cumsum(1 - y_true)
    tpr = tp / tp[-1]
    fpr = fp / fp[-1]
    # 依次枚举FPR,计算曲线下的面积
    # 方便起见,给FPR和TPR最开始添加(0,0)
    s = 0.0
    tpr = np.concatenate([[0], tpr])
    fpr = np.concatenate([[0], fpr])
    for i in range(1, len(fpr)):
        s += (fpr[i] - fpr[i - 1]) * tpr[i]
    return s

排序是因为预测概率越大,超过阈值就是正例

np.cumsum() 函数,它会计算数组元素的累积和

tpr = tp / tp[-1]fpr = fp / fp[-1]: 计算真正例率和假正例率,即ROC曲线上的纵坐标和横坐标。除以它们的最大值,以得到标准化后的值,也就是缩放到0~1

tpr = np.concatenate([[0], tpr]),fpr = np.concatenate([[0], fpr])增加(0,0)点

# 定义梯度下降迭代的次数,学习率,以及L2正则系数
num_steps = 250
learning_rate = 0.002
l2_coef = 1.0
np.random.seed(0)

# 在x矩阵上拼接1
X = np.concatenate([x_train, np.ones((x_train.shape[0], 1))], axis=1)
X_test = np.concatenate([x_test, np.ones((x_test.shape[0], 1))], axis=1)

theta, train_losses, test_losses, train_acc, test_acc, \
    train_auc, test_auc = GD(num_steps, learning_rate, l2_coef)

# 计算测试集上的预测准确率
y_pred = np.where(logistic(X_test @ theta) >= 0.5, 1, 0)
final_acc = acc(y_test, y_pred)
print('预测准确率:', final_acc)
print('回归系数:', theta)

拼接1是弄个偏置出来

y_pred = np.where(logistic(X_test @ theta) >= 0.5, 1, 0)预测大于阈值0.5就是正例

画图部分中:

plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))用于设置当前图形的x轴主刻度定位器为整数定位器(MaxNLocator),它会自动选择主要刻度以显示整数。在这种情况下,我们使用integer=True参数告诉Matplotlib只显示整数刻度

交叉熵与最大似然估计

如果该分布中有某个事件发生的概率很大,预测的难度就较低;反过来,如果各个事件发生的概率都很接近,那么就很难预测到底哪一个事件会发生,也就是分布的不确定性更大。

在信息论中把这种东西叫作信息熵,越无规律信息熵越大,包含的信息越多

KL散度:比较两个分布之间的差异;始终是非负的;比值越接近0表示两个分布越相似

进一步拆分KL散度:

H(p,q)称为分布p与q的交叉熵,-H(p)只与样本的真实类别有关,因此我们只需要最小化交叉熵

对所有样本的交叉熵求和,就得到总的交叉熵为:

发现恰好等于负的对数似然函数,也就是逻辑回归问题中最大化对数似然函数与最小化交叉熵是等价的

习题

1.B。始终是对着取了对数的目标函数优化

2.CD。在设计损失函数时确实可以采用交叉熵损失,但是不是每一类的损失相乘,而是各分类的负对数似然之和;softmax不可以作为损失函数,逻辑回归函数≠sigmoid函数

3.B。准确率(Accuracy)是指分类正确的样本(包括正类和负类)占全体样本的比例

4.逻辑斯谛回归尽管在输出层使用了非线性的Sigmoid函数,但在决定模型预测结果的决策边界方面,它基于输入特征的线性组合。

5.交换正负标签

6.

先将数据按照预测概率从高到低排序

import numpy as np
import matplotlib.pyplot as plt

# 预测概率
probabilities = np.array([0.74, 0.71, 0.52, 0.48, 0.45, 0.34, 0.21, 0.15])
# 对应的标签
labels = np.array([1, 1, 1, 1, 0, 1, 0, 0])

# 按照预测概率从高到低排序
indices = np.argsort(probabilities)[::-1]
sorted_labels = labels[indices]

# 计算真阳性率(TPR)和假阳性率(FPR)
tpr = np.cumsum(sorted_labels) / np.sum(sorted_labels)
fpr = np.cumsum(1 - sorted_labels) / np.sum(1 - sorted_labels)

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='blue', lw=2, label='ROC curve')
plt.plot([0, 1], [0, 1], color='gray', linestyle='--', lw=2, label='Random guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid(True)
plt.show()

# 计算AUC值
auc = np.trapz(tpr, fpr)
print("AUC值为:", auc)

7.

8.z1=0时

求和仍为1;k=2时变成sigmoid

9.

(1)求导

(2)i,j 是指样本 i 的真实标签表示为一个长度为 K 的向量 yi​,其中只有第 j 个元素为 1,其余元素均为 0

MLE:

交叉熵:

(3)略

10.KL散度非负性必须要证明log(q/p)是关于x的上凸函数,然后利用Jensen不等式

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

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

相关文章

ROS传感器图像转换

ros通过摄像头来获得图片,传感器数据类型为sensor_msgs中的Image,具体的数据类型组成: sensor_msgs/Image Documentationhttp://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html但是我们一般使用opencv对图像进行处理,所以…

Python字符串字母大小写变换,高级Python开发技术

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ‘’’ demo ‘tHis iS a GOod boOK.’ print(demo.casefold()) print(demo.lower()) print(demo.upper()) print(demo.capitalize()) print(demo.title()) print(dem…

Python字典操作

假设我们有一个学生信息数据库,其中存储了每个学生的姓名、年龄、性别和成绩。我们可以使用字典来表示每个学生的信息,并将所有学生存储在一个字典列表中。 设计者:ISDF 版本:v1.0 日期:03/29/2024# 定义学生信息字典列…

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语,用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集(Training Set):训练集是用于训练机器学习模型的数据集。在训练期间,模型使用训练集中…

小狐狸ChatGPT付费AI创作系统V2.8.0独立版 + H5端 + 小程序前端

狐狸GPT付费体验系统的开发基于国外很火的ChatGPT,这是一种基于人工智能技术的问答系统,可以实现智能回答用户提出的问题。相比传统的问答系统,ChatGPT可以更加准确地理解用户的意图,提供更加精准的答案。同时,小狐狸G…

图形推理 总结

原则 1.图形相似且元素基本不变:此时多考虑图形的位置移动规律,如平移、旋转、翻转等。 2.图形相似但元素有同有异:这种情况下常考组合叠加-去异存同、去同存异等;元素遍历;部分传递等。 3.图形相异但较规则:常考对称、直曲性、…

JDK8的下载安装与环境变量配置教程

前言 官网下载:Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧,直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…

神经网络与深度学习(一)

线性回归 定义 利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法 要素 训练集(训练数据)输出数据拟合函数数据条目数 场景 预测价格(房屋、股票等)、预测住院时间&#…

深入探讨Docker in Docker:原理与实战指南

在软件开发和部署中,容器化技术已经成为一个不可或缺的工具。而在使用Docker进行容器化时,有时可能会遇到需要在一个Docker容器中运行另一个Docker容器的情况,这就是所谓的"Docker in Docker"(简称DinD)。本…

java数组与集合框架(二)-- 集合框架,Iterator迭代器,list

集合框架: 用于存储数据的容器。 Java 集合框架概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而…

Redis从入门到精通(一)Redis安装与启动、Redis客户端的使用

文章目录 写在最前第1章 Redis概述1.1 初识Redis1.1.1 NoSQL1.1.2 Redis的特点与优势 1.2 安装Redis1.2.1 安装依赖库1.2.2 安装Redis1.2.3 启动Redis1.2.3.1 默认启动1.2.3.2 指定配置启动1.2.3.3 开机自启 1.3 Redis客户端1.3.1 命令行客户端1.3.2 图形化桌面客户端1.3.3 编程…

RVM安装Ruby笔记(Mac)

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…

Mysql or与in的区别

创建一个表格 内涵一千万条数据 这张表中,只有id有建立索引,且其余都没有 测试1:使用or的情况下,根据主键进行查询 可以看到根据主键id进行or查询 花费了30-114毫秒,后面30多毫秒可能是因为Mysql的Buffer Pool缓冲池的…

图论做题笔记:dfs

Leetcode - 797:所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节…

深入理解数据结构(1):复杂度详解

文章主题:复杂度详解🌱所属专栏:深入理解数据结构📘作者简介:更新有关深入理解数据结构知识的博主一枚,记录分享自己对数据结构的深入解读。😄个人主页:[₽]的个人主页🔥…

Intellij IDEA / Android studio 可持续开发笔记

Intellij 的Java/安卓工具链有着一种不可持续性,这种不可持续性体现在多个方面。 首先是不可持续运行。IDEA 使用时间越长,内存占用越大,从不主动释放。运行时间越长,日志越多,从不主动清理。 然后是不完整的开源&am…

java多线程——概述,创建方式及常用方法

前言: 学习到多线程了,整理下笔记,daydayup!!! 多线程 什么是线程 线程(Thread)是一个程序内部的一条执行流程。若程序只有一条执行流程,那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

预处理详解(二)-- 条件编译 - 头文件包含 - ##和#运算符

目录 一.##和#运算符1.#运算符(字符串化)2.##运算符(粘合符) 二.条件编译(很重要)三.命名约定1.宏名的命名2.函数的命名 四.#undef(用于移除一个宏定义)五.命名行约定六.头文件被包含的方式1.本地文件包含2…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测) 单变量时间序列单步预测。 ELM(Extreme Learning Machine,极限学习机)和AdaBoost(Adaptive Boosting,自适应提升)都是机…

Disruptor

前言 大家好,我是jiantaoyab,这是我作为学习笔记总结应用篇最后一篇,本章大量的参考了别的博主的文章。 我们今天一起来看一个开源项目 Disruptor。看看我们怎么利用 CPU 和高速缓存的硬件特性,来设计一个对于性能有极限追求的系…