プログラミングにおける様々な距離の測り方を解説2022年04月02日カテゴリ:Pythonプログラミング今回はプログラミングにおける距離の測り方をまとめてみました。解説動画はこちらさて今回はプログラミングなどで用いられる距離の測り方についてです。wikipediaでは距離(きょり、distance)ある2点間に対して測定した長さの量をいうということになっていますが距離と言っても結構たくさんの距離が存在します。今回扱う距離は次のようなものです。1.数学的な距離ユークリッド距離マンハッタン距離チェビシェフ距離ミンコフスキー距離マハラノビス距離2.文字列の類似度ハミング距離レーベンシュタイン距離ジャロ・ウィンクラー距離3.数学/統計学/機械学習における類似度コサイン類似度ピアソンの相関係数4.集合同士の類似度ジャッカード係数ダイス係数シンプソン係数それでは一つ一つの距離の測り方を見ていくこととしましょう。distanceを用いると簡単に距離を求める事ができるようになっています。始めにライブラリを読み込みしておきましょう。・ユークリッド距離まずはじめは一般的に距離と言うと思い浮かばれるのかこれだと思います。2次元では、2点間の直線距離のことで各データの差の二乗の合計値のルートが距離になります。直角三角形の斜辺を求めるやり方と一緒ですね。図表を作図して2点を表示してみましょう。Distance')plt.axis('square')plt.xlim(-5,5)plt.ylim(-5,5)plt.show()これがユークリッド距離になります。これを求めるには次のコードで求めることができます。b)print(euclid_distance)5.03次元の場合は数値を増やすことで対応できます。b)print(euclid_distance)1.7320508075688772・マンハッタン距離マンハッタンや京都のような碁盤の目のような街を移動する時の距離です。それぞれの次元の差の合計値ですね作図はこんな感じです。Distance')plt.axis('square')plt.xlim(-5,5)plt.ylim(-5,5)plt.show()次のコードで距離を求めることができます。ord=1)print(manhattan_distance)7.0次元が増えても対応できます。次元の差の絶対値の最大値のことで座標次元ごとで求めた差の中で一番大きいものになります。作図はこんな感じですがマンハッタン距離と同じです。Distance')plt.axis('square')plt.xlim(-5,5)plt.ylim(-5,5)plt.show()距離は次のコードで求めることができます。b)print(chebyshev_distance)4次元が増えても対応できます。b)print(chebyshev_distance)4・ミンコフスキー距離ユークリッド、マンハッタン、チェビシェフ距離を一般化したようなもので、pによって取りうる値が変わります。p=1にするとマンハッタン距離p=2にするとユークリッド距p=∞にするとチェビシェフ距離になります。コードはこんな感じです。distance.minkowski(a,b,p=99)print(minkowski_distance)pの値を変えることで距離が変化します。一般的にあまりなじみのない距離の名前かと思いますが多変数間の相関関係を取り入れて既知のサンプルとの関係を明らかにする距離ですデータ群の平均や共分散行列を用いる方法で異常検知などに使われるケースが多いようです。サンプルデータを作図してみましょう。20)plt.show()青いデータが正常なものオレンジが異常データだと仮定します。これにユークリッド距離で等高線を描いてみましょう。20)plt.show()正常な青いデータを囲もうとするとユークリッド距離だとなかなかうまくいきません。今度は青いデータを用いてマハラビノス距離を考えてみましょう。次のコードは簡単なデータでのマハラビノス距離の計算です。vcm)print(mahalanobis_distance)2.9999999999999996マハラビノス距離は2点のデータと分散共分散行列のデータが必要になります。先ほどのサンプルデータにマハラビノス距離で等高線を描いてみましょう。20)plt.show()今度は青いデータとオレンジのデータをマハラビノス距離でうまく分離することができます。こんな感じで距離を計算すれば異常検知などに使えますね。同じ文字数の二つの文字列を比較したとき同じ位置にある異なる文字の個数になります。3回(割合は0.6)割合のMAXは1.0になります。二つの文字列がどの程度異なっているかを示す距離の一種です。1文字の挿入・削除・置換によって一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数になります。編集距離とも呼ばれ、文字列の類似度が分かります。sittingsitten(「k」を「s」に置換)sittin(「e」を「i」に置換)sitting(「g」を挿入して終了)3回の手順が必要なのでレーベンシュタイン距離は3Pythonでは専用のライブラリが有るのでインストールしておきましょう。python-Levenshtein距離の計算は次のようになります。s2)print(levenshtein_distance)3・ジャロ・ウィンクラー距離ある文字列と別の文字列で一致する文字数と置換の要不要から計算する距離になります。距離の取りうる値が0~1で距離の数値が大きいほど文字列間の類似度が高くなります。s2)print(jaro_winkler_distance)0.8266666666666667これらの距離を使い分けることで単語の類似度などに応用することができます。・コサイン類似度2つのベクトルが「どのくらい似ているか」という類似性を表す尺度のことで2つのベクトルがなす角のコサイン値になります。1なら完全に似ている0なら無関係-1なら完全に似ていないということになります。作図するとこんな感じです。Similarity')plt.axis('square')plt.xlim(-2,10)plt.ylim(-2,10)plt.legend()plt.grid()plt.show()計算は次のコードでできます。b)print(cosine_dos)0.9902460327205821真逆の方向を向くベクトルで計算してみましょう。1の範囲の数値になります。1(強い正の相関)では、2つの変数が強く同方向に連動-1(強い負の相関)では強く逆方向に連動データ群を用意して計算してみましょう。b)print(correlation_coefficient)-0.9827076298239907相関係数は様々なライブラリで求めることができるので好きな方法を使うのが良いと思います。集合の類似度を表す指標でテキストマイニングでは文章と文章の類似度=距離を表す指標になります。2つの集合に含まれている要素のうち共通要素が占める割合です。0から1の間の値となり値が大きいほど2つの集合の類似度は高い(似ている)ことになります。集合の計算方法で係数を求めることができます。jaccard_coefficient(a,b)print(jaccard_index)0.5・ダイス係数2つの集合の平均要素数と共通要素数での割合になります。dice_coefficient(a,b)print(dice_index)0.6666666666666666・シンプソン係数ダイス係数の定義式の分母を「2集合の平均要素数」から「少ない方の要素数」にしたものです。ダイス係数よりも差集合の要素数による影響を下げ相対的に共通要素数を重視した類似度計算です。Simpson係数となります。共起推定など類似性や距離を測るのに用いられます。まとめプログラミングでは文字列や集合ベクトルの類似度など距離を測るのにたくさんの方法があるので目的に応じて使い分けられるようになるとすごく捗るでしょう。今回はこれまでですそれでは。1時間で学べるPythonプログラミング[Pythonプログラミング]馬鹿でかい円周率を求めるアルゴリズム[Pythonプログラミング]モンティ・ホール問題のシミュレーション[Pythonプログラミング]人工衛星がどんだけ時間ズレるかプログラミングの力で求めてみようコーディングに迷った際に役に立ちWEB検索する時間を無くして作業時間を効率化できます。