GpFields.kt
src/jvmMain/kotlin/afield/math/gp/GpFields.kt · 35 lines
@file:afield.runtime.completion.CompletionCategory("Math")
package afield.math.gp
Gaussian-process regression of a scalar field sampled at Vec2 or Vec3 points.
gp2D and gp3D turn a list of points and their values into a GaussianProcess, with either one
noise level for every observation or one per observation; the predict overloads read the fitted
field back at a point as a GpPrediction (mean and variance).
import afield.math.linalg.Vec2
import afield.math.linalg.Vec3
fun gp2D(points: List<Vec2>, values: DoubleArray, kernel: GpKernel = GpKernels.rbf(), noiseStd: Double = 0.0,
Scalar values over the plane. Kernel length scales are measured in Vec2 coordinate units.
fun gp2D(points: List<Vec2>, values: DoubleArray, kernel: GpKernel = GpKernels.rbf(), noiseStd: Double = 0.0,
mean: (DoubleArray) -> Double = { 0.0 }, numerics: GpNumerics = GpNumerics()): GaussianProcess =
gp2D(points, values, DoubleArray(values.size) { noiseStd }, kernel, mean, numerics)
fun gp2D(points: List<Vec2>, values: DoubleArray, noiseStd: DoubleArray, kernel: GpKernel = GpKernels.rbf(),
One noise standard deviation per point, for a survey whose samples are not equally reliable.
fun gp2D(points: List<Vec2>, values: DoubleArray, noiseStd: DoubleArray, kernel: GpKernel = GpKernels.rbf(),
mean: (DoubleArray) -> Double = { 0.0 }, numerics: GpNumerics = GpNumerics()): GaussianProcess =
GaussianProcess.fit(Array(points.size) { doubleArrayOf(points[it].x.toDouble(), points[it].y.toDouble()) }, values, kernel, noiseStd, mean, numerics, 2)
fun gp3D(points: List<Vec3>, values: DoubleArray, kernel: GpKernel = GpKernels.rbf(), noiseStd: Double = 0.0,
Scalar values over space, distinct from a vector-valued parametric curve.
fun gp3D(points: List<Vec3>, values: DoubleArray, kernel: GpKernel = GpKernels.rbf(), noiseStd: Double = 0.0,
mean: (DoubleArray) -> Double = { 0.0 }, numerics: GpNumerics = GpNumerics()): GaussianProcess =
gp3D(points, values, DoubleArray(values.size) { noiseStd }, kernel, mean, numerics)
fun gp3D(points: List<Vec3>, values: DoubleArray, noiseStd: DoubleArray, kernel: GpKernel = GpKernels.rbf(),
One noise standard deviation per point, for a volume sampled at differing quality.
fun gp3D(points: List<Vec3>, values: DoubleArray, noiseStd: DoubleArray, kernel: GpKernel = GpKernels.rbf(),
mean: (DoubleArray) -> Double = { 0.0 }, numerics: GpNumerics = GpNumerics()): GaussianProcess =
GaussianProcess.fit(Array(points.size) { doubleArrayOf(points[it].x.toDouble(), points[it].y.toDouble(), points[it].z.toDouble()) }, values, kernel, noiseStd, mean, numerics, 3)
fun GaussianProcess.predict(point: Vec2): GpPrediction
Read the fitted field back at a point, without unpacking its coordinates first.
fun GaussianProcess.predict(point: Vec2): GpPrediction = predict(point.x.toDouble(), point.y.toDouble())
fun GaussianProcess.predict(point: Vec3): GpPrediction
Read the fitted field back at a point in space, without unpacking its coordinates first.
fun GaussianProcess.predict(point: Vec3): GpPrediction = predict(point.x.toDouble(), point.y.toDouble(), point.z.toDouble())