将2D Numpy数组归一化:零均值单位方差

19

我有一个2D的Numpy数组,我想将每一列归一化为零均值和单位方差。由于我主要使用C ++,所以我正在使用循环迭代列中的元素并执行必要的操作,然后对所有列重复此操作。我想知道是否有Pythonic的方法来实现。

假设class_input_data是我的2D数组。我可以得到列均值:

column_mean = numpy.sum(class_input_data, axis = 0)/class_input_data.shape[0]

我可以这样从所有列中减去平均值:

class_input_data = class_input_data - column_mean

现在,数据应该为零均值。然而,该值为:

numpy.sum(class_input_data, axis = 0)

不等于0,这意味着我在归一化过程中出现了错误。这里的“不等于0”并不指代那些可以归因于浮点数不精确所产生的非常小的数字。


1
从每一列中减去均值,然后除以方差。 - user707650
为什么不直接使用numpy.mean? - nitbix
@nitbix:感谢你的评论,但我不知道为什么当时没有使用它。可能存在一些问题或者其他原因吧。然而,这个已经是几个月前的事情了,我不记得其他的细节了。好奇一下,你现在是怎么偶然发现这个问题的? - therainmaker
我只是在谷歌上搜索一些有关归一化到单位方差的随机内容,然后就来到了这里!我想知道这是否导致了你的平均值偏离。谁知道呢。 - nitbix
1个回答

30

类似于:

import numpy as np

eg_array = 5 + (np.random.randn(10, 10) * 2)
normed = (eg_array - eg_array.mean(axis=0)) / eg_array.std(axis=0)

normed.mean(axis=0)
Out[14]: 
array([  1.16573418e-16,  -7.77156117e-17,  -1.77635684e-16,
         9.43689571e-17,  -2.22044605e-17,  -6.09234885e-16,
        -2.22044605e-16,  -4.44089210e-17,  -7.10542736e-16,
         4.21884749e-16])

normed.std(axis=0)
Out[15]: array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

你能指出我在问题中提供的代码中的错误吗?我觉得这可能是一些愚蠢的错误,但是我想不出来。 - therainmaker
代码基本上看起来没问题。如果你的数据偏斜(围绕平均值非对称)且标准差/方差很大,我猜这会导致总和远离0? - Marius
我在我的数据中使用了这段代码。我的数据有42个特征。前几个特征比其他特征大两到三个数量级。观察到的均值向量的前几个条目为非零,而最后几个则趋近于零。对此有任何特别的解释吗?我认为方差并不大到会造成任何问题。 - therainmaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接