Examples

The files in examples/ are directly runnable and are included in the documentation source with literalinclude.

Basic KDE

"""Fit and evaluate an exact one-dimensional KDE."""

import numpy as np

from kern import KernelDensity


rng = np.random.default_rng(0)
data = rng.normal(size=1_000)
points = np.linspace(-3.0, 3.0, 200)

model = KernelDensity(bandwidth=0.25, kernel="gaussian").fit(data)
density = model.evaluate(points)

print(density[:5])

Bandwidth selection

"""Select a bandwidth for one kernel using log-likelihood."""

import numpy as np

from kern import BandwidthSelector, default_bandwidth_grid


rng = np.random.default_rng(1)
data = rng.normal(size=1_000)

# Omit grid to use the default.
automatic = BandwidthSelector(
    kernel="gaussian",
    cv="loo",
).fit(data)

# Or construct and pass a custom grid.
grid = default_bandwidth_grid(data, size=64, minimum=0.05, maximum=0.8)
custom = BandwidthSelector(
    grid=grid,
    kernel="epanechnikov",
    cv=5,
    parallel="evaluation",
).fit(data)

print(automatic.kernel_, automatic.best_bandwidth_)
print(custom.kernel_, custom.best_bandwidth_)

Approximate and multivariate KDE

"""Use approximate and multivariate KDE."""

import numpy as np

from kern import ApproximateKernelDensity, MultivariateKernelDensity


rng = np.random.default_rng(2)
data = rng.normal(size=2_000)
points = np.linspace(-3.0, 3.0, 200)

approximate = ApproximateKernelDensity(
    bandwidth=0.25,
    cutoff=3.5,
    memory="auto",
).fit(data)
print(approximate.evaluate(points)[:5])
# Out: [0.00523714 0.00582754 0.00646412 0.00715279 0.00789581]

matrix = rng.normal(size=(1_000, 3))
multivariate = MultivariateKernelDensity(
    bandwidth=0.4,
    kernel="gaussian",
    block_size=32,
).fit(matrix)
print(multivariate.evaluate(matrix[:5]))
# [0.01052811 0.01548928 0.00208585 0.02895958 0.03646734]