n次元の距離と類似度を計算する
類似度と距離 – CatTail Wikiのサイトを見ながら、簡単そうなのをPHPで書いてみた。探せば普通にライブラリがありそうだが、はじめに手を動かすくらいはする。他にも色々載ってるのだけど、簡単そうなものだけピックアップ。
ミンコフスキー距離
ユークリッド距離が,各次元の差の平方和の平方根であったが,それをある種の一般化として,a乗和のb乗根としたのが,ミンコフスキー距離である.なお,a=bとして扱う定義もある.aが大きいほど,次元軸にとらわれない移動(斜め方向のショートカット)を重視する距離である.
a=b=1がマンハッタン距離に,a=b=2がユークリッド距離に,a=b=∞がチェビシェフ距離に一致する.
<?php
$x = array(2, 3, 1);
$y = array(4, 6, 1);
print getMinkowskiDistance($x, $y, 2, 2);
function getMinkowskiDistance($x, $y, $a=1, $b=1) {
$md = 0;
$keys = array_keys($x);
foreach($keys as $key) {
$md += pow(abs( $x[$key] - $y[$key] ), $a);
}
$md = pow($md, 1/$b);
return($md);
}
?>
コサイン類似度
ベクトルx,yのなす角θの余弦cosθをコサイン類似度といい,ベクトルの向きの近さを類似性の指標としたものである.ベクトルの向きが一致している時,最大値の1をとり,直交ならば0,向きが逆ならば最小値の-1をとる.
<?php
$x = array(2, 3, 1);
$y = array(4, 6, 1);
print getCosineSimilarity($x, $y);
function getCosineSimilarity($x, $y) {
$cos = 0;
$i = 0;
$j = 0;
$k = 0;
$keys = array_keys($x);
foreach($keys as $key) {
$i += $x[$key] * $y[$key];
$j += pow($x[$key], 2);
$k += pow($y[$key], 2);
}
$cos = $i / (sqrt($j) * sqrt($k));
return($cos);
}
?>