Small updates

master
Per.Andreas.Brodtkorb 14 years ago
parent 69dd04d787
commit 767cae0ed8

@ -10,10 +10,12 @@
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
#!/usr/bin/env python #!/usr/bin/env python
from __future__ import division from __future__ import division
import copy
import warnings import warnings
import numpy as np import numpy as np
from numpy import pi, sqrt, atleast_2d, exp, newaxis, array #@UnresolvedImport from numpy import pi, sqrt, atleast_2d, exp, newaxis, array #@UnresolvedImport
import scipy import scipy
from scipy import interpolate
from scipy import linalg from scipy import linalg
from scipy.special import gamma from scipy.special import gamma
from misc import tranproc, trangood from misc import tranproc, trangood
@ -112,6 +114,14 @@ class TKDE(object):
array([ 1.03982714, 0.45839018, 0.39514782, 0.32860602, 0.26433318, array([ 1.03982714, 0.45839018, 0.39514782, 0.32860602, 0.26433318,
0.20717946, 0.15907684, 0.1201074 , 0.08941027, 0.06574882]) 0.20717946, 0.15907684, 0.1201074 , 0.08941027, 0.06574882])
>>> kde.eval_grid(x)
array([ 1.03982714, 0.45839018, 0.39514782, 0.32860602, 0.26433318,
0.20717946, 0.15907684, 0.1201074 , 0.08941027, 0.06574882])
>>> kde.eval_grid_fast(x)
array([ 0. , 1.16200356, 0.99256178, 0.81930973, 0.65479862,
0.51021576, 0.3896221 , 0.29266142, 0. , 0. ])
import pylab as plb import pylab as plb
h1 = plb.plot(x, f) # 1D probability density plot h1 = plb.plot(x, f) # 1D probability density plot
t = np.trapz(f, x) t = np.trapz(f, x)
@ -125,11 +135,13 @@ class TKDE(object):
self.alpha = alpha self.alpha = alpha
self.xmin = xmin self.xmin = xmin
self.xmax = xmax self.xmax = xmax
self.inc = inc
self.L2 = L2 self.L2 = L2
self.d, self.n = self.dataset.shape self.d, self.n = self.dataset.shape
self.initialize() self.initialize()
def initialize(self): def initialize(self):
self._set_xlimits()
tdataset = self._dat2gaus(self.dataset) tdataset = self._dat2gaus(self.dataset)
xmin = self.xmin xmin = self.xmin
if xmin is not None: if xmin is not None:
@ -137,8 +149,26 @@ class TKDE(object):
xmax = self.xmax xmax = self.xmax
if xmax is not None: if xmax is not None:
xmax = self._dat2gaus(xmax) xmax = self._dat2gaus(xmax)
self.kde = KDE(tdataset, self.hs, self.kernel, self.alpha, xmin, xmax, self.tkde = KDE(tdataset, self.hs, self.kernel, self.alpha, xmin, xmax,
self.inc) self.inc)
def _set_xlimits(self):
amin = self.dataset.min(axis=-1)
amax = self.dataset.max(axis=-1)
xyzrange = amax-amin
offset = xyzrange/4.0
if self.xmin is None:
self.xmin = amin - offset
else:
self.xmin = self.xmin * np.ones(self.d)
if self.xmax is None:
self.xmax = amax + offset
else:
self.xmax = self.xmax * np.ones(self.d)
if self.L2 is not None:
L2 = np.atleast_1d(self.L2) * np.ones(self.d) # default no transformation
self.xmin = np.where(L2!=1, np.maximum(self.xmin, amin/2.0), self.xmin)
def _check_shape(self, points): def _check_shape(self, points):
points = atleast_2d(points) points = atleast_2d(points)
@ -160,11 +190,22 @@ class TKDE(object):
L2 = np.atleast_1d(self.L2) * np.ones(self.d) # default no transformation L2 = np.atleast_1d(self.L2) * np.ones(self.d) # default no transformation
tpoints = points.copy() tpoints = copy.copy(points)
for i, v2 in enumerate(L2.tolist()): for i, v2 in enumerate(L2.tolist()):
tpoints[i] = np.where(v2 == 0, np.log(points[i]), points[i] ** v2) tpoints[i] = np.log(points[i]) if v2 == 0 else points[i] ** v2
return tpoints return tpoints
def _gaus2dat(self, tpoints):
if self.L2 is None:
return tpoints # default no transformation
L2 = np.atleast_1d(self.L2) * np.ones(self.d) # default no transformation
points = copy.copy(tpoints)
for i, v2 in enumerate(L2.tolist()):
points[i] = np.exp(tpoints[i]) if v2 == 0 else tpoints[i] ** (1.0/v2)
return points
def _scale_pdf(self, pdf, points): def _scale_pdf(self, pdf, points):
if self.L2 is None: if self.L2 is None:
return pdf return pdf
@ -177,7 +218,70 @@ class TKDE(object):
transformation. Check the KDE for spurious spikes''' transformation. Check the KDE for spurious spikes'''
warnings.warn(msg) warnings.warn(msg)
return pdf return pdf
def eval_grid_fast(self, *args):
"""Evaluate the estimated pdf on a grid.
Parameters
----------
arg_0,arg_1,... arg_d-1 : vectors
Alternatively, if no vectors is passed in then
arg_i = linspace(self.xmin[i], self.xmax[i], self.inc)
Returns
-------
values : array-like
The values evaluated at meshgrid(*args).
"""
if self.L2 is None:
f = self.tkde.eval_grid_fast(*args)
self.args = self.tkde.args
return f
#targs = self._dat2gaus(list(args)) if len(args) else args
tf = self.tkde.eval_grid_fast()
self.args = self._gaus2dat(list(self.tkde.args))
points = meshgrid(*self.args) if self.d>1 else self.args
f = self._scale_pdf(tf, points)
if len(args):
if self.d==1:
pdf = interpolate.interp1d(points[0],f, bounds_error=False, fill_value=0.0)
elif self.d==2:
pdf = interpolate.interp2d(points[0],points[1], f, bounds_error=False, fill_value=0.0)
ipoints = meshgrid(*args) if self.d>1 else args
fi = pdf(*ipoints)
fi.shape = ipoints[0].shape
return fi
return f
def eval_grid(self, *args):
"""Evaluate the estimated pdf on a grid.
Parameters
----------
arg_0,arg_1,... arg_d-1 : vectors
Alternatively, if no vectors is passed in then
arg_i = linspace(self.xmin[i], self.xmax[i], self.inc)
Returns
-------
values : array-like
The values evaluated at meshgrid(*args).
"""
if len(args)==0:
args = []
for i in range(self.d):
args.append(np.linspace(self.xmin[i], self.xmax[i], self.inc))
self.args = args
if self.L2 is None:
return self.tkde.eval_grid(*args)
targs = self._dat2gaus(list(args))
tf = self.tkde.eval_grid(*targs)
points = meshgrid(*args) if self.d>1 else self.args
f = self._scale_pdf(tf, points)
return f
return self.tkde.eval_grid(*args)
def evaluate(self, points): def evaluate(self, points):
"""Evaluate the estimated pdf on a set of points. """Evaluate the estimated pdf on a set of points.
@ -198,10 +302,10 @@ class TKDE(object):
the dimensionality of the KDE. the dimensionality of the KDE.
""" """
if self.L2 is None: if self.L2 is None:
return self.kde(points) return self.tkde(points)
points = self._check_shape(points) points = self._check_shape(points)
tpoints = self._dat2gaus(points) tpoints = self._dat2gaus(points)
tf = self.kde(tpoints) tf = self.tkde(tpoints)
f = self._scale_pdf(tf, points) f = self._scale_pdf(tf, points)
return f return f
@ -258,6 +362,24 @@ class KDE(object):
array([ 0.17252055, 0.41014271, 0.61349072, 0.57023834, 0.37198073, array([ 0.17252055, 0.41014271, 0.61349072, 0.57023834, 0.37198073,
0.21409279, 0.12738463, 0.07460326, 0.03956191, 0.01887164]) 0.21409279, 0.12738463, 0.07460326, 0.03956191, 0.01887164])
>>> kde.eval_grid(x)
array([ 0.17252055, 0.41014271, 0.61349072, 0.57023834, 0.37198073,
0.21409279, 0.12738463, 0.07460326, 0.03956191, 0.01887164])
>>> kde0 = wk.KDE(data, hs=0.5, alpha=0.0)
>>> kde0.evaluate(x)
array([ 0.2039735 , 0.40252503, 0.54595078, 0.52219649, 0.3906213 ,
0.26381501, 0.16407362, 0.08270612, 0.02991145, 0.00720821])
>>> kde0.eval_grid(x)
array([ 0.2039735 , 0.40252503, 0.54595078, 0.52219649, 0.3906213 ,
0.26381501, 0.16407362, 0.08270612, 0.02991145, 0.00720821])
>>> f = kde0.eval_grid_fast()
>>> np.interp(x, kde0.args[0], f)
array([ 0.54344 , 1.04793706, 1.38047458, 1.28324876, 0.943131 ,
0.63570524, 0.39404219, 0.19450807, 0.08505344, 0.08505344])
import pylab as plb import pylab as plb
h1 = plb.plot(x, f) # 1D probability density plot h1 = plb.plot(x, f) # 1D probability density plot
t = np.trapz(f, x) t = np.trapz(f, x)
@ -345,8 +467,10 @@ class KDE(object):
""" """
if len(args)==0: if len(args)==0:
args = []
for i in range(self.d): for i in range(self.d):
args.append(np.linspace(self.xmin[i], self.xmax[i], self.inc)) args.append(np.linspace(self.xmin[i], self.xmax[i], self.inc))
self.args = args
return self._eval_grid_fast(*args) return self._eval_grid_fast(*args)
def _eval_grid_fast(self, *args): def _eval_grid_fast(self, *args):
X = np.vstack(args) X = np.vstack(args)
@ -360,16 +484,16 @@ class KDE(object):
for i in range(d): for i in range(d):
Xn.append(x0*dx[i]) Xn.append(x0*dx[i])
Xnc = meshgrid(*Xn) Xnc = meshgrid(*Xn) if d>1 else Xn
shape0 = Xnc[0].shape shape0 = Xnc[0].shape
for i in range(d): for i in range(d):
Xnc[i].shape = (-1,) Xnc[i].shape = (-1,)
Xn = np.dot(np.vstack(Xnc), self.inv_hs) Xn = np.dot(self.inv_hs, np.vstack(Xnc))
# Obtain the kernel weights. # Obtain the kernel weights.
kw = self.kernel(Xn) kw = self.kernel(Xn)/self._norm_factor
kw.shape = shape0 kw.shape = shape0
kw = np.fft.ifftshift(kw) kw = np.fft.ifftshift(kw)
fftn = np.fft.fftn fftn = np.fft.fftn
@ -401,13 +525,15 @@ class KDE(object):
""" """
if len(args)==0: if len(args)==0:
args = []
for i in range(self.d): for i in range(self.d):
args.append(np.linspace(self.xmin[i], self.xmax[i], self.inc)) args.append(np.linspace(self.xmin[i], self.xmax[i], self.inc))
self.args = args
return self._eval_grid(*args) return self._eval_grid(*args)
def _eval_grid(self, *args): def _eval_grid(self, *args):
grd = meshgrid(*args) grd = meshgrid(*args) if len(args)>1 else list(args)
shape0 = grd[0].shape shape0 = grd[0].shape
d = len(grd) d = len(grd)
for i in range(d): for i in range(d):

@ -166,7 +166,6 @@ def test_gridcount_2D():
[ 0.02063536, 0.31054405, 0.71865964, 0.13486633, 0. ], [ 0.02063536, 0.31054405, 0.71865964, 0.13486633, 0. ],
[ 0. , 0. , 0. , 0. , 0. ]]) [ 0. , 0. , 0. , 0. , 0. ]])
h = plb.plot(x, c, '.') # 1D histogram h = plb.plot(x, c, '.') # 1D histogram
h1 = plb.plot(x, c / dx / N) # 1D probability density plot h1 = plb.plot(x, c / dx / N) # 1D probability density plot

Loading…
Cancel
Save