#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
マハラノビスの距離
http://aoki2.si.gunma-u.ac.jp/R/mahalanobis.html
ファイル名: mahalanobis.jl 関数名: mahalanobis
翻訳するときに書いたメモ
mean(x, dims=1) の結果を使うときには注意が必要な場合がある。
==========#
using Statistics, Rmath, LinearAlgebra, Printf
function mahalanobis(dat, x)
n, p = size(dat)
m = size(x, 1)
invss = inv(cov(dat, corrected=false))
dif = x .- mean(dat, dims=1)
d2 = [transpose(dif[i, :]) * invss * dif[i, :] for i = 1:m]
P = pchisq.(d2, p, false)
@printf(" No. %12s %12s\n", "d2", "P")
for i = 1:m
@printf("%5d %12.8g %12.8f\n", i, d2[i], P[i])
end
Dict(:d2 => d2, :P => P)
end
dat = [
1 2 5 3
7 4 8 5
5 4 7 1
2 3 5 4
9 5 4 7
2 1 4 2
5 4 7 4
2 3 5 7
4 1 8 2
3 2 5 8
3 5 4 8]
x = [1 2 5 3
3 1 4 1]
mahalanobis(dat, x)
# No. d2 P
# 1 2.0007074 0.73562876
# 2 8.6371948 0.07083601