18

私は基本的なデータ型について知っており、float 型 (float、double) はいくつかの数値を正確に保持できないことを知っています。

ただし、コードを Matlab から Python (Numpy) に移植する際に、計算に大きな違いがあることがわかりました。

最初の 2 つの要素だけがゼロ以外の値を持つ 500 次元のベクトルを z 正規化する次のコードを見てください。

マトラブ:

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

パイソン:

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

フォーマットがPythonでもう少し多くの数字を示していることに加えて、0.02以上の大きな違いがあります(imho)

Python と Matlab の両方が 64 ビット データ型を使用しています (afaik)。Python は「numpy.float64」と Matlab の「double」を使用します。

なぜこんなに差が大きいのでしょうか?どちらがより正しいですか?

4

3 に答える 3

27

たぶん違いはmeanとのstd呼び出しから来ています。それらを最初に比較してください。

にはいくつかの定義がありstd、いくつかはのsqaureルートを使用します

1 / n * sum((xi - mean(x)) ** 2)

他の人は使用します

1 / (n - 1) * sum((xi - mean(x)) ** 2)

代わりは。

数学的な観点から:これらの式は、正規分布の確率変数の分散の推定量です。分布には2つのパラメーターsigmaとがありmuます。muの最適な推定値を正確に知っている場合sigma ** 2

1 / n * sum((xi - mu) ** 2)

muを使用してデータから推定する必要がある場合mu = mean(xi)、の最適な推定値sigma**2は次のとおりです。

1 / (n - 1) * sum((xi- mean(x))**2)
于 2011-09-20T08:46:44.467 に答える
14

あなたの質問に答えるには、いいえ、これは精度の問題ではありません。@rocksportrockerが指摘しているように、標準偏差には2つの一般的な推定量があります。MATLABstdでは両方を使用できますが、標準では 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))

につながる

ザ(1) = 21.1905669677

MATLAB で。2 つの結果のどちらがやりたいことにより適しているかについては、rockspotrocker の回答をお読みください ;-)。

于 2011-09-20T08:46:29.697 に答える
3

stdat SciPyのドキュメントによると、次のパラメーターがありますddof

ddof : int、オプション
デルタ自由度を意味します。計算に使用される除数は N - ddof です。ここで、N は要素の数を表します。デフォルトでは、ddof はゼロです。

numpy では、ddofデフォルトで 0 ですが、MATLAB では 1 です。したがって、これで問題が解決する可能性があると思います。

std(Z,ddof=1)
于 2014-01-03T16:46:10.460 に答える