n次元の距離と類似度を計算する

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);  
    }  
?>