2

(-pi, pi) 範囲の一連の角度値について、ヒストグラムを作成します。平均値とモーダル (確率後) 値を計算する効果的な方法はありますか? 次の例を検討してください。

import numpy as N, cmath
deg = N.pi/180.
d = N.array([-175., 170, 175, 179, -179])*deg
i = N.sum(N.exp(1j*d))
ave = cmath.phase(i)
i /= float(d.size)
stdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))

print ave/deg, stdev/deg

それでは、ヒストグラムを見てみましょう。

counts, bins = N.histogram(data, N.linspace(-N.pi, N.pi, 360))

カウントとビンを持つ平均、モードを計算することは可能ですか? 非周期的なデータの場合、平均の計算は簡単です。

ave = sum(counts*bins[:-1])

モーダル値の計算には、より多くの労力が必要です。実際、以下のコードが正しいかどうかはわかりません。まず、最も頻繁に発生するビンを特定し、算術平均を計算します。

cmax = bins[N.argmax(counts)]
mode = N.mean(N.take(bins, N.nonzero(counts == cmax)[0]))

ただし、そのようなデータから標準偏差を計算する方法はわかりません。私のすべての問題 (少なくとも上記の問題) に対する明らかな解決策の 1 つは、ヒストグラム データをデータ系列に変換してから、それを計算に使用することです。ただし、これはエレガントではなく、非効率的です。

どんなヒントでも大歓迎です。


これは私が書いた部分的な解決策です。

import numpy as N, cmath
import scipy.stats as ST

d = [-175, 170.2, 175.57, 179, -179, 170.2, 175.57, 170.2]
deg = N.pi/180.
data = N.array(d)*deg

i = N.sum(N.exp(1j*data))
ave = cmath.phase(i)  # correct and exact mean for periodic data
wrong_ave = N.mean(d)

i /= float(data.size)
stdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))
wrong_stdev = N.std(d)

bins = N.linspace(-N.pi, N.pi, 360)
counts, bins = N.histogram(data, bins, normed=False)
# consider it weighted vector addition
nz = N.nonzero(counts)[0]
weight = counts[nz]
i = N.sum(weight * N.exp(1j*bins[nz])/len(nz))
pave = cmath.phase(i)  # correct and approximated mean for periodic data
i /= sum(weight)/float(len(nz))
pstdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))
print
print 'scipy: %12.3f (mean) %12.3f (stdev)' % (ST.circmean(data)/deg, \
                                               ST.circstd(data)/deg)

実行すると、次の結果が得られます。

 mean:      175.840       85.843      175.360
stdev:        0.472      151.785        0.430

scipy:      175.840 (mean)        3.673 (stdev)

いくつかのコメント: 最初の列は、計算された平均/標準偏差を示します。ご覧のとおり、平均は scipy.stats.circmean とよく一致しています (指摘してくれた JoeKington に感謝します)。残念ながら stdev は異なります。後で見てみます。2 番目の列では、完全に間違った結果が得られます (numpy の非周期的な平均/標準は明らかにここでは機能しません)。3番目の列は、ヒストグラムデータから取得したいsthを示します(@JoeKington:私の生データは私のコンピューターのメモリに収まりません..、@dmytro:ご入力いただきありがとうございます:もちろん、ビンサイズは結果に影響しますが、私のつまり、どうにかしてデータを削減する必要があります)。ご覧のとおり、平均 (3 列目) は適切に計算されており、stdev にはさらに注意が必要です :)

4

2 に答える 2

5

とを見てscipy.stats.circmeanくださいscipy.stats.circstd

それとも、「生の」データではなく、ヒストグラムの数だけを持っていますか? その場合、フォン ミーゼス分布をヒストグラム カウントに当てはめ、その方法で平均値と標準偏差を近似できます。

于 2012-04-22T17:06:41.900 に答える
1

近似値を取得する方法は次のとおりです。

以来Var(x) = <x^2> - <x>^2、次のようになっています。

meanX = N.sum(counts * bins[:-1]) / N.sum(counts)
meanX2 = N.sum(counts * bins[:-1]**2) / N.sum(counts)
std = N.sqrt(meanX2 - meanX**2)
于 2012-04-22T16:08:44.433 に答える