ミンコフスキー距離、マンハッタン距離、ユークリッド距離、チェビシェフ距離、どれ1つ聞いたこともないわ~

f:id:ts0818:20190504132011j:plain

ニュートンは、太陽を公転する地球の運動や木星の衛星の運動を統一して説明することを試み、ケプラーの法則に、運動方程式を適用することで、万有引力の法則(逆2乗の法則)が成立することを発見した。これは、『2つの物体の間には、物体の質量に比例し、2物体間の距離の2乗に反比例する引力が作用する』と見なす法則である。力そのものは、瞬時すなわち無限大の速度で伝わると考えた。式で表すと、万有引力の大きさは、物体の質量を、物体間の距離として、

となる。万有引力定数と呼ばれる比例定数で、

である。(因みに「この式が全ての物体の間で成立する」と考えると「木から落ちるリンゴにも適用することができる」と考えることができるのである。)

地球の質量を、リンゴの質量を、地球の半径をとすれば、万有引力の大きさは、であり、リンゴの運動方程式は、加速度をとして、となる。すなわち、地球重力による加速度(重力加速度)は

となり、すべての物質について同じ値になる。

地球表面では重力加速度は約9.8m/s2であり、地球の半径は約6400kmであるので、上記の式から地球の質量を

kg

のように求めることができる。同様に、他の惑星上での重力加速度も求めることができる。

万有引力 - Wikipedia

⇧  皆々様、ご存知、「万有引力」の 説明ですね。

どうもボクです。今回も、のっけから意味のない画像で始まるという。ということで、「距離」について調査していこうって感じです。

 

距離と空間距離

なんか、Wikipediaさんに聞いたら、

距離(きょり、Entfernung)とは、ある2点間に対して測定した長さの量をいう。本項では日常生活および高校数学の範囲内で使われている距離について触れる。大学以上で扱うより専門的・抽象的な距離については距離空間を参照。

距離 - Wikipedia

⇧  「距離空間」なるものが。というか、恐れていたことが...「大学以上で扱う専門的・抽象的な距離」って、サラッと書かれてるけども...

距離空間(きょりくうかん、metric space)とは、距離関数(きょりかんすう)と呼ばれる非負実数値関数が与えられている集合のことである。

古代より、平面空間地上の 2 点間の離れ具合を表す尺度である距離測量科学数学において重要な役割を果たしてきた。1906年モーリス・フレシェは、様々な集合の上で定義された関数の一様連続性の概念を統一的に研究した論文 Fréchet (1906)[注釈 1]において、ユークリッド空間から距離の概念を抽出して用い、距離空間の理論を築いた。

平面 R2 の上の 2 点 P1 = (x1y1), P2 = (x2y2) の間の距離にもマンハッタン距離

ユークリッド距離

などがあり、同じ集合に対して何種類もの異なる距離関数を考える事も少なくないため、集合 X と距離関数 d を組にして (X,d) と書き、距離空間と呼ぶ。

距離空間 - Wikipedia

⇧ 道理で、『ミンコフスキー距離、マンハッタン距離、ユークリッド距離、チェビシェフ距離』ってどれも聞いたことがないわけですわ...

 

 

qiita.com

⇧  上記サイト様が、分かりやすく説明してくれています。

「ミンコフスキー距離」については、英語版 のWikipediaに情報が載ってるらしい、日本語版が無いのが謎なんですけど...

英語版のWikipediaによりますと、

The Minkowski distance is a metric in a normed vector space which can be considered as a generalization of both the Euclidean distance and the Manhattan distance.

Minkowski distance - Wikipedia

⇧ 「ノルム線型空間」における距離で、「ユークリッド距離」、「マンハッタン距離」と一般的に見なされてる、と。

The Minkowski distance of order p between two points

is defined as:

For , the Minkowski distance is a metric as a result of the Minkowski inequality. When , the distance between (0,0) and (1,1) is , but the point (0,1) is at a distance 1 from both of these points. Since this violates the triangle inequality, for  it is not a metric.

Minkowski distance - Wikipedia

⇧  の式で、「ミンコフスキー距離」が求まり、

Minkowski distance is typically used with p being 1 or 2, which correspond to the Manhattan distance and the Euclidean distance, respectively. In the limiting case of p reaching infinity, we obtain the Chebyshev distance:

Minkowski distance - Wikipedia

⇧   「p = 1」の時が、「マンハッタン距離」、「p = 2、3、4...」の時が、「ユークリッド距離」、「p = ∞」の時が、「チェビシェフ距離」であると。

「ノルム線型空間」は、日本語のWikipediaにあるけど、割愛で、というか、最早、理工系の大学で学んでない人間にとっては、「未知との遭遇」っすわ...

 

ミンコフスキー距離を算出してみる

とりあえず、 

The Minkowski distance of order p between two points

is defined as:

Minkowski distance - Wikipedia

っていう式が存在し、 

  • ミンコフスキー距離
    • p = 1
      マンハッタン距離
    • p = 2、3、4...
      ユークリッド距離
    • p = ∞
      チェビシェフ距離

ってことが分かったので、 

judge.u-aizu.ac.jp

⇧  上記の問題にトライしていきますか。

Eclipse を起動し、適当なJavaプロジェクト、クラスを作成。

f:id:ts0818:20190504145208p:plain

コーディングはこんな感じ。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Minkowski {

  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    try {
      int n = Integer.parseInt(br.readLine()); // 何次元か
      String[] x = br.readLine().split("\\s"); // x座標
      String[] y = br.readLine().split("\\s"); // y座標
      double d = 0;  // 距離
      List<Double> mdList = new ArrayList<>(); // 距離のリスト
      
      // マンハッタン距離(p = 1 のとき)
      for (int i = 0; i < n; i++) {
        // 絶対値の合計値
        d += Math.abs(Double.parseDouble(x[i]) -Double.parseDouble(y[i]));
      }
      mdList.add(d);
      d = 0;
      
      // ユークリッド距離(p = 2 のとき)
      for (int i = 0; i < n; i++) {
        // 絶対値を2乗した値の合計値
        d += Math.pow(Math.abs(Double.parseDouble(x[i]) -Double.parseDouble(y[i])), 2);
      }
      // 平方根にして格納
      mdList.add(Math.sqrt(d));
      d = 0;
      
      // ユークリッド距離(p = 3 のとき)
      for (int i = 0; i < n; i++) {
        // 絶対値を3乗した値の合計値
        d += Math.pow(Math.abs(Double.parseDouble(x[i]) -Double.parseDouble(y[i])), 3);
      }
      // 立方根にして格納
      mdList.add(Math.cbrt(d));
      d = 0;
      
      // チェビシェフ距離(p = ∞)
      for (int i = 0; i < n; i++) {
        // 最大値を算出
        d = Math.max(d, Math.abs(Double.parseDouble(x[i]) -Double.parseDouble(y[i])));
      }
      mdList.add(d);
      
      // 結果を出力
      for (Double md: mdList) {
        System.out.printf("%.10f\n", md);
      }
      
    } catch (NumberFormatException | IOException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

そしたらば、実行で。

f:id:ts0818:20190504145913p:plain

入力値は、

Input

1行目に整数 nn が与えられます。2行目にベクトル xx の要素 {x1,x2,...xn}{x1,x2,...xn}、3行目にベクトル yy の要素 {y1,y2,...yn}{y1,y2,...yn} が空白区切りで与えられます。入力はすべて整数値です。

ミンコフスキー距離 | プログラミング入門 | Aizu Online Judge

ということで、

f:id:ts0818:20190504150208p:plain

できました~。
なんというか、実際の業務で「立方根」とか使う機会なんて、訪れるのかしら?

p = 4、p = 5 とかになってきたら、「平方根」「立方根」の組み合わせとかで表現するんですかね?

まぁ、モヤモヤ感が半端ないですが...

今回はこのへんで。