Numpy 归一化(Normalise)操作,忽略NaN值,使结果在0到1之间
在数据预处理方面,归一化操作是一项非常重要的技能,而在使用Numpy进行数据处理时,实现该操作非常方便。下面将介绍如何使用Numpy在处理数据时,将数据归一化(normalise)到0到1之间,并忽略NaN值。
阅读更多:Numpy 教程
什么是归一化?为什么要归一化?
归一化操作是将数据经过处理,使其范围缩放到一个特定的范围内,通常缩放为0到1之间(可以是0到10或其他区间),以便于后续的处理和计算。
为什么要进行归一化呢?在许多机器学习和深度学习的任务中,数据量十分庞大,许多算法会尝试最小化甚至归零化数据中的差异。如果不进行归一化操作,那么一些特征的值域可能会更大,而一些值域更小的特征将会被压制,导致分析出来的特征并不依据实际情况。
为了避免这种情况并确保各个特征能够得到公正的评估和处理,因此进行归一化操作就显得尤为必要。
例如,这里有一个数组:
arr = np.array([1, 2, 3, 4, 5, np.nan])
在原始数据中,该数组中的最大值和最小值分别为1和5。通过归一化操作,我们可以将所有值域修改为0到1之间,如下所示:
arr_norm = (arr - np.nanmin(arr)) / (np.nanmax(arr) - np.nanmin(arr))
输出结果为:
array([0. , 0.25 , 0.5 , 0.75 , 1. ,
nan])
对比原数组,可以看到所有值都被归一化到了0到1之间。
怎样实现在Numpy中进行忽略NaN的归一化?
忽略NaN值进行归一化的实现十分简单。通常的归一化正常是通过原始数据的最小值和最大值来进行处理。需要注意的是,对于存在NaN的数据,需要在进行归一化时先将NaN值替换成另外一个值(如-1或0),以便用于后续的计算。
在Numpy中进行忽略NaN值的归一化操作,可以使用该库内置的一些函数进行操作。例如,在处理上面提到的数组的过程中,可以使用以下代码进行操作:
arr = np.array([1, 2, 3, 4, 5, np.nan]) # 初始化数组
new_arr = arr[~np.isnan(arr)] # 剔除nan值
min_val = new_arr.min()
max_val = new_arr.max()
# 进行归一化操作
arr_norm = np.where(np.isnan(arr), np.nan, ((arr - min_val) / (max_val - min_val)))
在这个例子中,我们使用了np.isnan()函数将带有NaN值的原始数组中的NaN值取出剩下非NaN值,然后对这个新的无NaN数据集进行归一化操作。归一化的实现方法与上述是一致的,但在计算时需要用到新的数据集最大值和最小值。
最后,在进行归一化的时候,我们使用了np.where()函数来解决NaN值问题。此函数通常用于将满足一定条件的数值数组进行处理并将结果以新的数组形式返回。在本例中,我们将NaN值与nan进行替换,避免在计算归一化时出现错误。
示例
为了更好地理解忽略NaN值的归一化操作,我们可以通过一个简单的示例来演示其过程。
假设我们有一组数据:
data = [5, 2, 3, 6, 1, np.nan, 8, 2, 6, 4, 5, 9, 7, np.nan]
我们需要对该数据进行忽略NaN值的归一化操作,使其数值范围缩放到0到1之间。
首先,我们需要将该数组中的NaN值剔除掉:
new_data = data[~np.isnan(data)]
接下来,我们需要计算剔除NaN值后的最大值和最小值:
max_val = np.nanmax(new_data)
min_val = np.nanmin(new_data)
这里使用了np.nanmax()和np.nanmin()函数来获取剔除NaN值后的最大值和最小值,保证在计算过程中不会受到NaN值的影响。
接下来,我们可以使用以下代码来对数据进行归一化:
data_norm = np.where(np.isnan(data), np.nan, (data - min_val) / (max_val - min_val))
在这里,我们使用了np.where()函数来处理NaN值,并使用与上文介绍相同的计算方法对数据进行归一化。最终的输出结果如下:
array([0.5 , 0.11111111, 0.22222222, 0.66666667, 0. ,
nan, 1. , 0.11111111, 0.66666667, 0.33333333,
0.5 , 0.88888889, 0.77777778, nan])
可以看到,所有的数据都被归一化到了0到1之间,且忽略了NaN值。
总结
在Numpy中进行归一化操作非常简单,同时可以通过使用函数和条件语句来忽略NaN值,保证得到准确的归一化结果。在实际项目中,归一化操作可以在数据预处理阶段中被广泛应用,帮助保证数据质量,减少数据分析时的误差。
极客笔记