在 numpy 中实现零均值和单位方差

Posted

技术标签:

【中文标题】在 numpy 中实现零均值和单位方差【英文标题】:Implementing zero mean and unit variance in numpy 【发布时间】:2017-03-04 11:45:10 【问题描述】:

我得到了一个函数的定义,并要求我按如下方式实现它:

# Problem 1 - Apply zero mean and zero variance scale to the image features
def normalize(data):
    pass

然后使用numpy 提供单元测试,这将断言我的实现成功

编辑

不是我的单元测试,而是由课程讲师布置的。

np.testing.assert_array_almost_equal(
    normalize(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])),
    np.array([-0.4, -0.3, -0.2, -0.099, 0.0, 0.099, 0.199, 0.3, 0.4, 0.5]),
    decimal=3)

我的解决办法是

def normalize(data):
    return ((data - data.mean()) / data.max() - data.min())

但我的理解肯定有差距,因为我正在理解

AssertionError: 
Arrays are not almost equal to 3 decimals

(mismatch 100.0%)
 x: array([-1.45, -1.35, -1.25, -1.15, -1.05, -0.95, -0.85, -0.75, -0.65, -0.55])
 y: array([-0.4  , -0.3  , -0.2  , -0.099,  0.   ,  0.099,  0.199,  0.3  ,
        0.4  ,  0.5  ])

通过谷歌搜索我也找到了

(data - data.mean()) / data.std()

经过更多搜索,我尝试了

(data - data.mean()) / data.var()

但两种解决方案都没有正确断言。

那么这里的正确实现是什么?

【问题讨论】:

为什么投反对票? 【参考方案1】:

首先你可能打算这样做:

(data - data.mean()) / (data.max() - data.min())

而不是这个:

((data - data.mean()) / data.max() - data.min())

那么这不是规范化的正确定义。相反,正如您通过搜索发现的那样,正确的定义是:

(data - data.mean()) / data.std()

最后你的单元测试是错误的,所以当使用正确的定义调用它时它会失败。

【讨论】:

作为问题统计,这不是我的单元测试!是老师安排的! 然后换你的导师 ;) np.array([-0.4, -0.3, -0.2, -0.099, 0.0, 0.099, 0.199, 0.3, 0.4, 0.5]).std() = 0.28710675714792921 我不明白这是如何标准化的...... 另外:“零方差”意味着所有值都应该相等,我怀疑这是您的讲师想要的。所以也许请你的教练检查他的问题;)【参考方案2】:

我认为您的问题可能有错字。请注意,如果您使用公式,则单元测试通过

(data - data.mean()) / data.var()

但前提是您将 0 附加到测试输入数组的开头,并将 -0.5 附加到输出数组的开头。如果不是笔误,那就是奇怪的巧合。

【讨论】:

即使是这种情况,按方差进行归一化也没有多大意义,因为它在尺寸上不正确:如果您的数据是以米为单位的长度,则此“归一化”的结果将以米为单位^-1。我认为教练的问题完全是错误的。

以上是关于在 numpy 中实现零均值和单位方差的主要内容,如果未能解决你的问题,请参考以下文章

如何将信号归一化为零均值和单位方差?

python 通过删除均值和缩放到单位方差来标准化特征

利用Python读取CSV文件并计算某一列的均值和方差

最大似然估计伪代码

样本方差跟样本均值有啥关系?

均值模型