public void MahalanobisTest3()
{
// Example from Statistical Distance Calculator
// http://maplepark.com/~drf5n/cgi-bin/dist.cgi
double[,] cov =
{
{ 1.030303, 2.132728, 0.576716 },
{ 2.132728, 4.510515, 1.185771 },
{ 0.576716, 1.185771, 0.398922 }
};
double[] x, y;
double actual, expected;
var svd = new SingularValueDecomposition(cov, true, true, true);
var inv = cov.Inverse();
var pinv = svd.Inverse();
Assert.IsTrue(inv.IsEqual(pinv, 1e-6));
x = new double[] { 2, 4, 1 };
y = new double[] { 0, 0, 0 };
{
var bla = cov.Solve(x);
var blo = svd.Solve(x);
var ble = inv.Multiply(x);
var bli = pinv.Multiply(x);
Assert.IsTrue(bla.IsEqual(blo, 1e-6));
Assert.IsTrue(bla.IsEqual(ble, 1e-6));
Assert.IsTrue(bla.IsEqual(bli, 1e-6));
}
expected = 2.0773536867741504;
actual = Distance.Mahalanobis(x, y, inv);
Assert.AreEqual(expected, actual, 1e-6);
actual = Distance.Mahalanobis(x, y, svd);
Assert.AreEqual(expected, actual, 1e-6);
x = new double[] { 7, 5, 1 };
y = new double[] { 1, 0.52, -79 };
expected = 277.8828871106366;
actual = Distance.Mahalanobis(x, y, inv);
Assert.AreEqual(expected, actual, 1e-5);
actual = Distance.Mahalanobis(x, y, svd);
Assert.AreEqual(expected, actual, 1e-5);
}