-
Notifications
You must be signed in to change notification settings - Fork 82
Description
As I am playing with gwlearn
and kernels over there, compared to mgwr
, I noticed that kernels in libpysal behave unexpectedly (besides an actual bug in #789). What I would assume that we use the kernel function, say Gaussian, to assign weights from 1 at distance 0 progressively to 0. But that is not the case. The progression of a Gaussian kernel goes from 0.4 as shown in the fig below (bandwidth 100). The same happens in GeoDa.
However, if I use the kernel as defined in mgwr
, it behaves as I expected.
def _gaussian_mgwr(distances, bandwidth):
zs = distances / bandwidth
return numpy.exp(-0.5 * ((zs)**2))
The reason I don't understand why we should not start at 1 is that if I get a kernel-based W, and want to assign self weight afterwards, I am pretty much without options of doing that correctly. The value for 0 is 0.3989422804014327. Though I would intuitively expect it to be 1.
Similar behaviour, albeit not that drastic, is in a few of the other kernels.
The formula for Gaussian we use is this:
def _gaussian(distances, bandwidth):
u = distances / bandwidth
return numpy.exp(-((u / 2) ** 2)) / (numpy.sqrt(2 * numpy.pi))
Why is it divided by (numpy.sqrt(2 * numpy.pi))
? If we don't then it matches MGWR and also the Gaussian kernel definition in support vector machine and elsewhere.
Can someone shed some light on this? It follows the formula I've found in @sjsrey's Modern spatial econometrics in practice but have no clue where that comes from and why it looks like this.