本日覚えたこと -マンハッタン距離・ユークリッド距離-
Pythonの練習のため、AtCoderやPaizaなどでちまちまとアルゴリズムの勉強中です。
で、問題にマンハッタン距離についての問題がありました。
というか、そもそも
マンハッタン距離ってなんだったっけ?ユークリッドは聞いたことあるような……?
用語がわからない超初心者の私。
ちょっと恥ずかしいと思いつつも人間だれしも最初は初心者!と開き直って調べてみました。
説明
点Xから点Yまでの距離のこと。
マンハッタンは直角に曲がりつつ移動した距離のこと。(ピンク)
ユークリッドは直線距離。(水色)
うむ。なるほど。なんか記憶の底から、うっすらと思い出が。中学生くらい?
ウン十年前過ぎて、もう忘却の彼方です。
ユークリッドはたしかギリシャ人。ではマンハッタンはアメリカ人?とか考えつつ。
x = [0,0] y = [2,2]
としたら
マンハッタン距離 → |0 – 2|+|0 – 2| = 4
ユークリッド距離 → $\sqrt{2^2 + 2^2}$ = $\sqrt{8}$
ということですな!
コードにすることを考える
図にして、数式にしたらわかった……が。コードにするのはどうやるのじゃ?
- リストの中身を絶対値にしたい → abs関数というのがいけそう
- 2乗はわかる → **2ですな!
- ルートの書き方 → math.sqrt というのがあるらしい。
書いてみた
import math
x = [0, 0]
y = [2, 2]
a = abs(x[0] - y[0])
b = abs(x[1] - y[1])
# マンハッタン
print(a+b)
# ユークリッド
print(math.sqrt(a**2 + b**2))
いや、普通に大量にデータあったらめんどくせ!ってなるやん ↓ からの
なんかnumpyなるものがよさげ。リストのまま渡せる?のかな?
import numpy as np
x = [0, 0]
y = [2, 2]
manhattan = np.sum(np.abs(x - y))
euclidean = np.linalg.norm(x - y)
print(manhattan)
print(euclidean)
動かん……
TypeError: unsupported operand type(s) for -: 'list' and 'list'
なんのことでしょう?
調べた結果、numpy用の配列に入れないとダメだったことが判明。
x = np.array(x)
t = np.array(y)
わかったこと
ライブラリってすげえ
ついでに、ユークリッドさんの本名(?)が気になって調べてみた。
Εὐκλείδης
ギリシャ語でGoogle翻訳から音声出してみたけど、エウクレイデス とかには全然聞こえない。「エフキーリーヴィス」(フは下唇を噛んでる感じの)って聞こえるような。外国の人に聞いたら誰やねんってなるヤツですね。
参考URL