Skip to content

Commit 26529d9

Browse files
committed
Merge branch 'master' into weights
2 parents 7ad63b0 + d7524ff commit 26529d9

File tree

9 files changed

+56
-50
lines changed

9 files changed

+56
-50
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
[![Build Status](https://travis-ci.org/JuliaStats/KernelDensity.jl.svg?branch=master)](https://travis-ci.org/JuliaStats/KernelDensity.jl)
44
[![Coverage Status](https://coveralls.io/repos/github/JuliaStats/KernelDensity.jl/badge.svg)](https://coveralls.io/github/JuliaStats/KernelDensity.jl)
5-
[![KernelDensity](http://pkg.julialang.org/badges/KernelDensity_0.4.svg)](http://pkg.julialang.org/?pkg=KernelDensity&ver=0.4)
5+
[![KernelDensity](http://pkg.julialang.org/badges/KernelDensity_0.4.svg)](http://pkg.julialang.org/?pkg=KernelDensity)
66
[![KernelDensity](http://pkg.julialang.org/badges/KernelDensity_0.5.svg)](http://pkg.julialang.org/?pkg=KernelDensity)
7+
[![KernelDensity](http://pkg.julialang.org/badges/KernelDensity_0.6.svg)](http://pkg.julialang.org/?pkg=KernelDensity)
78

89
Kernel density estimators for Julia.
910

REQUIRE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
julia 0.4
2+
Compat 0.17
23
StatsBase
34
Distributions
45
Optim
56
Interpolations
6-
Compat

src/KernelDensity.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
VERSION >= v"0.4.0-dev+6521" && __precompile__()
1+
__precompile__()
22

33
module KernelDensity
44

5+
using Compat
56
using StatsBase
67
using Distributions
78
using Optim
89
using Interpolations
9-
using Compat
1010

1111
import Base: conv
1212
import StatsBase: RealVector, RealMatrix
1313
import Distributions: twoπ, pdf
1414

1515
export kde, kde_lscv, UnivariateKDE, BivariateKDE, InterpKDE, pdf
1616

17-
abstract AbstractKDE
17+
@compat abstract type AbstractKDE end
1818

1919
include("univariate.jl")
2020
include("bivariate.jl")

src/bivariate.jl

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,32 @@ type BivariateKDE{Rx<:Range,Ry<:Range} <: AbstractKDE
55
density::Matrix{Float64}
66
end
77

8-
function kernel_dist{D<:UnivariateDistribution}(::Type{D},w::(@compat Tuple{Real,Real}))
8+
function kernel_dist{D<:UnivariateDistribution}(::Type{D},w::Tuple{Real,Real})
99
kernel_dist(D,w[1]), kernel_dist(D,w[2])
1010
end
11-
function kernel_dist{Dx<:UnivariateDistribution,Dy<:UnivariateDistribution}(::Type{(@compat Tuple{Dx, Dy})},w::(@compat Tuple{Real,Real}))
11+
function kernel_dist{Dx<:UnivariateDistribution,Dy<:UnivariateDistribution}(::Type{Tuple{Dx, Dy}},w::Tuple{Real,Real})
1212
kernel_dist(Dx,w[1]), kernel_dist(Dy,w[2])
1313
end
1414

15+
if VERSION >= v"0.6.0-dev.2123"
16+
const DataTypeOrUnionAll = Union{DataType, UnionAll}
17+
else
18+
const DataTypeOrUnionAll = DataType
19+
end
20+
1521
# this function provided for backwards compatibility, though it doesn't have the type restrictions
1622
# to ensure that the given tuple only contains univariate distributions
17-
function kernel_dist(d::(@compat Tuple{DataType, DataType}),w::(@compat Tuple{Real,Real}))
23+
function kernel_dist(d::Tuple{DataTypeOrUnionAll, DataTypeOrUnionAll}, w::Tuple{Real,Real})
1824
kernel_dist(d[1],w[1]), kernel_dist(d[2],w[2])
1925
end
2026

2127
# TODO: there are probably better choices.
22-
function default_bandwidth(data::(@compat Tuple{RealVector,RealVector}))
28+
function default_bandwidth(data::Tuple{RealVector,RealVector})
2329
default_bandwidth(data[1]), default_bandwidth(data[2])
2430
end
2531

2632
# tabulate data for kde
27-
function tabulate(data::(@compat Tuple{RealVector, RealVector}), midpoints::(@compat Tuple{Range, Range}), weights::Weights = default_weights(data))
33+
function tabulate(data::Tuple{RealVector, RealVector}, midpoints::Tuple{Range, Range}, weights::Weights = default_weights(data))
2834
xdata, ydata = data
2935
ndata = length(xdata)
3036
length(ydata) == ndata || error("data vectors must be of same length")
@@ -56,7 +62,7 @@ function tabulate(data::(@compat Tuple{RealVector, RealVector}), midpoints::(@co
5662
end
5763

5864
# convolution with product distribution of two univariates distributions
59-
function conv(k::BivariateKDE, dist::(@compat Tuple{UnivariateDistribution,UnivariateDistribution}) )
65+
function conv(k::BivariateKDE, dist::Tuple{UnivariateDistribution,UnivariateDistribution})
6066
# Transform to Fourier basis
6167
Kx, Ky = size(k.density)
6268
ft = rfft(k.density)
@@ -81,19 +87,19 @@ function conv(k::BivariateKDE, dist::(@compat Tuple{UnivariateDistribution,Univa
8187
BivariateKDE(k.x, k.y, dens)
8288
end
8389

84-
typealias BivariateDistribution @compat(Union{MultivariateDistribution,Tuple{UnivariateDistribution,UnivariateDistribution}})
90+
const BivariateDistribution = Union{MultivariateDistribution,Tuple{UnivariateDistribution,UnivariateDistribution}}
8591

86-
default_weights(data::(@compat Tuple{RealVector, RealVector})) = UniformWeights(length(data[1]))
92+
default_weights(data::Tuple{RealVector, RealVector}) = UniformWeights(length(data[1]))
8793

88-
function kde(data::(@compat Tuple{RealVector, RealVector}), weights::Weights, midpoints::(@compat Tuple{Range, Range}), dist::BivariateDistribution)
94+
function kde(data::Tuple{RealVector, RealVector}, weights::Weights, midpoints::Tuple{Range, Range}, dist::BivariateDistribution)
8995
k = tabulate(data, midpoints, weights)
9096
conv(k,dist)
9197
end
9298

93-
function kde(data::(@compat Tuple{RealVector, RealVector}), dist::BivariateDistribution;
94-
boundary::(@compat Tuple{(@compat Tuple{Real,Real}),(@compat Tuple{Real,Real})}) = (kde_boundary(data[1],std(dist[1])),
99+
function kde(data::Tuple{RealVector, RealVector}, dist::BivariateDistribution;
100+
boundary::Tuple{Tuple{Real,Real}, Tuple{Real,Real}} = (kde_boundary(data[1],std(dist[1])),
95101
kde_boundary(data[2],std(dist[2]))),
96-
npoints::(@compat Tuple{Int,Int})=(256,256),
102+
npoints::Tuple{Int,Int}=(256,256),
97103
weights::Weights = default_weights(data))
98104

99105
xmid = kde_range(boundary[1],npoints[1])
@@ -102,19 +108,19 @@ function kde(data::(@compat Tuple{RealVector, RealVector}), dist::BivariateDistr
102108
kde(data,weights,(xmid,ymid),dist)
103109
end
104110

105-
function kde(data::(@compat Tuple{RealVector, RealVector}), midpoints::(@compat Tuple{Range, Range});
111+
function kde(data::Tuple{RealVector, RealVector}, midpoints::Tuple{Range, Range};
106112
bandwidth=default_bandwidth(data), kernel=Normal, weights::Weights = default_weights(data))
107113

108114
dist = kernel_dist(kernel,bandwidth)
109115
kde(data,weights,midpoints,dist)
110116
end
111117

112-
function kde(data::(@compat Tuple{RealVector, RealVector});
118+
function kde(data::Tuple{RealVector, RealVector};
113119
bandwidth=default_bandwidth(data),
114120
kernel=Normal,
115-
boundary::(@compat Tuple{(@compat Tuple{Real,Real}),(@compat Tuple{Real,Real})}) = (kde_boundary(data[1],bandwidth[1]),
121+
boundary::Tuple{Tuple{Real,Real}, Tuple{Real,Real}} = (kde_boundary(data[1],bandwidth[1]),
116122
kde_boundary(data[2],bandwidth[2])),
117-
npoints::(@compat Tuple{Int,Int})=(256,256),
123+
npoints::Tuple{Int,Int}=(256,256),
118124
weights::Weights = default_weights(data))
119125

120126
dist = kernel_dist(kernel,bandwidth)

src/interp.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import Interpolations: interpolate
1+
import Interpolations: interpolate, scale
22

33
type InterpKDE{K,I} <: AbstractKDE
44
kde::K
55
itp::I
6-
InterpKDE(kde,itp) = new(kde,itp)
6+
@compat (::Type{InterpKDE{K,I}}){K,I}(kde::K, itp::I) = new{K,I}(kde, itp)
77
end
88

99

src/univariate.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ end
88
kernel_dist(::Type{Normal},w::Real) = Normal(0.0,w)
99
kernel_dist(::Type{Uniform},w::Real) = (s = 1.7320508075688772*w; Uniform(-s,s))
1010

11-
typealias LocationScale @compat(Union{Laplace,Logistic,SymTriangularDist})
11+
const LocationScale = Union{Laplace,Logistic,SymTriangularDist}
1212
kernel_dist{D}(::Type{D},w::Real) = (s = w/std(D(0.0,1.0)); D(0.0,s))
1313

1414

@@ -62,7 +62,7 @@ function kde_boundary(data::RealVector, bandwidth::Real)
6262
end
6363

6464
# convert boundary and npoints to Range object
65-
function kde_range(boundary::(@compat Tuple{Real,Real}), npoints::Int)
65+
function kde_range(boundary::Tuple{Real,Real}, npoints::Int)
6666
lo, hi = boundary
6767
lo < hi || error("boundary (a,b) must have a < b")
6868

@@ -142,7 +142,7 @@ function kde(data::RealVector, weights::Weights, midpoints::Range, dist::Univari
142142
end
143143

144144
function kde(data::RealVector, dist::UnivariateDistribution;
145-
boundary::(@compat Tuple{Real,Real})=kde_boundary(data,std(dist)), npoints::Int=2048, weights=default_weights(data))
145+
boundary::Tuple{Real,Real}=kde_boundary(data,std(dist)), npoints::Int=2048, weights=default_weights(data))
146146

147147
midpoints = kde_range(boundary,npoints)
148148
kde(data,weights,midpoints,dist)
@@ -156,7 +156,7 @@ function kde(data::RealVector, midpoints::Range;
156156
end
157157

158158
function kde(data::RealVector; bandwidth=default_bandwidth(data), kernel=Normal,
159-
npoints::Int=2048, boundary::(@compat Tuple{Real,Real})=kde_boundary(data,bandwidth), weights=default_weights(data))
159+
npoints::Int=2048, boundary::Tuple{Real,Real}=kde_boundary(data,bandwidth), weights=default_weights(data))
160160
bandwidth > 0.0 || error("Bandwidth must be positive")
161161
dist = kernel_dist(kernel,bandwidth)
162162
kde(data,dist;boundary=boundary,npoints=npoints,weights=weights)
@@ -169,7 +169,7 @@ end
169169

170170
function kde_lscv(data::RealVector, midpoints::Range;
171171
kernel=Normal,
172-
bandwidth_range::(@compat Tuple{Real,Real})=(h=default_bandwidth(data); (0.25*h,1.5*h)),
172+
bandwidth_range::Tuple{Real,Real}=(h=default_bandwidth(data); (0.25*h,1.5*h)),
173173
weights=default_weights(data))
174174

175175
ndata = length(data)
@@ -179,7 +179,7 @@ function kde_lscv(data::RealVector, midpoints::Range;
179179
K = length(k.density)
180180
ft = rfft(k.density)
181181

182-
ft2 = abs2(ft)
182+
ft2 = @compat(abs2.(ft))
183183
c = -twoπ/(step(k.x)*K)
184184
hlb, hub = bandwidth_range
185185

@@ -193,7 +193,7 @@ function kde_lscv(data::RealVector, midpoints::Range;
193193
ψ*step(k.x)/K + pdf(dist,0.0)/ndata
194194
end
195195

196-
dist = kernel_dist(kernel, opt.minimum)
196+
dist = kernel_dist(kernel, Optim.minimizer(opt))
197197
for j = 0:length(ft)-1
198198
ft[j+1] *= cf(dist, j*c)
199199
end
@@ -209,10 +209,10 @@ function kde_lscv(data::RealVector, midpoints::Range;
209209
end
210210

211211
function kde_lscv(data::RealVector;
212-
boundary::(@compat Tuple{Real,Real})=kde_boundary(data,default_bandwidth(data)),
212+
boundary::Tuple{Real,Real}=kde_boundary(data,default_bandwidth(data)),
213213
npoints::Int=2048,
214214
kernel=Normal,
215-
bandwidth_range::(@compat Tuple{Real,Real})=(h=default_bandwidth(data); (0.25*h,1.5*h)),
215+
bandwidth_range::Tuple{Real,Real}=(h=default_bandwidth(data); (0.25*h,1.5*h)),
216216
weights::Weights = default_weights(data))
217217

218218
midpoints = kde_range(boundary,npoints)

test/bivariate.jl

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
using Base.Test
22
using Distributions
33
using KernelDensity
4-
using Compat
54

65
import KernelDensity: kernel_dist, default_bandwidth, kde_boundary, kde_range, tabulate
76

8-
for D in [(@compat Tuple{Normal,Normal}),(@compat Tuple{Uniform,Uniform}),(@compat Tuple{Logistic,Logistic}),
7+
for D in [Tuple{Normal,Normal}, Tuple{Uniform,Uniform}, Tuple{Logistic,Logistic},
98
(Normal, Normal), (Uniform, Uniform), (Logistic, Logistic)]
109
d = KernelDensity.kernel_dist(D,(0.5,0.5))
1110
dx,dy = d
1211
@test mean(dx) == 0.0
1312
@test mean(dy) == 0.0
14-
@test_approx_eq std(dx) 0.5
15-
@test_approx_eq std(dy) 0.5
13+
@test std(dx) 0.5
14+
@test std(dy) 0.5
1615
end
1716

1817
r = kde_range((-2.0,2.0), 128)
@@ -31,31 +30,31 @@ for X in ([0.0], [0.0,0.0], [0.0,0.5], [-0.5:0.1:0.5;])
3130
@test isa(k1,BivariateKDE)
3231
@test size(k1.density) == (length(k1.x), length(k1.y))
3332
@test all(k1.density .>= 0.0)
34-
@test_approx_eq sum(k1.density)*step(k1.x)*step(k1.y) 1.0
33+
@test sum(k1.density)*step(k1.x)*step(k1.y) 1.0
3534

36-
k2 = conv(k1,kernel_dist((@compat Tuple{D,D}),(0.1,0.1)))
35+
k2 = conv(k1,kernel_dist(Tuple{D,D}, (0.1,0.1)))
3736
@test isa(k2,BivariateKDE)
3837
@test size(k2.density) == (length(k2.x), length(k2.y))
3938
@test all(k2.density .>= 0.0)
40-
@test_approx_eq sum(k2.density)*step(k2.x)*step(k2.y) 1.0
39+
@test sum(k2.density)*step(k2.x)*step(k2.y) 1.0
4140

4241
k3 = kde((X,X);kernel=D)
4342
@test isa(k3,BivariateKDE)
4443
@test size(k3.density) == (length(k3.x), length(k3.y))
4544
@test all(k3.density .>= 0.0)
46-
@test_approx_eq sum(k3.density)*step(k3.x)*step(k3.y) 1.0
45+
@test sum(k3.density)*step(k3.x)*step(k3.y) 1.0
4746

4847
k4 = kde((X,X),(r,r);kernel=D)
4948
@test isa(k4,BivariateKDE)
5049
@test size(k4.density) == (length(k4.x), length(k4.y))
5150
@test all(k4.density .>= 0.0)
52-
@test_approx_eq sum(k4.density)*step(k4.x)*step(k4.y) 1.0
51+
@test sum(k4.density)*step(k4.x)*step(k4.y) 1.0
5352

5453
k5 = kde([X X];kernel=D)
5554
@test isa(k5,BivariateKDE)
5655
@test size(k5.density) == (length(k5.x), length(k5.y))
5756
@test all(k5.density .>= 0.0)
58-
@test_approx_eq sum(k5.density)*step(k5.x)*step(k5.y) 1.0
57+
@test sum(k5.density)*step(k5.x)*step(k5.y) 1.0
5958

6059
end
6160
end

test/interp.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ X = randn(100)
55
Y = randn(100)
66

77
k = kde(X)
8-
@test_approx_eq pdf(k, k.x) k.density
8+
@test pdf(k, k.x) k.density
99

1010
k = kde((X,Y))
11-
@test_approx_eq pdf(k, k.x, k.y) k.density
11+
@test pdf(k, k.x, k.y) k.density

test/univariate.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ for D in [Normal,Uniform,Logistic]
88
d = kernel_dist(D,0.5)
99
@test isa(d,D)
1010
@test mean(d) == 0.0
11-
@test_approx_eq std(d) 0.5
11+
@test std(d) 0.5
1212
end
1313

1414
r = kde_range((-2.0,2.0), 128)
@@ -27,31 +27,31 @@ for X in ([0.0], [0.0,0.0], [0.0,0.5], [-0.5:0.1:0.5;])
2727
@test isa(k1,UnivariateKDE)
2828
@test length(k1.density) == length(k1.x)
2929
@test all(k1.density .>= 0.0)
30-
@test_approx_eq sum(k1.density)*step(k1.x) 1.0
30+
@test sum(k1.density)*step(k1.x) 1.0
3131

3232
k2 = conv(k1,kernel_dist(D,0.1))
3333
@test isa(k2,UnivariateKDE)
3434
@test length(k2.density) == length(k2.x)
3535
@test all(k2.density .>= 0.0)
36-
@test_approx_eq sum(k2.density)*step(k2.x) 1.0
36+
@test sum(k2.density)*step(k2.x) 1.0
3737

3838
k3 = kde(X;kernel=D)
3939
@test isa(k3,UnivariateKDE)
4040
@test length(k3.density) == length(k3.x)
4141
@test all(k3.density .>= 0.0)
42-
@test_approx_eq sum(k3.density)*step(k3.x) 1.0
42+
@test sum(k3.density)*step(k3.x) 1.0
4343

4444
k4 = kde(X,r;kernel=D)
4545
@test isa(k4,UnivariateKDE)
4646
@test length(k4.density) == length(k4.x)
4747
@test all(k4.density .>= 0.0)
48-
@test_approx_eq sum(k4.density)*step(k4.x) 1.0
48+
@test sum(k4.density)*step(k4.x) 1.0
4949

5050
k5 = kde_lscv(X)
5151
@test isa(k5,UnivariateKDE)
5252
@test length(k5.density) == length(k5.x)
5353
@test all(k5.density .>= 0.0)
54-
@test_approx_eq sum(k5.density)*step(k5.x) 1.0
54+
@test sum(k5.density)*step(k5.x) 1.0
5555

5656
k6 = kde(X,r;kernel=D, weights=ones(X)/length(X)))
5757
@test_approx_eq k4.density k6.density

0 commit comments

Comments
 (0)