26

私が持っているサンプルに基づいて確率密度関数の近似をプロットしたい; ヒストグラムの動作を模倣する曲線。好きなだけサンプルを用意できます。

4

2 に答える 2

38

分布をプロットしたい場合、それがわかっている場合は、それを関数として定義し、次のようにプロットします。

import numpy as np
from matplotlib import pyplot as plt

def my_dist(x):
    return np.exp(-x ** 2)

x = np.arange(-100, 100)
p = my_dist(x)
plt.plot(x, p)
plt.show()

分析関数として正確な分布がない場合は、おそらく大きなサンプルを生成し、ヒストグラムを取得して、何らかの方法でデータを平滑化できます。

import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt

N = 1000
n = N//10
s = np.random.normal(size=N)   # generate your data sample with N elements
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins
x = x[:-1] + (x[1] - x[0])/2   # convert bin edges to centers
f = UnivariateSpline(x, p, s=n)
plt.plot(x, f(x))
plt.show()

関数呼び出しs内で (平滑化係数) を増減して、平滑化を増減できます。UnivariateSplineたとえば、次の 2 つを使用します。 関数への距離

于 2013-03-14T17:01:44.193 に答える
27

あなたがしなければならないことは、scipy.stats.kdeパッケージのgaussian_kdeを使用することです。

データが与えられると、次のようなことができます。

from scipy.stats.kde import gaussian_kde
from numpy import linspace
# create fake data
data = randn(1000)
# this create the kernel, given an array it will estimate the probability over that values
kde = gaussian_kde( data )
# these are the values over wich your kernel will be evaluated
dist_space = linspace( min(data), max(data), 100 )
# plot the results
plt.plot( dist_space, kde(dist_space) )

カーネル密度は自由に構成でき、N次元データを簡単に処理できます。また、askewchanによって与えられたプロットで見ることができるスプラインの歪みを回避します。

ここに画像の説明を入力してください

于 2013-03-14T19:39:19.687 に答える