首页 > 其他分享 >【机器学习:十七、多分类问题和Softmax函数】

【机器学习:十七、多分类问题和Softmax函数】

时间:2025-01-16 22:28:22浏览次数:3  
标签:十七 函数 分类 test train Softmax 类别

1. 多分类问题

1.1 多分类问题定义

多分类问题是指一个模型需要从多个类别中选择一个类别作为输出的任务。与二分类问题不同,多分类任务中类别的数量 n > 2 n > 2 n>2 。例如:

  • 图像分类:区分狗、猫和鸟等多个类别。
  • 语言模型:预测单词的类别。
  • 生物信息学:基因序列分类。

1.2 二元分类推广到多分类

多分类问题可以通过多个二分类器组合实现:

  1. 一对多(One-vs-All, OvA):为每个类别训练一个二分类器,将该类别视为正类,其他类别视为负类。
  2. 一对一(One-vs-One, OvO):对每一对类别训练一个二分类器。

然而,直接使用 Softmax 函数处理多分类问题更为高效。

1.3 聚类与多分类问题的区别

聚类是无监督学习任务,目标是根据数据特征将样本分组,而多分类是监督学习,需要通过已标注的数据训练模型。


2. 逻辑回归的推广:Softmax回归

2.1 Softmax函数定义

Softmax 是一种将输出值映射到概率分布的函数,公式为:

P ( y = i ∣ x ) = exp ⁡ ( z i ) ∑ j = 1 n exp ⁡ ( z j ) P(y = i | x) = \frac{\exp(z_i)}{\sum_{j=1}^n \exp(z_j)} P(y=i∣x)=∑j=1n​exp(zj​)exp(zi​)​

其中 z i z_i zi​ 表示类别 i i i 的分值,输出 P ( y = i ) P(y = i) P(y=i) 为属于类别 i i i 的概率。

2.2 Softmax的优点

  1. 输出的概率分布便于解释。
  2. 可用于多分类问题的优化,适配梯度下降。

3. Softmax函数的损失函数:稀疏分类交叉熵

在多分类问题中,常使用交叉熵作为损失函数,其公式为:

Loss = − ∑ i = 1 n y i log ⁡ ( y ^ i ) \text{Loss} = -\sum_{i=1}^n y_i \log(\hat{y}_i) Loss=−i=1∑n​yi​log(y^​i​)

  • y i y_i yi​ 表示真实标签(使用独热编码表示)。
  • y ^ i \hat{y}_i y^​i​ 是模型预测的概率。

稀疏交叉熵的特点

  1. 简化计算,仅需考虑真实类别的概率。
  2. 与 Softmax 函数完美结合,梯度更新效率高。

4. Softmax神经网络的代码实现

4.1 基本实现步骤

实现一个 Softmax 回归模型需要以下步骤:

  1. 数据预处理:对输入数据进行归一化和类别独热编码。
  2. 构建网络:包含一个全连接层和 Softmax 激活函数。
  3. 损失计算:使用交叉熵损失函数。
  4. 梯度更新:通过反向传播调整权重。

4.2 实例代码: 以下为基于 TensorFlow 的实现示例:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 数据准备
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28*28) / 255.0
x_test = x_test.reshape(-1, 28*28) / 255.0

# 标签独热编码
y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test = tf.keras.utils.to_categorical(y_test, num_classes=10)

# 构建模型
model = Sequential([
    Dense(128, activation='relu', input_shape=(28*28,)),
    Dense(10, activation='softmax')
])

# 编译和训练
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.1)

# 测试
loss, accuracy = model.evaluate(x_test, y_test)
print(f"Test Accuracy: {accuracy}")

5. 多标签分类与Softmax的比较

在多标签分类中,输出可能同时属于多个类别,使用 Sigmoid 激活函数 代替 Softmax:

  • 每个类别单独计算概率。
  • 损失函数使用二元交叉熵。

Softmax 更适合独占性类别(例如手写数字识别),而 Sigmoid 适合多标签任务(如情感分析)。


6. Softmax回归的优势与局限

优势

  1. 提供了概率分布,解释性强。
  2. 能有效解决多分类问题。

局限性

  1. 对于类别数量庞大的问题,计算开销较大。
  2. 容易受到类别分布不均衡的影响。

通过以上内容,可以对多分类问题及 Softmax 函数有全面理解,并结合实际代码进行实践应用。

标签:十七,函数,分类,test,train,Softmax,类别
From: https://blog.csdn.net/weixin_43086101/article/details/145101561

相关文章

  • 深入探索:函数栈帧的神秘世界及其背后原理
    文章目录什么是函数栈帧理解函数栈帧的作用函数栈帧的创建和销毁解析什么是栈?相关寄存器和汇编指令函数栈帧的创建和销毁过程准备环境函数栈帧的创建函数栈帧的销毁前言:在C语言中,函数是程序的基本单位,我们通过函数来实现特定的功能。然而,函数如何被调用、返回值如......
  • 生成函数
    生成函数浅讲感觉这是一个非常牛逼的东西,写了点自己的感悟,可能讲得不是很清楚。生成函数的定义就比较牛,将数列\(\{a_i\}\)写成一个函数\(A(x)=\sum{a_ix^i}\)的形式叫做普通生成函数。此处的\(x^i\)没有实际意义,只是一个占位符。对于生成函数来说,绝大数多项式的运算法则......
  • 使用QFuture和QFutureWatcher实现不阻塞界面的Async函数
    简述很多时候,在Qt里面需要运行一个耗时函数的时候,为了避免阻塞界面,需要放入非主线程去执行。实现这样处理的方法有好几种,例如:写一个继承自QThread类,实现run接口;写一个继承自QObject的类,添加槽函数执行任务,创建对象,移入一个QThread中进行调用;写一个QRunnable的子类,创建对象,添......
  • C++ 面向对象(构造 & 析构函数)
    二、构造&析构函数2.1构造和析构2.1.1功能构造函数功能构造函数在类实例化对象时用于完成对象成员的初始化,通常包括以下操作:   1.为成员变量分配内存空间   2.初始化成员变量   3.执行类似打开文件、分配资源等额外操作析构函数功能主要作用......
  • 插值函数和插值多项式
    目录插值函数插值多项式插值函数设函数y=f(x)f(x)f(x)在区间......
  • 函数间断点 | 可去间断点 / 第一类间断点 / 第二类间断点 / 狄利克雷函数和黎曼函数示
    注:机翻,未校。BasicDefinitionsandExamples基本定义与示例Definition5:Ifapointofdiscontinuitya∈Ea\inE......
  • rust学习十七.1、async和await
    本文对应相关书籍17.1章节。先言:async和多线程没有什么密切关系,当然也不是毫无关系!一、async在rust到底是什么async中文的意思是异步,在编程中指的是:执行一段代码,主线程可以在等待完成之前,先做其它事情。如果有写过前端代码,就明白这个东西。例如经典的jquery的ajax默认就是异步......
  • 莫比乌斯函数及其反演
    一些定义数论函数定义域为正整数的函数,一般分类如下:积性函数对于\(\forallx,y\inN,gcd(x,y)=1\),若\(f(x\cdoty)=f(x)\cdotf(y)\),则\(f\)是积性函数。完全积性函数对于\(\forallx,y\inN\),若\(f(x\cdoty)=f(x)\cdotf(y)\),则\(f\)是完全积性函数......
  • C++ open()和read()函数使用详解
    对于Framework工程师来说,必要C或者C++编程能力是必须的,像对设备节点的操作是最基本的操作,那么我们便会用到open和read函数。open()函数用于打开文件,而read()函数用于从打开的文件中读取数据。open()函数open()函数是C/C++标准库中的一个POSIX标准函数,用于打开一个文件并返回......
  • 数论函数及定理
    数论函数及定理积性函数附OIWiki链接。定义对于函数\(f(x)\),满足\(f(1)=1\)且\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)。则\(f(x)\)是积性函数。如果对所有\(a,b\)都成立,\(f(x)\)就是完全积性函数。例子欧拉函数\(\varphi(x)\)是积性函数。欧拉函数定义......