3.138.174.45@hermano.com.br:~$ ls ./estudos/medidas_de_distancia/mahalanobis

..   00-leia.txt   mahalanobis.txt  

3.138.174.45@hermano.com.br:~$ cat ./estudos/medidas_de_distancia/mahalanobis/00-leia.txt

Distância de Mahalanobis em Perl
14 de Julho de 2011

Durante os estudos de agrupamento de dados (data clustering) é comum se deparar com algoritmos que utilizam medidas de distância euclidiana, que além de simples,  provavelmente é a mais comum. Porém, em diversos trabalhos também é possível encontrar a distância de Mahalanobis, mas sua implementação é bem mais trabalhosa em relação à distância euclidiana. A distância de Mahalanobis, que também é conhecida como medida de distância quadrática, foi apresentada pelo matemático indiano Prasanta Chandra Mahalanobis em 1936 [2]. Uma explicação que compara a vantagem de se usar a distância de Mahalanobis ao invés da Euclidiana pode ser encontrada no blog de Will Dwinnell [3].

Ao procurar na Internet por algum tutorial sobre a distância de Mahalonobis, certamente será encontrado o que foi elaborado por Kardi Teknomo [1]. Com base nesse tutorial, um script Perl foi desenvolvido e testado com os mesmos valores utilizados por Kardi.

Script Perl

Baixe o script perl (mahalanobis.txt), renomeie e execute:

# mv mahalanobis.txt mahalanobis.pl

# perl mahalanobis.pl

Valores de entrada para distancia de Mahalanobis:

a = ([2,2],[2,5],[6,5],[7,3],[4,7],[6,4],[5,3],[4,6],[2,5],[1,3])

b = ([6,5],[7,4],[8,7],[5,6],[5,4])

Subtraindo o valor de cada coluna com sua media aritmetica:

a -> a2 = ([-1.9,-2.3],[-1.9,0.7],[2.1,0.7],[3.1,-1.3],[0.1,2.7],[2.1,-0.3],[1.1,-1.3],[0.1,1.7],[-1.9,0.7],[-2.9,-1.3])

b -> b2 = ([-0.2,-0.2],[0.8,-1.2],[1.8,1.8],[-1.2,0.8],[-1.2,-1.2])

Calculando a matriz de covariancia:

a2 -> ac = ([3.89,0.13],[0.13,2.21])

b2 -> bc = ([1.36,0.56],[0.56,1.36])

Juncao (pooled) das matrizes de acordo com seus pesos:

ac + bc -> mp = ([3.04666666666667,0.273333333333333],[0.273333333333333,1.92666666666667])

Calcular matriz inversa:

mp -> mpi = ([0.332459046567274,-0.04716547027425],[-0.04716547027425,0.525722436959323])

Calcular diferenca da media aritmetica entre as matrizes:

a <-> b -> mmd = ([-2.3],[-0.9])

Transposta da matriz de diferencas de medias:

mmd -> mmdt = ([-2.3,-0.9])

Multiplicar matriz transposta da diferencas de medias com a matriz inversa (pooled):

mmdt * mpi -> mm1 = ([-0.722206883857905,-0.364669611632616])

Multiplicar matriz do resultado anterior com a matriz de diferenca de medias:

mm1 * mmd -> mm2 = ([1.98927848334254])

E com a raiz quadrada do resultado anterior:

Mahalanobis entre a e b = 1.41041783998308

[1] Mahalanobis Distance (http://people.revoledu.com/kardi/tutorial/Similarity/MahalanobisDistance.html acesso em 14/07/2011)

[2] On the generalised distance in statistics (http://www.insa.ac.in/insa_pdf/20005b8c_49.pdf acesso em 14/07/2011)

[3] Mahalanobis Distance (http://matlabdatamining.blogspot.com/2006/11/mahalanobis-distance.html acesso em 14/07/2011)

3.138.174.45@hermano.com.br:~$ clear_