我希望实施Lindeberg在他关于尺度空间理论的工作中所定义的discrete Gaussian kernel。
定义为T(n,t)= exp(-t)* I_n(t)其中I_n是modified Bessel function of the first kind。
我正在尝试使用Numpy和Scipy在Python中实现它,但遇到了一些麻烦。
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])
输出如下:
来自维基百科的文章,它应该如下:
我认为我犯了一些非常微不足道的错误。 :/ 有什么想法吗? 谢谢!
编辑:
我写的内容相当于scipy.special.ive(n, t)
。我很确定它应该是第一种改进的贝塞尔函数,而不是第二种,但有人可以证实吗?
答案 0 :(得分:4)
如果您想获取维基百科图,请替换
ns = np.linspace(-5, 5, 1000)
与
ns = np.arange(-5, 5+1)
即,您使用的公式仅在整数点有意义。 贝塞尔函数作为负序的函数是一个振荡函数,http://dlmf.nist.gov/10.27#E2所以情节看起来很好。