2点間の距離の式



本論文では,2点間の距離を求める様々な方法を紹介した.
しかし、なぜ距離を要求するのでしょうか.距離は類似度の概念だからだ.距離が近いほど、それらの特性(feature)が似ていることを意味します.従って機械学習アルゴリズムにおいても広く用いられている.例えばK-Nearest Neighborアルゴリズムでは...
とにかく、距離を求める方法を知っておく必要があります.数学的に深く研究する必要がなくても,概念を理解し,アルゴリズムを理解し,使用しなければならない.
入る前に、まずコードで点を表現する方法を知っておく必要があります.たいしたことはない.
たとえば、よく言われるx、y軸だけの2次元で点を表したい場合は、[5,8]と一緒に使用できます.もちろん2次元だけとは限らない.5次元点は[4,8,15,16,23]と同様に表すことができる.
では、2点間の距離を検索するために関数を作成します.例えばこのような方法で
distance([1,2,3], [5,8,9])
あ、そしてここで2点が持つ次元の個数は等しいはずです.
これから、2点間の距離を求める3つの方法を紹介します.
  • ユークリッド距離
  • マンハッタン通り
  • 海明街
  • もちろんまだたくさんありますが、公式に発表されたときからこの3つを知っていたのではないでしょうか.

    1.ユークリッド距離


    「ユークリディアン通り」は英語の単語で、とにかく最も広く使われている距離計算方法です.
    例えば、2次元上の点aとbの距離を求めると、このように表すことができる.


    ピタゴラスの定理を思い出す.
    また、上記の例は2次元であるが、n次元から2点までの距離を求めると、このように表すことができる.各次元の差に値の平方根を乗算します.

    Python関数で以下のように実現する.
    def euclidean_distance(pt1, pt2):
    	distance = 0
        for i in range(len(pt1)):
        	distance += (pt1[i] - pt2[i]) ** 2
        return distance ** 0.5

    2.マンハッタン距離


    マンハッタン距離もユークリッド距離に似ており,各次元の差を乗じて使用するのではなく,絶対値を直接計算する.
    下図のような概念で理解するのは簡単です.実際、マンハッタン通りという名前も、都市の路地(街)を歩くときの姿に似ていることから名付けられた.(aからbまでいくつかのブロックを移動することを想像してみてください)

    図に示すように、マンハッタンの距離は常にユークリッドの距離より大きいか、等しい.
    n次元上の2点間の距離を求めると、このように表すことができます.

    Python関数で以下のように実現する.
    def manhattan_distance(pt1, pt2):
    	distance = 0
        for i in range(len(pt1)):
        	distance += abs(pt1[i] - pt2[i])
        return distance

    3.海明距離


    ヘミングストリートは前述のユークリッドストリート、マンハッタンストリートとは少し異なる概念です.
    ヘミングストリートでは、次元ごとに違いを探しているのではなく、「全く同じ」かどうかを考えているだけです.そのため,主にスペルチェックなどのアルゴリズムに用いられる.
    例えば、単語thereと誤字theteとの間のhamming距離は1に等しい.各文字は次元であるため、この例では4番目の文字「r」および「t」を除いて、各次元は同じ値を有する.つまり、最終的には異なる文字数しか計算されません.
    距離を解く方法をPython関数として以下に示す.
    def hamming_distance(pt1, pt2):
    	distance = 0
        for i in range(len(pt1)):
        	if pt1[i] != pt2[i]:
            	distance += 1
        return distance

    SciPyで距離を求める


    PythonのライブラリScriptyを使うと、紹介する距離を簡単に見つけることができます.

  • ユークリッド通り:.euclidean()

  • マンハッタン通り:.cityblock()

  • 海明街:.hamming()
  • マンハッタン通りは都市の街のように数ブロック離れているので、その名前が直接見えます.
    そして上記の海明通りをScriptyで0と1の間の値を返します.いくつかの階層に差があるため、統計を取ってから、総階層の個数で除算します.したがって,上で自分で記述した関数で[1,2,3]と[7,2,10]の間のHamming距離を求めると2となるが,scipyでは2/3となる.
    要するにscipyではこのように直接距離を求めることができる.
    from scipy.spatial import distance
    
    print(distance.euclidean([1, 2], [4, 0]))
    print(distance.cityblock([1, 2], [4, 0]))
    print(distance.hamming([5, 4, 9], [1, 7, 9]))
    このような距離を求める方法を理解すれば,KNNアルゴリズムを理解することができる.
    ソース
    https://hleecaster.com/ml-distance-formula/