diff --git a/src/kernelutilities.jl b/src/kernelutilities.jl index 8e7808e..d99b118 100644 --- a/src/kernelutilities.jl +++ b/src/kernelutilities.jl @@ -5,8 +5,8 @@ function kernelstatistics{T<:AbstractFloat}(K::Matrix{T}) (n = size(K,1)) == size(K,2) || throw(DimensionMismatch("Kernel matrix must be square.")) μ_κ = vec(sum(K,1)) - μ_k = sum(κ)/(n^2) - broadcast!(/, κ, κ, n) + μ_k = sum(μ_κ)/(n^2) + broadcast!(/, μ_κ, μ_κ, n) return (μ_κ, μ_k) end @@ -22,7 +22,7 @@ function center_symmetric!{T<:AbstractFloat}(KC::KernelCenterer{T}, K::Matrix{T} μ_κ = KC.mu_kappa length(μ_κ) == n || throw(DimensionMismatch("Kernel statistics do not match matrix.")) for j = 1:n, i = 1:n - @inbounds K[i,j] += μ_k - 2*μ_κ[i] + @inbounds K[i,j] += μ_k - μ_κ[i] - μ_κ[j] end return K end diff --git a/test/kernelutilities.jl b/test/kernelutilities.jl index 646fbc3..a8147eb 100644 --- a/test/kernelutilities.jl +++ b/test/kernelutilities.jl @@ -1,4 +1,4 @@ -n = 30 +n = 3 m = 20 p = 5 @@ -16,3 +16,36 @@ for T in FloatingPointTypes N = (C'W)*C @test_approx_eq N K end + +info("Testing ", MOD.kernelstatistics.env.name) +for T in FloatingPointTypes + X = rand(T, n, n) + x, s = MOD.kernelstatistics(X) + + @test_approx_eq x vec(mean(X,1)) + @test_approx_eq s mean(X) +end + +info("Testing ", MOD.KernelCenterer.name.name) +for T in FloatingPointTypes + K = rand(T, n, n) + + k, s = MOD.kernelstatistics(K) + KC = MOD.KernelCenterer(K) + + @test_approx_eq k KC.mu_kappa + @test_approx_eq s KC.mu_k +end + +info("Testing ", MOD.center_symmetric!.env.name) +for T in FloatingPointTypes + X = rand(T, n, p) + K = X*transpose(X) + KC = MOD.KernelCenterer(K) + MOD.center_symmetric!(KC, K) + + Xc = X .- mean(X,1) + Kc = Xc*transpose(Xc) + + @test_approx_eq K Kc +end