|
|
|
'''
|
|
|
|
Created on 20. nov. 2010
|
|
|
|
|
|
|
|
@author: pab
|
|
|
|
'''
|
|
|
|
from __future__ import division
|
|
|
|
import unittest
|
|
|
|
import numpy as np
|
|
|
|
from numpy.testing import assert_allclose
|
|
|
|
import wafo.objects as wo
|
|
|
|
import wafo.kdetools as wk
|
|
|
|
import scipy.stats as st
|
|
|
|
|
|
|
|
|
|
|
|
class TestKde(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
|
|
|
# N = 20
|
|
|
|
# data = np.random.rayleigh(1, size=(N,))
|
|
|
|
self.data = np.array([0.75355792, 0.72779194, 0.94149169, 0.07841119,
|
|
|
|
2.32291887, 1.10419995, 0.77055114, 0.60288273,
|
|
|
|
1.36883635, 1.74754326, 1.09547561, 1.01671133,
|
|
|
|
0.73211143, 0.61891719, 0.75903487, 1.8919469,
|
|
|
|
0.72433808, 1.92973094, 0.44749838, 1.36508452])
|
|
|
|
self.x = np.linspace(0, max(self.data) + 1, 10)
|
|
|
|
|
|
|
|
def test0_KDE1D(self):
|
|
|
|
data, x = self.data, self.x
|
|
|
|
|
|
|
|
kde0 = wk.KDE(data, hs=0.5, alpha=0.0, inc=16)
|
|
|
|
|
|
|
|
fx = kde0.eval_grid(x)
|
|
|
|
assert_allclose(fx, [0.2039735, 0.40252503, 0.54595078,
|
|
|
|
0.52219649, 0.3906213, 0.26381501, 0.16407362,
|
|
|
|
0.08270612, 0.02991145, 0.00720821])
|
|
|
|
|
|
|
|
fx = kde0.eval_grid(x, r=1)
|
|
|
|
assert_allclose(-fx, [0.11911419724002906, 0.13440000694772541,
|
|
|
|
0.044400116190638696, -0.0677695267531197,
|
|
|
|
-0.09555596523854318, -0.07498819087690148,
|
|
|
|
-0.06167607128369182, -0.04678588231996062,
|
|
|
|
-0.024515979196411814, -0.008022010381009501])
|
|
|
|
|
|
|
|
fx = kde0.eval_grid(x, r=2)
|
|
|
|
assert_allclose(fx, [0.08728138131197069, 0.07558648034784508,
|
|
|
|
0.05093715852686607, 0.07908624791267539,
|
|
|
|
0.10495675573359599, 0.07916167222333347,
|
|
|
|
0.048168330179460386, 0.03438361415806721,
|
|
|
|
0.02197927811015286, 0.009222988165160621])
|
|
|
|
|
|
|
|
ffx = kde0.eval_grid_fast(x)
|
|
|
|
assert_allclose(ffx, [0.20729484, 0.39865044, 0.53716945, 0.5169322,
|
|
|
|
0.39060223, 0.26441126, 0.16388801, 0.08388527,
|
|
|
|
0.03227164, 0.00883579], 1e-6)
|
|
|
|
|
|
|
|
fx = kde0.eval_grid_fast(x, r=1)
|
|
|
|
assert_allclose(fx, [-0.11582450668441863, -0.12901768780183628,
|
|
|
|
-0.04402464127812092, 0.0636190549560749,
|
|
|
|
0.09345144501310157, 0.07573621607126926,
|
|
|
|
0.06149475587201987, 0.04550210608639078,
|
|
|
|
0.024427027615689087, 0.00885576504750473])
|
|
|
|
|
|
|
|
fx = kde0.eval_grid_fast(x, r=2)
|
|
|
|
assert_allclose(fx, [0.08499284131672676, 0.07572564161758065,
|
|
|
|
0.05329987919556978, 0.07849796347259348,
|
|
|
|
0.10232741197885842, 0.07869015379158453,
|
|
|
|
0.049431823916945394, 0.034527256372343613,
|
|
|
|
0.021517998409663567, 0.009527401063843402])
|
|
|
|
|
|
|
|
f = kde0.eval_grid_fast()
|
|
|
|
assert_allclose(np.trapz(f, kde0.args), 0.995001)
|
|
|
|
assert_allclose(f, [0.011494108953097538, 0.0348546729842836,
|
|
|
|
0.08799292403553607, 0.18568717590587996,
|
|
|
|
0.32473136104523725, 0.46543163412700084,
|
|
|
|
0.5453201564089711, 0.5300582814373698,
|
|
|
|
0.44447650672207173, 0.3411961246641896,
|
|
|
|
0.25103852230993573, 0.17549519961525845,
|
|
|
|
0.11072988772879173, 0.05992730870218242,
|
|
|
|
0.02687783924833738, 0.00974982785617795])
|
|
|
|
|
|
|
|
def test1_TKDE1D(self):
|
|
|
|
data = self.data
|
|
|
|
x = np.linspace(0.01, max(data) + 1, 10)
|
|
|
|
kde = wk.TKDE(data, hs=0.5, L2=0.5)
|
|
|
|
f = kde(x)
|
|
|
|
assert_allclose(f, [1.03982714, 0.45839018, 0.39514782, 0.32860602,
|
|
|
|
0.26433318, 0.20717946, 0.15907684, 0.1201074,
|
|
|
|
0.08941027, 0.06574882])
|
|
|
|
assert_allclose(np.trapz(f, x), 0.94787730659349068)
|
|
|
|
f = kde.eval_grid_fast(x)
|
|
|
|
assert_allclose(f, [1.0401892415290148, 0.45838973393693677,
|
|
|
|
0.39514689240671547, 0.32860531818532457,
|
|
|
|
0.2643330110605783, 0.20717975528556506,
|
|
|
|
0.15907696844388747, 0.12010770443337843,
|
|
|
|
0.08941129458260941, 0.06574899139165799])
|
|
|
|
f = kde.eval_grid_fast2(x)
|
|
|
|
assert_allclose(f, [1.0401892415290148, 0.45838973393693677,
|
|
|
|
0.39514689240671547, 0.32860531818532457,
|
|
|
|
0.2643330110605783, 0.20717975528556506,
|
|
|
|
0.15907696844388747, 0.12010770443337843,
|
|
|
|
0.08941129458260941, 0.06574899139165799])
|
|
|
|
assert_allclose(np.trapz(f, x), 0.9479438058416647)
|
|
|
|
|
|
|
|
def test1_KDE1D(self):
|
|
|
|
data, x = self.data, self.x
|
|
|
|
kde = wk.KDE(data, hs=0.5)
|
|
|
|
f = kde(x)
|
|
|
|
assert_allclose(f, [0.2039735, 0.40252503, 0.54595078, 0.52219649,
|
|
|
|
0.3906213, 0.26381501, 0.16407362, 0.08270612,
|
|
|
|
0.02991145, 0.00720821])
|
|
|
|
|
|
|
|
assert_allclose(np.trapz(f, x), 0.92576174424281876)
|
|
|
|
|
|
|
|
def test2_KDE1D(self):
|
|
|
|
# data, x = self.data, self.x
|
|
|
|
|
|
|
|
data = np.asarray([1, 2])
|
|
|
|
x = np.linspace(0, max(np.ravel(data)) + 1, 10)
|
|
|
|
kde = wk.KDE(data, hs=0.5)
|
|
|
|
f = kde(x)
|
|
|
|
assert_allclose(f, [0.0541248, 0.16555235, 0.33084399, 0.45293325,
|
|
|
|
0.48345808, 0.48345808, 0.45293325, 0.33084399,
|
|
|
|
0.16555235, 0.0541248])
|
|
|
|
|
|
|
|
assert_allclose(np.trapz(f, x), 0.97323338046725172)
|
|
|
|
f0 = kde(output='plot')
|
|
|
|
self.assertIsInstance(f0, wo.PlotData)
|
|
|
|
assert_allclose(np.trapz(f0.data, f0.args), 0.9319800260106625)
|
|
|
|
|
|
|
|
f0 = kde.eval_grid_fast(output='plot')
|
|
|
|
self.assertIsInstance(f0, wo.PlotData)
|
|
|
|
assert_allclose(np.trapz(f0.data, f0.args), 0.9319799696210691)
|
|
|
|
|
|
|
|
def test1a_KDE1D(self):
|
|
|
|
data, x = self.data, self.x
|
|
|
|
kde = wk.KDE(data, hs=0.5, alpha=0.5)
|
|
|
|
f = kde(x)
|
|
|
|
assert_allclose(f, [0.17252055, 0.41014271, 0.61349072, 0.57023834,
|
|
|
|
0.37198073, 0.21409279, 0.12738463, 0.07460326,
|
|
|
|
0.03956191, 0.01887164])
|
|
|
|
|
|
|
|
assert_allclose(np.trapz(f, x), 0.92938023659047952)
|
|
|
|
|
|
|
|
f0 = kde(output='plot')
|
|
|
|
self.assertIsInstance(f0, wo.PlotData)
|
|
|
|
assert_allclose(np.trapz(f0.data, f0.args), 0.9871189376720593)
|
|
|
|
|
|
|
|
f0 = kde.eval_grid_fast(output='plot')
|
|
|
|
self.assertIsInstance(f0, wo.PlotData)
|
|
|
|
assert_allclose(np.trapz(f0.data, f0.args), 0.9962507385131669)
|
|
|
|
|
|
|
|
def test2a_KDE_1D_hs_5_alpha_5(self):
|
|
|
|
# data, x = self.data, self.x
|
|
|
|
data = np.asarray([1, 2])
|
|
|
|
x = np.linspace(0, max(np.ravel(data)) + 1, 10)
|
|
|
|
kde = wk.KDE(data, hs=0.5, alpha=0.5)
|
|
|
|
f = kde(x)
|
|
|
|
assert_allclose(f, [0.0541248, 0.16555235, 0.33084399, 0.45293325,
|
|
|
|
0.48345808, 0.48345808, 0.45293325, 0.33084399,
|
|
|
|
0.16555235, 0.0541248])
|
|
|
|
|
|
|
|
assert_allclose(np.trapz(f, x), 0.97323338046725172)
|
|
|
|
|
|
|
|
def test_KDE2D(self):
|
|
|
|
# N = 20
|
|
|
|
# data = np.random.rayleigh(1, size=(2, N))
|
|
|
|
data = np.array([
|
|
|
|
[0.38103275, 0.35083136, 0.90024207, 1.88230239, 0.96815399,
|
|
|
|
0.57392873, 1.63367908, 1.20944125, 2.03887811, 0.81789145,
|
|
|
|
0.69302049, 1.40856592, 0.92156032, 2.14791432, 2.04373821,
|
|
|
|
0.69800708, 0.58428735, 1.59128776, 2.05771405, 0.87021964],
|
|
|
|
[1.44080694, 0.39973751, 1.331243, 2.48895822, 1.18894158,
|
|
|
|
1.40526085, 1.01967897, 0.81196474, 1.37978932, 2.03334689,
|
|
|
|
0.870329, 1.25106862, 0.5346619, 0.47541236, 1.51930093,
|
|
|
|
0.58861519, 1.19780448, 0.81548296, 1.56859488, 1.60653533]])
|
|
|
|
|
|
|
|
x = np.linspace(0, max(np.ravel(data)) + 1, 3)
|
|
|
|
|
|
|
|
kde0 = wk.KDE(data, hs=0.5, alpha=0.0, inc=512)
|
|
|
|
|
|
|
|
assert_allclose(kde0.eval_grid(x, x),
|
|
|
|
[[3.27260963e-02, 4.21654678e-02, 5.85338634e-04],
|
|
|
|
[6.78845466e-02, 1.42195839e-01, 1.41676003e-03],
|
|
|
|
[1.39466746e-04, 4.26983850e-03, 2.52736185e-05]])
|
|
|
|
|
|
|
|
t = [[0.0443506097653615, 0.06433530873456418, 0.0041353838654317856],
|
|
|
|
[0.07218297149063724, 0.1235819591878892, 0.009288890372002473],
|
|
|
|
[0.001613328022214066, 0.00794857884864038, 0.0005874786787715641]
|
|
|
|
]
|
|
|
|
assert_allclose(kde0.eval_grid_fast(x, x), t)
|
|
|
|
|
|
|
|
|
|
|
|
class TestRegression(unittest.TestCase):
|
|
|
|
def test_KRegression(self):
|
|
|
|
|
|
|
|
N = 51
|
|
|
|
x = np.linspace(0, 1, N)
|
|
|
|
# ei = np.random.normal(loc=0, scale=0.075, size=(N,))
|
|
|
|
ei = [0.0514233500271586, 0.00165101982431131, 0.042827107319028994,
|
|
|
|
-0.084351702283385, 0.05978024392552100, -0.07121894535738457,
|
|
|
|
0.0855578119920183, -0.0061865198365448, 0.060986773136137415,
|
|
|
|
0.0467717713275598, -0.0852368434029634, 0.09790798995780517,
|
|
|
|
-0.174003547831554, 0.1100349974247687, 0.12934695904976257,
|
|
|
|
-0.036688944487546, -0.0279545148054110, 0.09660222791922815,
|
|
|
|
-0.108463847524115, -0.0635162550551463, 0.017192887741329627,
|
|
|
|
-0.031520480101878, 0.03939880367791403, -0.06343921941793985,
|
|
|
|
0.0574763321274059, -0.1186005160931940, 0.023007133904660495,
|
|
|
|
0.0572646924609536, -0.0334012844057809, -0.03444460758658313,
|
|
|
|
0.0325434547422866, 0.06063111859444784, 0.0010264474321885913,
|
|
|
|
-0.162288671571205, 0.01334616853351956, -0.020490428895193084,
|
|
|
|
0.0446047497979159, 0.02924587567502737, 0.021177586536616458,
|
|
|
|
0.0634083218094540, -0.1506377646036794, -0.03214553797245153,
|
|
|
|
0.1850745187671265, -0.0151240946088902, -0.10599562843454335,
|
|
|
|
0.0317357805015679, -0.0736187558312158, 0.04791463883941161,
|
|
|
|
0.0660021138871709, -0.1049359954387588, 0.0034961490852392463]
|
|
|
|
# print(ei.tolist())
|
|
|
|
|
|
|
|
y = 2*np.exp(-x**2/(2*0.3**2))+3*np.exp(-(x-1)**2/(2*0.7**2)) + ei
|
|
|
|
kreg = wk.KRegression(x, y)
|
|
|
|
f = kreg(output='plotobj', title='Kernel regression', plotflag=1)
|
|
|
|
|
|
|
|
assert_allclose(f.data[::5],
|
|
|
|
[3.14313544673463, 3.14582567119112, 3.149199078830904,
|
|
|
|
3.153335095194225, 3.15813722171621, 3.16302709623568,
|
|
|
|
3.16631430398602, 3.164138775969285, 3.14947062082316,
|
|
|
|
3.11341295908516, 3.05213808272656, 2.976097561057097,
|
|
|
|
2.908020176929025, 2.867826513276857, 2.8615179445705,
|
|
|
|
2.88155232529645, 2.91307482047679, 2.942469210090470,
|
|
|
|
2.96350144269953, 2.976399025328952, 2.9836554385038,
|
|
|
|
2.987516554300354, 2.9894470264681, 2.990311688080114,
|
|
|
|
2.9906144224522406, 2.9906534916935743])
|
|
|
|
|
|
|
|
def test_BKRegression(self):
|
|
|
|
from wafo.kdetools.kdetools import _get_data
|
|
|
|
n = 51
|
|
|
|
loc1 = 0.1
|
|
|
|
scale1 = 0.6
|
|
|
|
scale2 = 0.75
|
|
|
|
# x, y, fun1 = _get_data(n, symmetric=True, loc1=loc1,
|
|
|
|
# scale1=scale1, scale2=scale2)
|
|
|
|
# print(x.tolist())
|
|
|
|
# print(y.tolist())
|
|
|
|
# dist = st.norm
|
|
|
|
# norm1 = scale2 * (dist.pdf(-loc1, loc=-loc1, scale=scale1) +
|
|
|
|
# dist.pdf(-loc1, loc=loc1, scale=scale1))
|
|
|
|
# def fun1(x):
|
|
|
|
# return ((dist.pdf(x, loc=-loc1, scale=scale1) +
|
|
|
|
# dist.pdf(x, loc=loc1, scale=scale1)) / norm1).clip(max=1.0)
|
|
|
|
x = [-2.9784022156693037, -2.923269270862857, -2.640625797489305,
|
|
|
|
-2.592465150170373, -2.5777471766751514, -2.5597898266706323,
|
|
|
|
-2.5411937415815604, -2.501753472506631, -2.4939048380402378,
|
|
|
|
-2.4747969073957368, -2.3324036659351286, -2.3228634370815,
|
|
|
|
-2.230871371173083, -2.21411949373986, -2.2035967461005335,
|
|
|
|
-2.1927287694263082, -2.1095391808427064, -2.0942500415622503,
|
|
|
|
-2.0774862883018708, -2.0700940505412, -2.054918428555726,
|
|
|
|
-1.979624045501378, -1.815804869116454, -1.780636214263252,
|
|
|
|
-1.7494324035239686, -1.723149182957688, -1.7180532497996817,
|
|
|
|
-1.7016701153705522, -1.6120633534061788, -1.5862592143187193,
|
|
|
|
-1.517561220921166, -1.5017798665502253, -1.4895432407186429,
|
|
|
|
-1.4470094450898578, -1.4302454657287063, -1.3243060491576388,
|
|
|
|
-1.293989140781724, -1.2570066577415648, -1.2332757902347795,
|
|
|
|
-1.2306697417054666, -1.0495284321772482, -0.9923351727665026,
|
|
|
|
-0.9047559818364217, -0.4092063139968012, -0.3845725606766721,
|
|
|
|
-0.30700232234899083, -0.2565844426798063, -0.25415109620097187,
|
|
|
|
-0.20223029999069952, -0.10388696244007978, -0.07822191388462896,
|
|
|
|
0.07822191388462896, 0.10388696244007978, 0.20223029999069952,
|
|
|
|
0.25415109620097187, 0.2565844426798063, 0.30700232234899083,
|
|
|
|
0.3845725606766721, 0.4092063139968012, 0.9047559818364217,
|
|
|
|
0.9923351727665026, 1.0495284321772482, 1.2306697417054666,
|
|
|
|
1.2332757902347795, 1.2570066577415648, 1.293989140781724,
|
|
|
|
1.3243060491576388, 1.4302454657287063, 1.4470094450898578,
|
|
|
|
1.4895432407186429, 1.5017798665502253, 1.517561220921166,
|
|
|
|
1.5862592143187193, 1.6120633534061788, 1.7016701153705522,
|
|
|
|
1.7180532497996817, 1.723149182957688, 1.7494324035239686,
|
|
|
|
1.780636214263252, 1.815804869116454, 1.979624045501378,
|
|
|
|
2.054918428555726, 2.0700940505412, 2.0774862883018708,
|
|
|
|
2.0942500415622503, 2.1095391808427064, 2.1927287694263082,
|
|
|
|
2.2035967461005335, 2.21411949373986, 2.230871371173083,
|
|
|
|
2.3228634370815, 2.3324036659351286, 2.4747969073957368,
|
|
|
|
2.4939048380402378, 2.501753472506631, 2.5411937415815604,
|
|
|
|
2.5597898266706323, 2.5777471766751514, 2.592465150170373,
|
|
|
|
2.640625797489305, 2.923269270862857, 2.9784022156693037]
|
|
|
|
y = [False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, True, True, True, True,
|
|
|
|
True, True, True, True, True, True, True, True, True, True, True,
|
|
|
|
True, True, True, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False, False,
|
|
|
|
False, False, False, False, False, False, False, False]
|
|
|
|
|
|
|
|
bkreg = wk.BKRegression(x, y, a=0.05, b=0.05)
|
|
|
|
fbest = bkreg.prb_search_best(hsfun='hste', alpha=0.05, color='g')
|
|
|
|
print(fbest.data[::10].tolist())
|
|
|
|
assert_allclose(fbest.data[::10],
|
|
|
|
|
|
|
|
[1.80899736e-15, 0, 6.48351162e-16, 6.61404311e-15,
|
|
|
|
1.10010120e-12, 1.36709203e-10, 1.11994766e-08,
|
|
|
|
5.73040143e-07, 1.68974054e-05, 2.68633448e-04,
|
|
|
|
2.49075176e-03, 1.48687767e-02, 5.98536245e-02,
|
|
|
|
1.74083352e-01, 4.33339557e-01, 8.26039018e-01,
|
|
|
|
9.78387628e-01, 9.98137653e-01, 9.99876002e-01,
|
|
|
|
9.99876002e-01, 9.98137653e-01, 9.78387628e-01,
|
|
|
|
8.26039018e-01, 4.33339557e-01, 1.74083352e-01,
|
|
|
|
5.98536245e-02, 1.48687767e-02, 2.49075176e-03,
|
|
|
|
2.68633448e-04, 1.68974054e-05, 5.73040143e-07,
|
|
|
|
1.11994760e-08, 1.36708818e-10, 1.09965904e-12,
|
|
|
|
5.43806309e-15, 0.0, 0, 0], atol=1e-10)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# import sys;sys.argv = ['', 'Test.testName']
|
|
|
|
unittest.main()
|