機械学習 --- 一般的な距離公式 (ユークリッド距離、マンハッタン距離、標準化ユークリッド距離、コサイン距離、ジャカード距離、マハラノビス距離、チェビシェフ距離、ミンコフスキー距離、KL 発散)

1. ユークリッド距離

       ユークリッド計量 (ユークリッド距離とも呼ばれる) は、一般的に使用される距離定義であり、m 次元空間内の距離を指します。

間隔内の 2 点間の実際の距離、またはベクトルの自然長 (つまり、点から原点までの距離)。二次元と三次元で

ユークリッド距離は 2 点間の実際の距離です。

from scipy.spatial import distance
a = (1, 2, 3)
b = (4, 5, 6)

print(distance.euclidean(a, b))

2. マンハッタンの距離 

        図中の赤い線はマンハッタン距離、緑は直線距離であるユークリッド距離、青と黄色は等価距離を表しています。

マンハッタンの距離。マンハッタン距離 - 南北方向の 2 点間の距離に東西方向の距離を加えたもの、つまり d(i,j)=|xi-

xj|+|yi-yj|。真南、真北、真東、真西の方向に規則正しく街路が配置されている町の場合、ある地点から別の地点までの距離

南北方向の移動距離と東西方向の移動距離を足したものとなるため、マンハッタン距離はタクシー距離とも呼ばれます。

離れる。マンハッタン距離は距離不変ではなく、座標軸が変わると点間の距離も異なります。初期のマンハッタン距離模式図

コンピュータ グラフィックスでは、画面は整数であるピクセルで構成され、点の座標も一般に整数になりますが、その理由は、浮動小数点演算が非常に高価であるためです。

AB のユークリッド距離を直接使用すると、高価で遅く、エラーが発生しやすくなります (ユークリッド距離: 2 次元および 3 次元空間におけるユークリッド距離)

距離は 2 点間の距離です) を使用する場合は、浮動小数点演算を実行する必要がありますが、AC と CB を使用する場合は、加算と減算のみを計算する必要があります。

しかし、これにより計算速度が大幅に向上し、何度計算を重ねても誤差がなくなりました。

import numpy as np
from scipy.spatial import distance

A = np.array([7,8,9])
B = np.array([4,5,6])

# 方式一:直接构造公式计算
dist1 = np.sum(np.abs(A-B))

# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=1)  #ord为范数类型,取值1(一范数),2(二范数),np.inf(无穷范数),默认2。

# 方式三:scipy库计算
dist3 = distance.cityblock(A,B)

3. 標準化されたユークリッド距離 

標準化されたユークリッド距離は、ユークリッド距離の欠点に対処するための改良です。

データの各次元構成要素の分布は異なるため、最初に各構成要素を「標準化」して同じ平均と分散を持つようにする必要があります。

S は各次元の標準偏差を表します。

分散の逆数を重みとみなした場合、重み付きユークリッド距離とも呼ばれます。

from scipy.spatial.distance import pdist
dist2 = pdist(Vec,’seuclidean’)

4. コサイン距離 

       ここで、角度余弦は 2 つのベクトルの方向の差を測定するために使用できます。機械学習では、この概念はサンプルの方向を測定するために使用されます。

量の差。

2 次元空間におけるベクトル A(x1,y1) とベクトル B(x2,y2) の間の余弦角の公式は次のとおりです。

2 つの n 次元サンプル点 a(x11,x12,…,x1n) と b(x21,x22,…,x2n) の交差余弦は次のとおりです。 

        角度余弦の値の範囲は [-1,1] です。コサインが大きいほど 2 つのベクトル間の角度は小さくなり、コサインが小さいほど 2 つのベクトル間の角度は小さくなります。

大きな方。2つのベクトルの方向が一致する場合、コサインは最大値1となり、2つのベクトルの方向が完全に逆である場合、コサインは最小値-1となる。 

import numpy as np
from scipy.spatial import distance

A = np.array([7,8,9])
B = np.array([4,5,6])

# 方式一:直接构造公式计算
dist1 = np.sum(A*B)/(np.sqrt(np.sum(A**2))*np.sqrt(np.sum(B**2)))

# 方式二:scipy库计算
dist2 = 1-distance.cosine(A,B)

5. ハミング距離

 2 つの等しい長さの文字列 s1 と s2 のハミング距離は、一方を他方に変更するために必要な文字置換の最小数です。

       ハミング重み: 同じ長さのゼロ文字列に対する文字列のハミング距離です。つまり、文字列内の非ゼロ文字列です。

バイナリ文字列の場合、要素の数は 1 の数であるため、11101 のハミング重みは 4 になります。したがって、ベクトルは空です

区間内の要素 a と b の間のハミング距離は、それらのハミング重みの差 ab に等しくなります。

応用: ハミング重み分析は、情報理論、符号化理論、暗号学およびその他の分野を含む分野に応用されています。たとえば、情報の暗号化のプロセスでは、

耐障害性を高めるためには、コード間の最小ハミング距離をできるだけ大きくする必要があります。ただし、長さの異なる 2 つの文字を比較する場合は、

文字列は置換するだけでなく、挿入や削除も行う必要があり、この場合、通常はより複雑な編集距離が使用されます。

分離アルゴリズム。

import numpy as np
from scipy.spatial import distance

A = np.array([1,2,3])
B = np.array([4,5,6])

# scipy库计算
dist1 = distance.hamming(A,B)

6. ジャカード距離 

       Jaccard 類似性係数: 2 つのセット A と B の交差要素は、A と B の和集合内に位置します。

の比率は 2 つのセットの Jaccard 類似性係数と呼ばれ、記号 J(A,B) で表されます。

       Jaccard 距離: Jaccard の類似性係数とは対照的に、2 つのセット内の異なる要素がすべての要素を占めます。

2 つのセットの差を測定するには: 

# 方案一
# 根据公式求解
up = np.double(np.bitwise_and((vec1!=vec2),np.bitwise_or(vec1!=0,vec2!=0)).sum())
down = np.double(np.bitwise_or(vec1!=0,vec2!=0).sum())
dist1=(up/down)
print("杰卡德距离测试结果是:"+str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'jaccard')
print("杰卡德距离测试结果是:"+str(dist2))

 7. マハラノビス距離

マハラノビス距離はサンプル分布に基づく距離です。

マハラノビス距離はインドの統計学者マハラノビスによって提案され、データの共分散距離を表します。2つを計算する効率的な方法です。

各位置におけるサンプルセットの類似性を求める方法。ユークリッド距離とは異なり、さまざまな特性間の関連性が考慮されます。つまり、

測定スケール。

       マハラノビス距離は、同じ分布に従い、共分散行列が Σ である 2 つの確率変数間の差異の程度として定義することもできます。

共分散行列は単位行列であり、マハラノビス距離はユークリッド距離に簡略化され、共分散行列が対角行列である場合は、次のように呼ぶこともできます。

は正規化されたユークリッド距離です。 

マハラノビス距離を計算するプロセスでは、全体のサンプル数がサンプルの次元よりも大きいことが必要です。そうでない場合、得られる全体のサンプル共分散行列の逆行列は同じになりません。

この場合は、ユークリッド距離計算を使用するだけです。

import numpy as np
from scipy.spatial.distance import pdist
a=np.random.random(10)
b=np.random.random(10)
#马氏距离要求样本数要大于维数,否则无法求协方差矩阵
X=np.vstack([a,b])
XT=X.T  #此处进行转置,表示10个样本,每个样本2维

pdist(XT,'mahalanobis')

8. チェビシェフ距離 

        数学では、チェビシェフ距離または L∞ 計量はベクトル空間の計量であり、2 点間の距離は次のように定義されます。

各座標間の数値の差の絶対値の最大値。数学的な観点から見ると、チェビシェフ距離は均一ノルム (均一

ノルム)(または最高ノルムと呼ばれる)も超凸計量(単射計量空間)の一種です。

# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'chebyshev')
print('切比雪夫距离测试结果是:' + str(dist2))

9. ミンコフスキー距離 

       ミンコフスキー距離、最小距離 とも呼ばれます それは単なる距離ではなく、それ以上のものです

距離公式(マンハッタン距離、ユークリッド距離、チェビシェフ距離)を 1 つの公式にまとめました

2 つの n 次元変数 a(x11,x12,…,x1n) と b(x21,x22,…,x2n) の間のミンコフスキー距離は次のように定義されます。

# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cityblock',p=1)
print('当P=1时就是曼哈顿距离,测试结果是:' + str(dist2))

# 根据公式求解,p=1
from numpy import *
dist3 = sum(abs(vec1-vec2))# abs()绝对值
print('当p=1时就是曼哈顿距离,测试结果是:' + str(dist3))

10.KLダイバージェンス 

KL 発散 (カルバック - ライブラー発散)、KL 距離、相対エントロピーとも呼ばれます。

P(x) と Q(x) の類似度が高いほど、KL 発散は小さくなります。

KL ダイバージェンスには主に 2 つの特性があります。

(1) 非対称性

KL ダイバージェンスは直観的には計量関数または距離関数ですが、次の値を持たないため、真の計量関数または距離ではありません。

対称性、つまり D(P||Q)!=D(Q||P)。

(2) 非否定性

相対エントロピーの値は非負、つまり D(P||Q)>0 です。

# 利用scipy API进行计算

KL = scipy.stats.entropy(x, y)
print(KL)

# 用公式编程就用px和py

KL = 0.0
for i in range(10):
    KL += px[i] * np.log(px[i] / py[i])
print(KL)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/weixin_43961909/article/details/132388832