7

也许我在对数组进行z 归一化时做错了。有人可以看看这个并建议发生了什么吗?

在 R 中:

> data <- c(2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34)
> data.mean <- mean(data)
> data.sd <- sqrt(var(data))
> data.norm <- (data - data.mean) / data.sd
> print(data.norm)
 [1] -0.9796808 -0.8622706 -0.6123005  0.8496459  1.7396910  1.5881940  1.0958286  0.5277147  0.4709033 -0.2865819
[11]  0.0921607 -0.2865819 -0.9039323 -1.1955641 -1.2372258

在 Python 中使用 numpy:

>>> import string
>>> import numpy as np
>>> from scipy.stats import norm
>>> data = np.array([np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34])])
>>> data -= np.split(np.mean(data, axis=1), data.shape[0])
>>> data *= np.split(1.0/data.std(axis=1), data.shape[0])
>>> print data

[[-1.01406602 -0.89253491 -0.63379126  0.87946705  1.80075126  1.64393692
   1.13429034  0.54623659  0.48743122 -0.29664045  0.09539539 -0.29664045
  -0.93565885 -1.23752644 -1.28065039]]

我使用numpy不正确吗?

4

3 回答 3

17

您得到不同结果的原因与标准差/方差的计算方式有关。R 使用 denominator 计算N-1,而 numpy 使用 denominator 计算N。您可以通过 using 得到一个等于 R 结果的 numpy 结果data.std(ddof=1),它告诉 numpyN-1在计算方差时用作分母。

于 2012-06-28T01:42:09.120 回答
9

我相信你的 NumPy 结果是正确的。不过,我会以更简单的方式进行标准化:

>>> data = np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34])
>>> data -= data.mean()
>>> data /= data.std()
>>> data
array([-1.01406602, -0.89253491, -0.63379126,  0.87946705,  1.80075126,
        1.64393692,  1.13429034,  0.54623659,  0.48743122, -0.29664045,
        0.09539539, -0.29664045, -0.93565885, -1.23752644, -1.28065039])

您的两个结果之间的区别在于标准化:r作为 R 结果:

>>> r / data
array([ 0.96609173,  0.96609173,  0.96609173,  0.96609179,  0.96609179, 0.96609181,  0.9660918 ,  0.96609181,
        0.96609179,  0.96609179,        0.9660918 ,  0.96609179,  0.96609175,  0.96609176,  0.96609177])

因此,您的两个结果大多只是彼此成比例。因此,您可能想要比较使用 R 和 Python 获得的标准偏差。

PS:现在我正在考虑它,可能是 NumPy 和 R 中的方差没有以相同的方式定义:对于N元素,一些工具在计算方差时使用N-1而不是 进行归一化。N你可能想检查一下。

PPS这是差异的原因:因子的差异来自两个不同的归一化约定:观察到的因子只是 sqrt(14/15) = 0.9660917…(因为数据有 15 个元素)。因此,为了在 R 中获得与在 Python 中相同的结果,您需要将 R 结果除以该因子。

于 2012-06-28T01:31:49.347 回答
0

除以 N-1,如在 R 中,给出方差的无偏估计;一般来说,人们需要一个无偏的估计。Numpy 实现不正确。

于 2022-02-11T03:45:14.157 回答