在 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 中实现零均值和单位方差的主要内容,如果未能解决你的问题,请参考以下文章