2016-11-17 3 views
4

私は、スケールスペース理論に関する彼の研究でLindebergが定義したdiscrete Gaussian kernelを実装しようとしています。Pythonで離散ガウスカーネルを実装するには?

ここで、I_nはmodified Bessel function of the first kindであり、T(n、t)= exp(-t)* I_n(t)と定義される。

私はこれをPythonでNumpyとScipyを使用して実装しようとしていますが、何らかの問題が発生しています。

def discrete_gaussian_kernel(t, n): 
    return math.exp(-t) * scipy.special.iv(n, t) 

私はプロットしてみてください:

import math 
import numpy as np 
import scipy 
from matplotlib import pyplot as plt 

def kernel(t, n): 
    return math.exp(-t) * scipy.special.iv(n, t) 
ns = np.linspace(-5, 5, 1000) 
y0 = discrete_gaussian_kernel(0.5, ns) 
y1 = discrete_gaussian_kernel(1, ns) 
y2 = discrete_gaussian_kernel(2, ns) 
y3 = discrete_gaussian_kernel(4, ns) 
plt.plot(ns, y0, ns, y1, ns, y2, ns, y3) 
plt.xlim([-4, 4]) 
plt.ylim([0, 0.7]) 

出力は次のようになります。

enter image description here

:Wikipediaの記事

python impl of discrete gaussian. it's not right! o.o

、それはのようになります。

私は本当に些細な間違いをしていると思います。 :/ 何かご意見は? ありがとう!

編集: 私が書いたのはscipy.special.ive(n, t)に相当します。私はそれが最初の種類のベッセル関数の変更ではなく、2番目のベッセル関数であると確信していますが、誰かが確認できますか?

+0

注文や引数をnとtと混在させていますか?それは私のように見えます。またはそうでないかもしれません。私はコーヒーが必要。 – Lagerbaer

+0

@Lagerbaer私はそうは思わない。私は数回にわたってそれをチェックし、それも試してみましたが、役に立たなかった... – kotakotakota

答えて

3

あなたはウィキペディアプロットを取得したい場合は、

ns = np.arange(-5, 5+1) 

ns = np.linspace(-5, 5, 1000) 

を置き換えるつまり、あなたが使う式は唯一の整数点で意味があります。 負の次数の関数としてのベッセル関数は、振動する関数http://dlmf.nist.gov/10.27#E2ですので、プロットは私にとってはうまく見えます。

+0

それはそれをするでしょう。なぜそれが整数値についてあまりにも明白であり、離散ガウス・カーネルをなぜ連続したケースに使うことができないのかを説明すると思います。助けてくれてありがとう! – kotakotakota

関連する問題