関数scipy.ndimage.filters.gaussian_filterおよびscipy.stats.gaussian_kdesigma
を特定のデータ セットに適用すると、各関数のおよびbw_method
パラメータがそれぞれ適切に選択されている場合、非常によく似た結果が得られます。
たとえばsigma=2.
、gaussian_filter
(左のプロット) と(右bw_method=sigma/30.
のプロット) を設定することで、ポイントのランダムな 2D 分布に対して次のプロットを取得できます。gaussian_kde
(MWEは質問の一番下にあります)
1 つはデータにガウス フィルターを適用し、もう 1 つはガウス カーネル密度推定器を適用するため、これらのパラメーター間には明らかに関係があります。
各パラメータの定義は次のとおりです。
sigma : スカラーまたはスカラーのシーケンス ガウス カーネルの標準偏差。ガウス フィルターの標準偏差は、各軸に対してシーケンスとして、または単一の数値として与えられます。この場合、すべての軸で等しくなります。
ガウス演算子の定義を考えると、これは理解できます。
- scipy.stats.gaussian_kde、
bw_method
:
bw_method : str、スカラーまたは呼び出し可能、オプション 推定帯域幅の計算に使用されるメソッド。これは、'scott'、'silverman'、スカラー定数、または呼び出し可能オブジェクトです。スカラーの場合、これは kde.factor として直接使用されます。callable の場合、唯一のパラメーターとして gaussian_kde インスタンスを取り、スカラーを返す必要があります。None (デフォルト) の場合、'scott' が使用されます。詳細については、注意事項を参照してください。
bw_method
この場合、と比較できるように、 の入力がスカラー (float) であると仮定しますsigma
。kde.factor
このパラメーターに関する情報がどこにも見つからないため、ここで迷子になります。
私が知りたいのは、可能であれば、これらの両方のパラメーター (つまり、フロートが使用される場合) を接続する正確な数式です。sigma
bw_method
MWE:
import numpy as np
from scipy.stats import gaussian_kde
from scipy.ndimage.filters import gaussian_filter
import matplotlib.pyplot as plt
def rand_data():
return np.random.uniform(low=1., high=200., size=(1000,))
# Generate 2D data.
x_data, y_data = rand_data(), rand_data()
xmin, xmax = min(x_data), max(x_data)
ymin, ymax = min(y_data), max(y_data)
# Define grid density.
gd = 100
# Define bandwidth
bw = 2.
# Using gaussian_filter
# Obtain 2D histogram.
rang = [[xmin, xmax], [ymin, ymax]]
binsxy = [gd, gd]
hist1, xedges, yedges = np.histogram2d(x_data, y_data, range=rang, bins=binsxy)
# Gaussian filtered histogram.
h_g = gaussian_filter(hist1, bw)
# Using gaussian_kde
values = np.vstack([x_data, y_data])
# Data 2D kernel density estimate.
kernel = gaussian_kde(values, bw_method=bw / 30.)
# Define x,y grid.
gd_c = complex(0, gd)
x, y = np.mgrid[xmin:xmax:gd_c, ymin:ymax:gd_c]
positions = np.vstack([x.ravel(), y.ravel()])
# Evaluate KDE.
z = kernel(positions)
# Re-shape for plotting
z = z.reshape(gd, gd)
# Make plots.
fig, (ax1, ax2) = plt.subplots(1, 2)
# Gaussian filtered 2D histograms.
ax1.imshow(h_g.transpose(), origin='lower')
ax2.imshow(z.transpose(), origin='lower')
plt.show()