Min-Max(算法)归一化实例解析(内容由 AI 生成)

Min-Max归一化实例解析

Min-Max 归一化的简单理解是:
当前值 - 该维度的最小值) / 该维度的数值范围(最大值 - 最小值)
再简单理解,就是比例化,当前维度范围的比例化
Min-Max 归一化是数据预处理领域的标准算法,其核心价值是通过 “固定步骤 + 数学公式”
居然是一个算法。 “固定步骤 + 数学公式”

一、Min-Max归一化核心概念

Min-Max归一化(也称为离差标准化)是数据预处理中常用的线性归一化方法,其核心作用是将原始数据映射到指定的固定区间(最常用区间为[0,1],也可根据需求调整为[1,5]、[-1,1]等),消除不同特征间的量纲和尺度差异。

其核心公式为(以目标区间[0,1]为例):

Xnorm=X−XminXmax−XminX_{norm} = \frac{X - X_{min}}{X_{max} - X_{min}}Xnorm​=Xmax​−Xmin​X−Xmin​​

其中各参数含义:

  • X:原始数据样本的值
  • X:该特征维度下所有原始数据的最小值
  • X:该特征维度下所有原始数据的最大值
  • X:归一化后的数据值

若需映射到其他区间[a,b],公式可调整为:

Xnorm=a+(X−Xmin)×(b−a)Xmax−XminX_{norm} = a + \frac{(X - X_{min}) \times (b - a)}{X_{max} - X_{min}}Xnorm​=a+Xmax​−Xmin​(X−Xmin​)×(b−a)​

二、实际案例演算(映射到[0,1]区间)

案例背景:学生成绩标准化

某班级5名学生的数学成绩(满分150分)和语文成绩(满分120分)原始数据如下表,由于两科满分不同,尺度存在差异,需通过Min-Max归一化消除差异,便于后续综合评价。

学生编号数学成绩(原始)语文成绩(原始)
112096
29060
3150120
46048
510584

步骤1:计算各特征维度的最值

分别针对“数学成绩”和“语文成绩”两个维度,计算各自的最小值(X)和最大值(X):

  • 数学成绩维度:原始数据为[120,90,150,60,105]
    X = 60(学生4的成绩)
  • X = 150(学生3的成绩)
  • X-X = 150-60 = 90

语文成绩维度:原始数据为[96,60,120,48,84]
X = 48(学生4的成绩)

X = 120(学生3的成绩)

X-X = 120-48 = 72

步骤2:逐样本逐维度计算归一化值

以学生1为例,演示计算过程:

  • 数学成绩归一化:X=120,代入公式得 (120-60)/90 = 60/90 ≈ 0.67
  • 语文成绩归一化:X=96,代入公式得 (96-48)/72 = 48/72 ≈ 0.67

按此方法计算所有学生的归一化成绩,结果如下表:

学生编号数学成绩(归一化)语文成绩(归一化)综合成绩(两科均值)
1≈0.67≈0.670.67
2(90-60)/90≈0.33(60-48)/72≈0.170.25
3(150-60)/90=1.00(120-48)/72=1.001.00
4(60-60)/90=0.00(48-48)/72=0.000.00
5(105-60)/90≈0.50(84-48)/72≈0.500.50

步骤3:结果分析

归一化前,数学成绩的绝对分值普遍高于语文成绩(因满分更高),直接计算均值会偏向数学成绩;归一化后,两科成绩均处于[0,1]区间,尺度统一,综合成绩能更公平地反映学生的整体水平。

三、代码实现案例(Python+NumPy)

针对上述学生成绩数据,通过代码自动化实现Min-Max归一化,可快速处理大规模数据:

import numpy as np # 1. 准备原始数据(行:学生,列:数学、语文) raw_data = np.array([[120,96],[90,60],[150,120],[60,48],[105,84]])# 2. 定义Min-Max归一化函数(默认映射到[0,1])defmin_max_normalization(data, target_min=0, target_max=1):# 计算每列(每个特征)的最小值和最大值 data_min = data.min(axis=0)# 按列取最小,结果:[60, 48] data_max = data.max(axis=0)# 按列取最大,结果:[150, 120]# 避免分母为0(若某特征所有值相同) denominator = data_max - data_min denominator[denominator ==0]=1e-8# 替换为极小值# 应用归一化公式 normalized_data = target_min +(data - data_min)*(target_max - target_min)/ denominator return normalized_data, data_min, data_max # 3. 执行归一化 normalized_data, data_min, data_max = min_max_normalization(raw_data)# 4. 输出结果print("原始数据:")print(raw_data)print("\n归一化后数据([0,1]区间):")print(np.round(normalized_data,2))# 保留2位小数print("\n各特征最小值:", data_min)print("各特征最大值:", data_max)

代码运行结果:

 原始数据: [[120 96] [ 90 60] [150 120] [ 60 48] [105 84]] 归一化后数据([0,1]区间): [[0.67 0.67] [0.33 0.17] [1. 1. ] [0. 0. ] [0.5 0.5 ]] 各特征最小值: [60 48] 各特征最大值: [150 120] 

四、关键注意事项

  • 对异常值敏感:若数据中存在极端异常值(如某学生数学考0分),会导致X或X偏差极大,归一化结果失真。建议先处理异常值(如用中位数替换)再归一化。
  • 训练集与测试集一致性:建模时,需用训练集的X和X对测试集进行归一化,而非单独计算测试集的最值,避免数据泄露。
  • 分母为0处理:若某特征所有样本值相同(如所有学生语文都考80分),会导致分母为0,需在代码中添加容错处理(如替换为极小值)。
(注:文档部分内容可能由 AI 生成)

Read more

吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比

吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比

✨ 孤廖:个人主页 🎯 个人专栏:《C++:从代码到机器》 🎯 个人专栏:《Linux系统探幽:从入门到内核》 🎯 个人专栏:《算法磨剑:用C++思考的艺术》 折而不挠,中不为下 文章目录 * 正文: * 容器适配器 * STL标准库中stack和queue的底层结构 * deque的简单介绍(了解) * deque的缺陷 * 为什么选择deque作为stack和queue的底层默认容器 * stack的介绍和使用 * Satck的介绍 * Stack的使用 * stack的模拟实现 * queue的介绍和使用 * queue的介绍 * queue的使用 * queue的模拟实现 * priority_queue的介绍和使用 * priority_queue的介绍 * priority_queue的使用 * 在OJ中的使用 * priority_queue的模拟实现 * STL标准库中对于sta

By Ne0inhk
【C++:搜索二叉树】二叉搜索树从理论到实战完全解读:原理、两种场景下的实现

【C++:搜索二叉树】二叉搜索树从理论到实战完全解读:原理、两种场景下的实现

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: 目录 C++的两个参考文档 前言 1  ~>  理解二叉搜索树 1.1  二叉搜索树的概念 1.2  博主手记:核心特性 1.2.1  多元化的结构: 灵活的数据结构 1.2.2  天然的搜索优势:擅长搜索的数据结构 2  ~>  二叉搜索树性能分析 2.

By Ne0inhk
【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917

【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917

本文涉及知识点 C++贪心 反证法 决策包容性 C++DFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i + 1 。 树中每个节点都有一个值,用下标从 0 开始、长度为 n 的整数数组 cost 表示,其中 cost[i] 是第 i + 1 个节点的值。每次操作,你可以将树中 任意 节点的值

By Ne0inhk
C++socket网络编程——udp服务器

C++socket网络编程——udp服务器

目录 一.端口号 VS  PID 二.套接字编程的类型 三.socket编程接口 四.基于udp的服务端和客户端全部代码 客户端 服务端 五.解释与运行 一些细节: 六.总结 一.端口号 VS  PID pid已经能够标识一台主机上的一个唯一一个进程了,为什么还需要端口号? 1. 不是所有的进程都需要网络通信,但是所有的进程都需要都pid; 2. 系统和网络功能解耦。         另外,一个进程可以绑定多个端口,但一个端口只能被一个进程绑定。         系统内定的端口号【0,1023】一般都要有固定的应用层协议使用,如http:80,https:443。 二.套接字编程的类型 1. 域间套接字编程——同一个机器内 2. 原始套接字编程——网络工具 3. 网络套接字编程—

By Ne0inhk