2017-01-10 14 views
2

私はPythonには新しく、2Dサンプルから密度を推定する必要があります。私の最初のアイデアは、私は以下のように実装され、単純なヒストグラム推定器、だった:Pythonの密度推定

num = 10**4 
sp = 0.01 

subsetf1 = np.random.uniform(0,1,size=(num,2)) # I created this set to test the estimator 

def f_est(x,y,h=sp, subset=subsetf1): 
    indicator = np.zeros(num) 

    for i in range(num): 
     if (x <= subset[i][0] <= (x + h)) and (y <= subset[i][1] <= (y + h)): 
      indicator[i] = 1 
     else : indicator[i] = 0 


    return sum(indicator)/(num*h**2) 

#f_est should yield values closely to 1 if 0 <x,y <1 , because subsetf1 contains uniformly distributed values on [0,1). 

問題はf_estは、多くの場合、私のコードが間違っていると信じて私をリード1以上の値が得られていることですが、私は知りませんバグはどこにあるのでしょうか?私はカーネル密度の推定も試みましたが、次のようなものを試してみました。

from scipy import stats 
xmin = partsetf1[0].min() 
xmax = partsetf1[0].max() 
ymin = partsetf1[1].min() 
ymax = partsetf1[1].max() 
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] 
positions = np.vstack([X.ravel(), Y.ravel()]) 
values = np.vstack([partsetf1[0], partsetf1[1]]) 
gkde=stats.gaussian_kde(values) 
f = np.reshape(gkde(positions).T, X.shape) 

fは奇妙な値を生成できません。 誰かが私のコード内のバグがどこにあるのか、またPythonでkdeを使う方法を教えてもらえれば幸いです。なぜなら私はこの話題に関して良いチュートリアルを見つけられなかったからです。彼らは確率のではなく、確率密度を返すされていないため、

+1

あなたの結果をscipyの密度推定のような組み込み関数と比較しましたか? https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html または、私は、あなたの結果を何かと比較して何を求めているのでしょうか? – Jon

+0

こんにちは@Jon。私もscipyの密度推定を試したので、コードは私のポストにもあります。問題はscipysの密度の推定は全く間違った結果をもたらし、なぜわからないのですか – murph

+0

申し訳ありませんが、私はそれを見ませんでした。 Scipyの代わりに、統計モデルがあります。試しましたか?http://statsmodels.sourceforge.net/notebooks/generated/statsmodels.nonparametric.kde.KDEUnivariate.html?highlight=kde#statsmodels.nonparametric.kde.KDEUnivariate – Jon

答えて

0

カーネル密度推定値は1以上の値を生成することができます。あなたの場合の確率密度は、単位面積当たりの確率を与え、局所的には1よりもはるかに大きくなります。

あなたの結果がscipyやstatsmodelsの結果と一致するので、あなたのコードが正しいと聞こえます。

関連する問題