NumPy怎么实现矩阵归一化_减去min除以(max-min)Min-Max缩放法

夜雪君_1791

夜雪君_1791

2026-03-23

281人浏览

原创

NumPy中用np.min和np.max做Min-Max归一化需指定axis=0按列计算极值,用(x-min)/(max-min)公式,并用np.where避免除零;测试集必须复用训练集的min/max以保证一致性。

numpy怎么实现矩阵归一化_减去min除以(max-min)min-max缩放法

NumPy怎么用np.min和np.max做Min-Max归一化

直接用 np.min 和 np.max 计算每列(或每行)的极值,再套公式 (x - min) / (max - min) 即可。但要注意:如果某列所有值相等,max - min 会是 0,除零报错 RuntimeWarning: invalid value encountered in true_divide,结果出现 nan。

实操建议:

  • 默认按列归一化(即对每个特征独立处理),需显式指定 axis=0,否则 np.min(arr) 返回的是整个数组最小值,不是每列最小值
  • 用 np.where 或布尔掩码提前过滤掉 max == min 的列,避免除零;或者用 np.divide 配合 out 和 where 参数控制
  • 如果输入含 nan,np.min/np.max 默认返回 nan,得改用 np.nanmin/np.nanmax

示例(安全版列归一化):

import numpy as np
X = np.array([[1, 2, 3],
              [4, 2, 6],
              [7, 2, 9]])
<p>col_min = np.min(X, axis=0)
col_max = np.max(X, axis=0)
rng = col_max - col_min</p><h1>防止除零:rng为0的位置设为1,对应归一化后全为0</h1><p>X_norm = (X - col_min) / np.where(rng == 0, 1, rng)</p>

为什么不用sklearn.preprocessing.MinMaxScaler而手写

手写适合快速调试、嵌入轻量脚本、或数据不走 fit/transform 流程(比如实时单样本归一化)。但 MinMaxScaler 能保存 min_ 和 scale_,后续对新数据复用同一缩放参数——手写容易漏掉这点,导致训练/推理不一致。

常见错误现象:

  • 训练时用 np.min(X_train) 归一化训练集,预测时又用 np.min(X_test) 单独算,实际应统一用训练集的极值
  • 没考虑 feature_range 参数,默认是 [0, 1],但有时需要映射到 [-1, 1],手写就得手动调整公式:2 * (x - min) / (max - min) - 1
  • MinMaxScaler 默认只支持二维数组,传入 1D array 会报 ValueError: Expected 2D array,而手写对 shape 更灵活

归一化时该用axis=0还是axis=1

绝大多数场景用 axis=0(按列),因为每列表示一个特征(如身高、年龄),归一化目标是让各特征数值范围可比。用 axis=1 是按行归一化,相当于把每个样本自身拉到 [0, 1],这在某些相似度计算或图像 patch 处理中会出现,但不是标准 Min-Max 缩放。

性能与兼容性影响:

  • axis=0 是 NumPy 默认广播友好方向,内存连续性好,速度略快
  • 若原始数组是 Fortran-order(order='F'),axis=0 操作可能变慢,但一般无需干预
  • 混淆 axis 容易导致归一化后数据分布异常:比如误用 axis=1 后,不同特征的量纲差异反而被放大

如何处理测试集或新样本的归一化

必须复用训练集的 min 和 max,不能重新计算。这是最容易被跳过的步骤,尤其在手写流程里。

实操要点:

  • 训练阶段存下两个数组:train_min = np.min(X_train, axis=0)、train_max = np.max(X_train, axis=0)
  • 预测时直接代入:X_test_norm = (X_test - train_min) / (train_max - train_min),同样要检查分母为零
  • 如果训练集某特征恒定(train_max == train_min),测试集该特征也应全设为 0(或保持原值),而不是报错中断

这事关模型行为一致性,一旦用错,线上预测结果就不可信。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1871

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5144

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1829

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31037

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3687

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3687

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2863

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习