Leg*_*end 5 python debugging statistics numpy r
也许我在对数组进行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
Run Code Online (Sandbox Code Playgroud)
在使用numpy的Python中:
>>> 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]]
Run Code Online (Sandbox Code Playgroud)
我使用numpy不正确吗?
Bre*_*arn 14
您获得不同结果的原因与如何计算标准偏差/方差有关.R使用分母计算N-1,而numpy使用分母计算N.你可以通过使用得到一个等于R结果的numpy结果data.std(ddof=1),它告诉numpy N-1在计算方差时用作分母.
我相信你的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])
Run Code Online (Sandbox Code Playgroud)
两个结果之间的区别在于规范化: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])
Run Code Online (Sandbox Code Playgroud)
因此,您的两个结果大多只是彼此成比例.因此,您可能希望比较使用R和Python获得的标准偏差.
PS:现在我正在考虑它,可能是NumPy和R中的方差没有以相同的方式定义:对于N元素,一些工具在计算方差时用N-1而不是规范化N.你可能想检查一下.
PPS:这就是出现差异的原因:因素的差异来自两种不同的标准化约定:观察到的因子只是sqrt(14/15)= 0.9660917 ......(因为数据有15个元素).因此,为了在R中获得与Python相同的结果,您需要将R结果除以此因子.