gleam_community/maths/metrics


Metrics: A module offering functions for calculating distances and other types of metrics.

Functions

pub fn euclidean_distance(xarr: List(Float), yarr: List(Float)) -> Result(
  Float,
  String,
)

Calculcate the Euclidean distance between two lists (representing vectors):

\[ \left( \sum_{i=1}^n \left|x_i - y_i \right|^{2} \right)^{\frac{1}{2}} \]

In the formula, $$n$$ is the length of the two lists and $$x_i, y_i$$ are the values in the respective input lists indexed by $$i, j$$.

Example:
 import gleeunit/should
 import gleam_community/maths/elementary
 import gleam_community/maths/metrics
 import gleam_community/maths/predicates

 pub fn example () {
   let assert Ok(tol) = elementary.power(-10.0, -6.0)
 
   // Empty lists returns 0.0
   metrics.euclidean_distance([], [])
   |> should.equal(Ok(0.0))
 
   // Differing lengths returns error
   metrics.euclidean_distance([], [1.0])
   |> should.be_error()
 
   let assert Ok(result) = metrics.euclidean_distance([0.0, 0.0], [1.0, 2.0])
   result
   |> predicates.is_close(2.23606797749979, 0.0, tol)
   |> should.be_true()
 }
pub fn manhatten_distance(xarr: List(Float), yarr: List(Float)) -> Result(
  Float,
  String,
)

Calculcate the Manhatten distance between two lists (representing vectors):

\[ \sum_{i=1}^n \left|x_i - y_i \right| \]

In the formula, $$n$$ is the length of the two lists and $$x_i, y_i$$ are the values in the respective input lists indexed by $$i, j$$.

Example:
 import gleeunit/should
 import gleam_community/maths/elementary
 import gleam_community/maths/metrics
 import gleam_community/maths/predicates

 pub fn example () {
   let assert Ok(tol) = elementary.power(-10.0, -6.0)
 
   // Empty lists returns 0.0
   metrics.float_manhatten_distance([], [])
   |> should.equal(Ok(0.0))
 
   // Differing lengths returns error
   metrics.manhatten_distance([], [1.0])
   |> should.be_error()
 
   let assert Ok(result) = metrics.manhatten_distance([0.0, 0.0], [1.0, 2.0])
   result
   |> predicates.is_close(3.0, 0.0, tol)
   |> should.be_true()
 }
pub fn mean(arr: List(Float)) -> Result(Float, String)

Calculcate the arithmetic mean of the elements in a list:

\[ \bar{x} = \frac{1}{n}\sum_{i=1}^n x_i \]

In the formula, $$n$$ is the sample size (the length of the list) and $$x_i$$ is the sample point in the input list indexed by $$i$$.

Example:
 import gleeunit/should
 import gleam_community/maths/metrics

 pub fn example () {
   // An empty list returns an error
   []
   |> metrics.mean()
   |> should.be_error()

   // Valid input returns a result
   [1., 2., 3.]
   |> metrics.mean()
   |> should.equal(Ok(2.))
 }
pub fn median(arr: List(Float)) -> Result(Float, String)

Calculcate the median of the elements in a list.

Example:
 import gleeunit/should
 import gleam_community/maths/metrics

 pub fn example () {
   // An empty list returns an error
   []
   |> metrics.median()
   |> should.be_error()

   // Valid input returns a result
   [1., 2., 3.]
   |> metrics.median()
   |> should.equal(Ok(2.))
 
   [1., 2., 3., 4.]
   |> metrics.median()
   |> should.equal(Ok(2.5))
 }
pub fn minkowski_distance(xarr: List(Float), yarr: List(Float), p: Float) -> Result(
  Float,
  String,
)

Calculcate the Minkowski distance between two lists (representing vectors):

\[ \left( \sum_{i=1}^n \left|x_i - y_i \right|^{p} \right)^{\frac{1}{p}} \]

In the formula, $$p >= 1$$ is the order, $$n$$ is the length of the two lists and $$x_i, y_i$$ are the values in the respective input lists indexed by $$i, j$$.

The Minkowski distance is a generalization of both the Euclidean distance ($$p=2$$) and the Manhattan distance ($$p = 1$$).

Example:
 import gleeunit/should
 import gleam_community/maths/elementary
 import gleam_community/maths/metrics
 import gleam_community/maths/predicates

 pub fn example () {
   let assert Ok(tol) = elementary.power(-10.0, -6.0)
 
   // Empty lists returns 0.0
   metrics.minkowski_distance([], [], 1.0)
   |> should.equal(Ok(0.0))
 
   // Differing lengths returns error
   metrics.minkowski_distance([], [1.0], 1.0)
   |> should.be_error()
 
   // Test order < 1
   metrics.minkowski_distance([0.0, 0.0], [0.0, 0.0], -1.0)
   |> should.be_error()
 
   let assert Ok(result) = metrics.minkowski_distance([0.0, 0.0], [1.0, 2.0], 1.0)
   result
   |> predicates.is_close(3.0, 0.0, tol)
   |> should.be_true()  
 }
pub fn norm(arr: List(Float), p: Float) -> Float

Calculcate the $$p$$-norm of a list (representing a vector):

\[ \left( \sum_{i=1}^n \left|x_i\right|^{p} \right)^{\frac{1}{p}} \]

In the formula, $$n$$ is the length of the list and $$x_i$$ is the value in the input list indexed by $$i$$.

Example:
 import gleeunit/should
 import gleam_community/maths/elementary
 import gleam_community/maths/metrics
 import gleam_community/maths/predicates

 pub fn example () {
   let assert Ok(tol) = elementary.power(-10.0, -6.0)

   [1.0, 1.0, 1.0]
   |> metrics.norm(1.0)
   |> predicates.is_close(3.0, 0.0, tol)
   |> should.be_true()

   [1.0, 1.0, 1.0]
   |> metrics.norm(-1.0)
   |> predicates.is_close(0.3333333333333333, 0.0, tol)
   |> should.be_true()
 }
pub fn standard_deviation(arr: List(Float), ddof: Int) -> Result(
  Float,
  String,
)

Calculcate the sample standard deviation of the elements in a list: \[ s = \left(\frac{1}{n - d} \sum_{i=1}^{n}(x_i - \bar{x})\right)^{\frac{1}{2}} \]

In the formula, $$n$$ is the sample size (the length of the list) and $$x_i$$ is the sample point in the input list indexed by $$i$$. Furthermore, $$\bar{x}$$ is the sample mean and $$d$$ is the “Delta Degrees of Freedom”, and is by default set to $$d = 0$$, which gives a biased estimate of the sample standard deviation. Setting $$d = 1$$ gives an unbiased estimate.

Example:
 import gleeunit/should
 import gleam_community/maths/metrics

 pub fn example () {
   // Degrees of freedom
   let ddof: Int = 1
 
   // An empty list returns an error
   []
   |> metrics.standard_deviationddof)
   |> should.be_error()
 
   // Valid input returns a result
   [1., 2., 3.]
   |> metrics.standard_deviation(ddof)
   |> should.equal(Ok(1.))
 }
pub fn variance(arr: List(Float), ddof: Int) -> Result(
  Float,
  String,
)

Calculcate the sample variance of the elements in a list: \[ s^{2} = \frac{1}{n - d} \sum_{i=1}^{n}(x_i - \bar{x}) \]

In the formula, $$n$$ is the sample size (the length of the list) and $$x_i$$ is the sample point in the input list indexed by $$i$$. Furthermore, $$\bar{x}$$ is the sample mean and $$d$$ is the “Delta Degrees of Freedom”, and is by default set to $$d = 0$$, which gives a biased estimate of the sample variance. Setting $$d = 1$$ gives an unbiased estimate.

Example:
 import gleeunit/should
 import gleam_community/maths/metrics

 pub fn example () {
   // Degrees of freedom
   let ddof: Int = 1
 
   // An empty list returns an error
   []
   |> metrics.variance(ddof)
   |> should.be_error()
 
   // Valid input returns a result
   [1., 2., 3.]
   |> metrics.variance(ddof)
   |> should.equal(Ok(1.))
 }
Search Document