Pet*_*mit 18 python statistics matlab floating-point-precision
我知道基本数据类型,浮点类型(float,double)不能完全保存一些数字.
在将一些代码从Matlab移植到Python(Numpy)时,我发现计算中存在一些显着的差异,我认为它会回到精确度.
采用以下代码,对仅具有非零值的前两个元素进行z标准化500维向量.
Matlab的:
Z = repmat(0,500,1); Z(1)=3;Z(2)=1;
Za = (Z-repmat(mean(Z),500,1)) ./ repmat(std(Z),500,1);
Za(1)
>>> 21.1694
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
from numpy import zeros,mean,std
Z = zeros((500,))
Z[0] = 3
Z[1] = 1
Za = (Z - mean(Z)) / std(Z)
print Za[0]
>>> 21.1905669677
Run Code Online (Sandbox Code Playgroud)
除了格式化在Python中显示更多位数之外,还有一个巨大的差异(imho),大于0.02
Python和Matlab都使用64位数据类型(afaik).Python使用'numpy.float64'和Matlab'double'.
为什么差异如此之大?哪一个更正确?
roc*_*ker 27
也许差异来自mean和std电话.先比较一下.
有几个定义std,有些使用sqaure根
1 / n * sum((xi - mean(x)) ** 2)
Run Code Online (Sandbox Code Playgroud)
其他人使用
1 / (n - 1) * sum((xi - mean(x)) ** 2)
Run Code Online (Sandbox Code Playgroud)
代替.
从数学角度来看:这些公式是正态分布随机变量方差的估计量.该分布有两个参数sigma和mu.如果您mu确切知道sigma ** 2is 的最佳估计量
1 / n * sum((xi - mu) ** 2)
Run Code Online (Sandbox Code Playgroud)
如果您必须根据mu使用的数据进行mu = mean(xi)估算,则最佳估算sigma**2值为
1 / (n - 1) * sum((xi- mean(x))**2)
Run Code Online (Sandbox Code Playgroud)
Jon*_*erg 14
要回答你的问题,不,这不是一个精确的问题.正如@rocksportrocker指出的那样,标准偏差有两个流行的估算器.MATLAB std既有可用,但作为标准使用的不同于你在Python中使用的标准.
尝试std(Z,1)而不是std(Z):
Za = (Z-repmat(mean(Z),500,1)) ./ repmat(std(Z,2),500,1);Za(1)
sprintf('%1.10f', Za(1))
Run Code Online (Sandbox Code Playgroud)
导致
Za(1)= 21.1905669677
在MATLAB中.阅读rockspotrocker的答案,关于哪两个结果更适合你想做的事情;-).
| 归档时间: |
|
| 查看次数: |
3130 次 |
| 最近记录: |