6

関数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 : スカラーまたはスカラーのシーケンス ガウス カーネルの標準偏差。ガウス フィルターの標準偏差は、各軸に対してシーケンスとして、または単一の数値として与えられます。この場合、すべての軸で等しくなります。

ガウス演算子の定義を考えると、これは理解できます。

ここに画像の説明を入力

bw_method : str、スカラーまたは呼び出し可能、オプション 推定帯域幅の計算に使用されるメソッド。これは、'scott'、'silverman'、スカラー定数、または呼び出し可能オブジェクトです。スカラーの場合、これは kde.factor として直接使用されます。callable の場合、唯一のパラメーターとして gaussian_kde インスタンスを取り、スカラーを返す必要があります。None (デフォルト) の場合、'scott' が使用されます。詳細については、注意事項を参照してください。

bw_methodこの場合、と比較できるように、 の入力がスカラー (float) であると仮定しますsigmakde.factorこのパラメーターに関する情報がどこにも見つからないため、ここで迷子になります。

私が知りたいのは、可能であれば、これらの両方のパラメーター (つまり、フロートが使用される場合) を接続する正確な数式です。sigmabw_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()
4

1 に答える 1

4

あなたは2つの異なることをしているので、関係はありません。

scipy.ndimage.filters.gaussian_filter を使用すると、2D 変数 (画像) をカーネルでフィルター処理していて、そのカーネルはたまたまガウスです。それは本質的に画像を滑らかにしています。

scipy.stats.gaussian_kde を使用して、2D 変数の確率密度関数を推定しようとします。帯域幅 (または平滑化パラメーター) は統合ステップであり、データが許す限り小さくする必要があります。

サンプルを抽出した一様分布は正規分布とそれほど変わらないため、2 つの画像は同じように見えます。明らかに、通常のカーネル関数を使用すると、より良い見積もりが得られます。

カーネル密度推定について読むことができます。

編集:カーネル密度推定(KDE)では、帯域幅が平滑化カーネルの標準偏差になるようにカーネルがスケーリングされます。どの帯域幅を使用するかは、データに依存するため明らかではありません。シルバーマンの経験則と呼ばれる、単変量データの最適な選択が存在します。

要約すると、ガウス フィルターの標準偏差と KDE の帯域幅の間には関係がありません。これはオレンジとリンゴの話だからです。ただし、KDE​​だけについて言えば、KDE ​​帯域幅と同じ KDE カーネルの標準偏差の間には関係があります彼らは等しいです!実際には、実装の詳細は異なり、カーネルのサイズに応じてスケーリングが行われる場合があります。特定のパッケージ gaussian_kde.py を読むことができます

于 2014-09-24T08:51:27.710 に答える