Linear interpolation.
This kind of interpolation is calculated by fitting polynomials of the first degree between each pair of given points.
This means that for points $(x_0, y_0), (x_1, y_1)$, the predictive polynomial will be given by: $$ \begin{cases} y = ax + b \newline a = \dfrac{y_1 - y_0}{x_1 - x_0} \newline b = y_1 - ax_1 = y_0 - ax_0 \end{cases} $$
Linear interpolation has $O(N)$ time and space complexity where $N$ is the number of points.
Summary
Types
Functions
Fits a linear interpolation of the given (x, y) points
Inputs are expected to be rank-1 tensors with the same shape and at least 2 entries.
Examples
iex> x = Nx.iota({3})
iex> y = Nx.tensor([2.0, 0.0, 1.0])
iex> Scholar.Interpolation.Linear.fit(x, y)
%Scholar.Interpolation.Linear{
coefficients: Nx.tensor(
[
[-2.0, 2.0],
[1.0, -1.0]
]
),
x: Nx.tensor(
[0, 1, 2]
)
}
Returns the value fit by fit/2 corresponding to the target_x input.
Examples
iex> x = Nx.iota({3})
iex> y = Nx.tensor([2.0, 0.0, 1.0])
iex> model = Scholar.Interpolation.Linear.fit(x, y)
iex> Scholar.Interpolation.Linear.predict(model, Nx.tensor([[1.0, 4.0], [3.0, 7.0]]))
Nx.tensor(
[
[0.0, 3.0],
[2.0, 6.0]
]
)
iex> x = Nx.iota({5})
iex> y = Nx.tensor([2.0, 0.0, 1.0, 3.0, 4.0])
iex> model = Scholar.Interpolation.Linear.fit(x, y)
iex> target_x = Nx.tensor([-2, -1, 1.25, 3, 3.25, 5.0])
iex> Scholar.Interpolation.Linear.predict(model, target_x, left: 0.0, right: 10.0)
#Nx.Tensor<
f32[6]
[0.0, 0.0, 0.25, 3.0, 3.25, 10.0]
>