route/vendor/github.com/aclements/go-moremath/stats/kde_test.go

90 lines
2.1 KiB
Go
Raw Normal View History

2017-10-06 15:29:20 +00:00
// 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})
}