4

gaussian_kdeSciPyの関数を使用して、カーネル密度推定値を生成しています。

from scipy.stats.kde import gaussian_kde
from scipy.stats import norm
from numpy import linspace,hstack
from pylab import plot,show,hist

# creating data with two peaks
sampD1 = norm.rvs(loc=-1.0,scale=1,size=300)
sampD2 = norm.rvs(loc=2.0,scale=0.5,size=300)
samp = hstack([sampD1,sampD2])

# obtaining the pdf (my_pdf is a function!)
my_pdf = gaussian_kde(samp)

# plotting the result
x = linspace(-5,5,100)
plot(x,my_pdf(x),'r') # distribution function
hist(samp,normed=1,alpha=.3) # histogram
show()

上記のコードは機能しますが、サンプル数が非常に多い場合は非常に遅くなる可能性があります。

サンプルを配列に格納する代わりに、value: counts. たとえば、配列[1, 1, 1, 2, 2, 3]はこのヒストグラム ディクショナリで次のようにエンコードされます。

{1:3, 2:2, 3:1}.

私の質問は、辞書データ構造を使用してカーネル密度推定値を生成するにはどうすればよいですか? 入力例として、値 6 が 2081 回見られた次の辞書を考えてみましょう。

samp = {1: 1000, 2: 2800, 3: 6900, 4: 4322:, 5: 2300, 6: 2081}

助けてくれてありがとう。

4

2 に答える 2

3

Gaussian KDE を自分で実行できます。最初に、十分に小さいステップ サイズで単純なヒストグラムを作成する必要があります。次に、fftconvolve (scipy.signal.fftconvolve) を使用して結果をガウスで畳み込みます。

import numpy as np, numpy.random,scipy,scipy.stats,scipy.signal,matplotlib.pyplot as plt
N = 1e5
minx = -10
maxx = 10
bins = 10000
w = 0.1 # kernel sigma

xs1 = np.random.normal(0, 1, size=N)
xs2 = np.random.normal(1.9, 0.01, size=N)
xs = np.r_[xs1, xs2]
hh,loc = scipy.histogram(xs, range=(minx, maxx), bins=bins)
kernel = scipy.stats.norm.pdf((loc[1:]+loc[:-1]) * .5, 0, w)
kde = scipy.signal.fftconvolve(hh, kernel, 'same')
plt.plot((loc[1:] + loc[:-1])*.5, kde)
于 2013-08-23T15:52:21.187 に答える