在numpy

时间:2016-10-22 06:10:01

标签: python numpy machine-learning normalization

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

# 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()

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

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

2 个答案:

答案 0 :(得分:6)

首先你可能打算这样做:

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

而不是:

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

然后它不是规范化的正确定义。相反,正如您通过搜索找到的那样,正确的定义是:

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

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

答案 1 :(得分:1)

我认为你的问题可能存在拼写错误。请注意,如果使用公式

,则单元测试通过
(data - data.mean()) / data.var()

但是,只有将0追加到测试输入数组的开头,并将-0.5附加到输出数组的开头。如果它不是拼写错误,那么这是一个奇怪的巧合。