归一化报错原理解释

本文以Python为例,讲述数据归一化报错问题。先介绍归一化原理,常见方法有Min - Max、Z - score等。以Min - Max为例说明报错原理,即反归一化单列数据时程序无法判断对应列。最后给出两种解决方案,一是用需反归一化数据替换历史数据,二是自己编写归一化函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于归一化报错问题——以Python为例

不少小伙伴在开始数据处理,进行归一化的时候,会出现以下报错问题
ValueError: non-broadcastable output operand with shape (8,1) doesn’t match the broadcast shape (8,6)
本文将讲述报错原因以及如何改正。在改错之前,首先要了解归一化的原理。

归一化介绍

通常,在做数据分析的时候,数据归一化是必不可少的一步,特别是对于多维的数据。Why?,简而言之,数据归一化就是将数据中的每一个元素映射到一个较小的区间,这样,多维数据间的数字差距就会减小,消除量纲的影响。特别是在分析多维数据对标签的影响时更为重要。
常见的归一化方法主要有:

Min-Max
x−minXmaxX−minX\frac{x - minX}{maxX- minX}maxXminXxminX
Min-Max归一化方法将所有的值映射到[0, 1]。

Z-score
x−μσ\frac{x-\mu}{\sigma}σxμ
Z-score方法,其中μ\muμ为处理数据中的均值,σ\sigmaσ为处理数据中的方差。该方法将数据归一化为均值为0,方差为1。对于服从正态分布类的数据而言,适用于该归一化方法。
除上述两种归一化方法,在机器学习中,还有常见的Sigmoid归一化函数、tanh函数……,这里就不一一赘述了。

报错原理

我们以Min-Max归一化方法为例,我们将下面矩阵归一化处理:
[ABCD24560275171243308522439308653499329522499457170439329170765125797796879810059536177672143186318631677] \left[ \begin{matrix} A &B &C &D\\ 245 &602 &751 &712\\ 43 &308 &522 &439\\ 308 &653 &499 &329\\ 522 &499 &457 &170\\ 439 &329 &170 &765\\ 1257 &977 &968 &798\\ 1005 &953 &617 &767\\ 2143 &1863 &1863 &1677 \end{matrix} \right] A24543308522439125710052143B6023086534993299779531863C7515224994571709686171863D7124393291707657987671677

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
w = pd.read_excel("data.xlsx")
origin = np.array(w)
sc = MinMaxScaler()
data = sc.fit_transform(origin)

处理后得到如下归一化矩阵:

[ABCD0.096190480.189067520.343177790.35965494000.207914940.178500330.126190480.221864950.194329590.105507630.228095240.122829580.1695215600.188571430.0135048200.394824150.578095240.430225080.471352630.416721960.458095240.4147910.264028350.396151291111] \left[ \begin{matrix} A&B&C&D\\ 0.09619048& 0.18906752& 0.34317779& 0.35965494\\ 0 &0 &0.20791494 &0.17850033\\ 0.12619048& 0.22186495 &0.19432959& 0.10550763\\ 0.22809524 &0.12282958 &0.16952156& 0 \\ 0.18857143& 0.01350482 &0 &0.39482415\\ 0.57809524& 0.43022508& 0.47135263 &0.41672196\\ 0.45809524 &0.414791 & 0.26402835& 0.39615129\\ 1 &1 &1 &1 \end{matrix} \right] A0.0961904800.126190480.228095240.188571430.578095240.458095241B0.1890675200.221864950.122829580.013504820.430225080.4147911C0.343177790.207914940.194329590.1695215600.471352630.264028351D0.359654940.178500330.1055076300.394824150.416721960.396151291
根据上面个归一化数据可知,对于数据框,Sklearn库中归一化方法是将数据分列进行处理的。现在,我们将A列数据反归一化。返回原来的值:

#对第一列数据进行反归一化操作
w2 = data[::, 0]
#改变数据维度,不然会报错
w2 = w2.reshape(8, 1)
pr_data = sc.inverse_transform(w2)
print(pr_data)

此时报错:
ValueError: non-broadcastable output operand with shape (8,1) doesn’t match the broadcast shape (8,4)
这是因为我们上面是将一个数据框进行归一化,而当我们在反归一化时只对其中的一列数据进行操作。而程序无法判断我们进行操作的数据对应数据框的哪一列,自然就无法进行反归一化。
注意:从数据框中提取数据需要重新塑造维度,若没有改变数据维度,则会报错:
ValueError: Expected 2D array, got 1D array instead

解决方案

针对以上的报错,这里提供两种解决方法:

1. 用需要反归一化的数据,替换掉历史的数据。

例如现在用A,B,C前三列数据分析D列数据,得到新的一列数据E需要与原数据D进行比较,这时候我们只需要加上两行代码将新数据E代替D列,再反归一化即可。

data = pd.DataFrame(data)
data.iloc[:, 3] = new_data	#新数据列替换D列数据
data = sc.inverse_transform(data)	#反归一化

注意:系统会利用归一化中存储的最值进行反一化操作,因此在反归一化数据是允许出现在[0,1]外的。

2. 自己编写归一化函数

并且实际的数据处理中,对于样本量较小的情况下,调用归一化函数是不合理的。因为小样本数据不符合大数定律,无法客观反映事件的整体特性,即数学语言中的均值,方差,最值等。此时建议对数据归一化处理时所需的数字特征另外获取,并根据数据特性编写归一化代码

<think>好的,我现在需要解释cv::applyColorMap这个函数。首先,我得回忆一下OpenCV中这个函数的用途和基本用法。记得这个函数是用来给图像应用颜色映射的,常用于增强可视化效果,比如热力图或伪彩色显示。 用户可能想知道这个函数的具体参数和如何使用它。首先,我需要确认函数的参数:输入图像、输出图像和颜色映射类型。然后,颜色映射类型有很多种,比如COLORMAP_JET、COLORMAP_HOT等,可能需要列举一些常见的选项。 接下来,我需要考虑用户的使用场景。比如,他们可能有一张灰度图像,想要转换成彩色图像以便更直观地观察数据的变化。或者,在处理热像仪数据时,使用不同的颜色映射来突出温度差异。 还需要注意输入图像的要求,是否是8位的灰度图,因为有些颜色映射可能需要特定的输入格式。如果有不正确的输入,函数可能会报错或者结果不正确,这点需要提醒用户。 然后,举一个简单的例子会有帮助。比如读取一张灰度图,应用COLORMAP_JET,然后显示结果。这样用户可以直观地看到效果。 另外,可能还需要提到不同颜色映射的效果差异,比如COLORMAP_HOT适合表示高温区域,而COLORMAP_COOL适合低温。用户可以根据具体需求选择合适的映射。 最后,检查是否有常见的问题或注意事项。例如,输出图像的数据类型是否与输入一致,颜色映射是否支持多通道图像,或者如何处理非8位图像的情况(可能需要先进行归一化或转换)。 总结一下,回答的结构应该是先介绍函数的作用和参数,再说明使用方法和示例,然后列举常见的颜色映射类型,最后提醒注意事项。这样用户能够全面了解如何正确使用cv::applyColorMap,并根据需要选择合适的颜色方案。</think>`cv::applyColorMap` 是 OpenCV 中用于**伪彩色映射**的核心函数,可将灰度图像转换为彩色图像以增强可视化效果。以下是详细解析: --- ### **函数原型** ```cpp void cv::applyColorMap( InputArray src, // 输入图像(8位单通道灰度图) OutputArray dst, // 输出图像(8位3通道BGR彩色图) int colormap // 预定义的颜色映射类型 ) ``` --- ### **核心作用** 将数值映射到色谱空间,常用于: - 热力图可视化(如温度分布、密度分析) - 医学影像增强(X光、CT扫描) - 深度图/视差图着色 - 数据分布的可视化表达 --- ### **常用颜色映射类型** | 枚举值 | 效果描述 | 典型应用场景 | |-----------------------|--------------------------|-------------------| | COLORMAP_JET | 蓝---红渐变(类似MATLAB的jet) | 热力图、深度图 | | COLORMAP_HOT | 黑---白渐变 | 高温区域突出 | | COLORMAP_COOL | 青-品红渐变 | 低温对比显示 | | COLORMAP_RAINBOW | 彩虹色谱 | 宽范围数据分级 | | COLORMAP_BONE | 灰度到蓝白渐变 | 医学影像 | | COLORMAP_WINTER | 蓝-绿渐变 | 水下地形图 | | COLORMAP_OCEAN | 深蓝-浅蓝渐变 | 海洋数据可视化 | --- ### **代码示例** ```cpp cv::Mat gray_image = cv::imread("thermal.jpg", cv::IMREAD_GRAYSCALE); cv::Mat color_mapped; // 应用JET色图 cv::applyColorMap(gray_image, color_mapped, cv::COLORMAP_JET); // 显示对比 cv::imshow("Original", gray_image); cv::imshow("ColorMapped", color_mapped); cv::waitKey(0); ``` --- ### **实现原理** 1. **数值归一化**:将输入灰度值线性映射到0-255范围 2. **查表替换**:根据`colormap`参数选择预定义的256色LUT(查找表) 3. **通道扩展**:将单通道索引值转换为对应的BGR三通道颜色值 --- ### **扩展技巧** 1. **自定义颜色映射**:通过`cv::LUT`函数创建个性化色图 ```cpp cv::Mat custom_lut = createCustomColormap(); cv::LUT(gray_image, custom_lut, result); ``` 2. **非8位图像处理**:对16位/浮点图像需先归一化 ```cpp gray_image.convertTo(normalized, CV_8U, 255.0/65535.0); ``` 3. **实时映射优化**:对视频流处理时建议预生成LUT表 --- ### **注意事项** - 输入图像**必须**为单通道8位(CV_8UC1) - 颜色映射选择需考虑**数据语义**(如避免用红色表示低温) - 对医学影像建议使用BONE/WINTER等低饱和度色图 --- 如果需要具体某个色图的效果对比图,可以进一步为您生成可视化示例! 📊
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值