4

ここで説明されているように、尖度の関数を作成することになっている宿題の問題があります。

シータが標準偏差である尖度

分母のシータは標準偏差 (分散の平方根) であり、分子の x-with-the-bar は の平均ですx

私は次のように機能を実装しました:

import numpy as np
from scipy.stats import kurtosis

testdata = np.array([1, 2, 3, 4, 5])

def mean(obs):
    return (1. / len(obs)) * np.sum(obs)

def variance(obs):
    return (1. / len(obs)) * np.sum((obs - mean(obs)) ** 2)

def kurt(obs):
    num = np.sqrt((1. / len(obs)) * np.sum((obs - mean(obs)) ** 4))
    denom = variance(obs) ** 2  # avoid losing precision with np.sqrt call
    return num / denom

最初の 2 つの関数meanおよびは、それぞれおよび とvariance正常に交差検証されました。numpy.meannumpy.var

kurt次のステートメントで相互検証を試みました。

>>> kurtosis(testdata) == kurt(testdata)
False

両方の尖度関数の出力は次のとおりです。

>>> kurtosis(testdata)  # scipy.stats
-1.3

>>> kurt(testdata)  # my crappy attempt
0.65192024052026476

どこで私は間違えましたか?私scipy.stats.kurtosisが与えられた方程式よりも面白いことをしていますか?

4

1 に答える 1

10

デフォルトではscipy.stats.kurtosis():

  1. 過剰尖度を計算します (つまり、結果から 3 を引きます)。
  2. 統計的偏りを修正します (分母の一部に影響します)。

どちらの動作も、 へのオプションの引数を使用して構成できますscipy.stats.kurtosis()

最後にnp.sqrt()、式に平方根がないため、メソッドの呼び出しは不要です。削除すると、関数の出力は から取得したものと一致しますkurtosis(testdata, False, False)

次のステートメントでカートを相互検証しようとしました

浮動小数点数が正確に等しいかどうかを比較するべきではありません。数式が同じであっても、コンピューター コードへの変換方法のわずかな違いが、計算結果に影響を与える可能性があります。

最後に、数値コードを作成する場合は、 What Every Computer Scientist Should Know About Floating-Point Arithmeticを読むことを強くお勧めします。

PSこれは私が使用した機能です:

In [51]: def kurt(obs):
   ....:     num = np.sum((obs - mean(obs)) ** 4)/ len(obs)
   ....:     denom = variance(obs) ** 2  # avoid losing precision with np.sqrt call
   ....:     return num / denom
于 2012-11-26T18:56:08.587 に答える