67 lines
1.6 KiB
C
67 lines
1.6 KiB
C
#include "common.h"
|
||
#include <gsl/gsl_matrix.h>
|
||
|
||
/* Builds the covariance matrix Σ
|
||
* from the standard parameters (σ, ρ)
|
||
* of a bivariate gaussian.
|
||
*/
|
||
gsl_matrix* normal_cov(struct par *p);
|
||
|
||
|
||
/* Builds the mean vector of
|
||
* a bivariate gaussian.
|
||
*/
|
||
gsl_vector* normal_mean(struct par *p);
|
||
|
||
|
||
/* `fisher_proj(c1, c2)` computes the optimal
|
||
* projection map, which maximises the separation
|
||
* between the two classes.
|
||
* The projection vector w is given by
|
||
*
|
||
* w = Sw⁻¹ (μ₂ - μ₁)
|
||
*
|
||
* where Sw = Σ₁ + Σ₂ is the so-called within-class
|
||
* covariance matrix.
|
||
*/
|
||
gsl_vector* fisher_proj(sample_t *c1, sample_t *c2);
|
||
|
||
|
||
/* `fisher_cut(ratio, w, c1, c2)` computes
|
||
* the threshold (cut), on the line given by
|
||
* `w`, to discriminates the classes `c1`, `c2`;
|
||
* with `ratio` being the ratio of their prior
|
||
* probabilities.
|
||
*
|
||
* The cut is fixed by the condition of
|
||
* conditional probability being the
|
||
* same for each class:
|
||
*
|
||
* P(c₁|x) p(x|c₁)⋅p(c₁)
|
||
* ------- = --------------- = 1;
|
||
* P(c₂|x) p(x|c₁)⋅p(c₂)
|
||
*
|
||
* where p(x|c) is the probability for point x
|
||
* along the fisher projection line. If the classes
|
||
* are bivariate gaussian then p(x|c) is simply
|
||
* given by a normal distribution:
|
||
*
|
||
* Φ(μ=(w,μ), σ=(w,Σw))
|
||
*
|
||
* The solution is then
|
||
*
|
||
* t = (b/a) + √((b/a)² - c/a);
|
||
*
|
||
* where
|
||
*
|
||
* 1. a = S₁² - S₂²
|
||
* 2. b = M₂S₁² - M₁S₂²
|
||
* 3. c = M₂²S₁² - M₁²S₂² - 2S₁²S₂² log(α)
|
||
* 4. α = p(c₁)/p(c₂)
|
||
*
|
||
*/
|
||
double fisher_cut(
|
||
double ratio,
|
||
gsl_vector *w,
|
||
sample_t *c1, sample_t *c2);
|