90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package stats
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestKDEOneSample(t *testing.T) {
|
||
|
x := float64(5)
|
||
|
|
||
|
// Unweighted, fixed bandwidth
|
||
|
kde := KDE{
|
||
|
Sample: Sample{Xs: []float64{x}},
|
||
|
Kernel: GaussianKernel,
|
||
|
Bandwidth: 1,
|
||
|
}
|
||
|
if e, g := StdNormal.PDF(0), kde.PDF(x); !aeq(e, g) {
|
||
|
t.Errorf("bad PDF value at sample: expected %g, got %g", e, g)
|
||
|
}
|
||
|
if e, g := 0.0, kde.PDF(-10000); !aeq(e, g) {
|
||
|
t.Errorf("bad PDF value at low tail: expected %g, got %g", e, g)
|
||
|
}
|
||
|
if e, g := 0.0, kde.PDF(10000); !aeq(e, g) {
|
||
|
t.Errorf("bad PDF value at high tail: expected %g, got %g", e, g)
|
||
|
}
|
||
|
|
||
|
if e, g := 0.5, kde.CDF(x); !aeq(e, g) {
|
||
|
t.Errorf("bad CDF value at sample: expected %g, got %g", e, g)
|
||
|
}
|
||
|
if e, g := 0.0, kde.CDF(-10000); !aeq(e, g) {
|
||
|
t.Errorf("bad CDF value at low tail: expected %g, got %g", e, g)
|
||
|
}
|
||
|
if e, g := 1.0, kde.CDF(10000); !aeq(e, g) {
|
||
|
t.Errorf("bad CDF value at high tail: expected %g, got %g", e, g)
|
||
|
}
|
||
|
|
||
|
low, high := kde.Bounds()
|
||
|
if e, g := x-2, low; e < g {
|
||
|
t.Errorf("bad low bound: expected %g, got %g", e, g)
|
||
|
}
|
||
|
if e, g := x+2, high; e > g {
|
||
|
t.Errorf("bad high bound: expected %g, got %g", e, g)
|
||
|
}
|
||
|
|
||
|
kde = KDE{
|
||
|
Sample: Sample{Xs: []float64{x}},
|
||
|
Kernel: EpanechnikovKernel,
|
||
|
Bandwidth: 2,
|
||
|
}
|
||
|
testFunc(t, fmt.Sprintf("%+v.PDF", kde), kde.PDF, map[float64]float64{
|
||
|
x - 2: 0,
|
||
|
x - 1: 0.5625 / 2,
|
||
|
x: 0.75 / 2,
|
||
|
x + 1: 0.5625 / 2,
|
||
|
x + 2: 0,
|
||
|
})
|
||
|
testFunc(t, fmt.Sprintf("%+v.CDF", kde), kde.CDF, map[float64]float64{
|
||
|
x - 2: 0,
|
||
|
x - 1: 0.15625,
|
||
|
x: 0.5,
|
||
|
x + 1: 0.84375,
|
||
|
x + 2: 1,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestKDETwoSamples(t *testing.T) {
|
||
|
kde := KDE{
|
||
|
Sample: Sample{Xs: []float64{1, 3}},
|
||
|
Kernel: GaussianKernel,
|
||
|
Bandwidth: 2,
|
||
|
}
|
||
|
testFunc(t, "PDF", kde.PDF, map[float64]float64{
|
||
|
0: 0.120395730,
|
||
|
1: 0.160228251,
|
||
|
2: 0.176032663,
|
||
|
3: 0.160228251,
|
||
|
4: 0.120395730})
|
||
|
|
||
|
testFunc(t, "CDF", kde.CDF, map[float64]float64{
|
||
|
0: 0.187672369,
|
||
|
1: 0.329327626,
|
||
|
2: 0.5,
|
||
|
3: 0.670672373,
|
||
|
4: 0.812327630})
|
||
|
}
|