web-dev-qa-db-ja.com

「ノルム」は「ユークリッド距離」と同等ですか?

「ノルム」と「ユークリッド距離」が同じことを意味するかどうかはわかりません。この区別を手伝ってください。

n by m配列aがあります。ここで、m> 3です。2番目のデータポイント間のエクリディアン距離を計算したいa[1,:]他のすべてのポイント(それ自体を含む)。そこで、np.linalg.normは、2つの与えられた点のノルムを出力します。しかし、これがEDを取得する正しい方法であるかどうかはわかりません。

import numpy as np

a = np.array([[0, 0, 0 ,0 ], [1, 1 , 1, 1],[2,2, 2, 3], [3,5, 1, 5]])
N = a.shape[0] # number of row
pos = a[1,:] # pick out the second data point. 
dist = np.zeros((N,1), dtype=np.float64)

for i in range(N):
    dist[i]= np.linalg.norm(a[i,:] - pos)
21
J_yang

ノルム は、ベクトルを入力として受け取り、そのベクトルの「サイズ」、「長さ」または「大きさ」として解釈できるスカラー値を返す関数です。より正式には、規範は次の数学的特性を持つと定義されます:

  • つまり、Norm(a・v)= | a |・Norm(v任意のスカラーa
  • それらは三角形の不等式、すなわちNorm(u+v)≤Norm(u)+ Norm(v
  • ベクトルのノルムは、それがゼロベクトルである場合にのみゼロです。つまり、Norm(v)= 0⇔ v=

ユークリッドノルム(L²ノルムとも呼ばれます)は、多くの異なるノルムの1つです。最大ノルム、マンハッタンノルムなどもあります。単一のベクトルのL²ノルムは、その点から原点までのユークリッド距離に相当します。 、および2つのベクトル間の差のL²ノルムは、2点間のユークリッド距離に相当します。


@ nobarの答えが示すように、np.linalg.norm(x - y, ord=2)(または単にnp.linalg.norm(x - y))はユークリッド距離を与えますベクトルxおよびy

a[1, :]aの他のすべての行の間のユークリッド距離を計算するため、forループを削除し、a

dist = np.linalg.norm(a[1:2] - a, axis=1)

ブロードキャストを使用してユークリッド距離を簡単に計算することもできます。

dist = np.sqrt(((a[1:2] - a) ** 2).sum(1))

最速の方法はおそらく scipy.spatial.distance.cdist

from scipy.spatial.distance import cdist

dist = cdist(a[1:2], a)[0]

(1000、1000)配列のタイミング:

a = np.random.randn(1000, 1000)

%timeit np.linalg.norm(a[1:2] - a, axis=1)
# 100 loops, best of 3: 5.43 ms per loop

%timeit np.sqrt(((a[1:2] - a) ** 2).sum(1))
# 100 loops, best of 3: 5.5 ms per loop

%timeit cdist(a[1:2], a)[0]
# 1000 loops, best of 3: 1.38 ms per loop

# check that all 3 methods return the same result
d1 = np.linalg.norm(a[1:2] - a, axis=1)
d2 = np.sqrt(((a[1:2] - a) ** 2).sum(1))
d3 = cdist(a[1:2], a)[0]

assert np.allclose(d1, d2) and np.allclose(d1, d3)
32
ali_m

「ノルム」の概念は数学の一般化された概念であり、ベクトル(またはベクトルの差)に適用すると、長さの尺度を広く表します。ノルムの計算にはさまざまなアプローチがありますが、ユークリッド距離と呼ばれるものは「2ノルム」と呼ばれ、2(「正方形」)の指数を適用し、合計した後に1/2の指数を適用することに基づきます。 (「平方根」)。


ドキュメント では少しわかりにくいですが、パラメータ_ord=2_を設定すると、2つのベクトル間のユークリッド距離が得られます。

sum(abs(x)**ord)**(1./ord)

sqrt(sum(x**2))になります。

注:@Holtが指摘したように、デフォルト値は_ord=None_であり、ベクトルの「2-ノルム」を計算するために文書化されています。したがって、これは_ord=2_(ユークリッド距離)と同等です。

5
nobar