8種類似度度量方式的原理及實現

8種類似度度量方式的原理及實現

歐氏距離(Euclidean Distance)

歐氏距離(也稱歐幾里得度量)指在m維空間中兩個點之間的真實距離,或者向量的天然長度(即該點到原點的距離)

Euclidean Distance

計算公式

$$dist(A,B)=\sqrt{\sum_{i=1}^n(A_i-B_i)^2}$$html

試用場景

  • 在數據完整(無維度數據缺失)的狀況下, 維度間的衡量單位是一致的, 不然須要標準化處理

python實現

import numpy as np


vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=2)
# 或者
d = np.sqrt(np.sum(np.square(vec1-vec2)))

曼哈頓距離(Manhattan Distance)

在歐幾里得空間的固定直角座標系上兩點所造成的線段對軸產生的投影的距離總和

Manhattan Distance

計算公式

$$dist(A,B)=\sum_{i=1}^n|A_i-B_i|$$python

試用場景

  • 在數據完整(無維度數據缺失)的狀況下, 須要將空間劃分紅網格, 而後以網格爲單位來進行度量, 容許4個方向

python實現

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
 
d = np.linalg.norm(vec1-vec2, ord=1)
# 或者
d = np.sum(np.abs(vec1-vec2))

切比雪夫距離(Chebyshev Distance)

切比雪夫距離(Chebyshev distance)是向量空間中的一種度量,二個點之間的距離定義爲其各座標數值差的最大值

Chebyshev Distance

計算公式

$$dist(A,B)=\max_i|A_i-B_i|$$
or
$$dist(A,B)=\lim_{p→\infty}(\sum_{i=1}^n|A_i-B_i|^p)^{\frac{1}{p}}$$git

試用場景

  • 須要將空間劃分紅網格, 而後以網格爲單位來進行度量, 容許8個方向

python實現

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=np.inf)
# 或者
d = np.abs(vec1-vec2).max()

閔可夫斯基距離(Minkowski Distance)

歐氏空間中的一種測度,被看作是歐氏距離和曼哈頓距離的一種推廣

Minkowski

計算公式

$$dist(A,B)=\sqrt[p]{\sum_{i=1}^n|A_i-B_i|^p}$$github

試用場景

  • 當 $p=1$ 時,就是曼哈頓距離
  • 當 $p=2$ 時,就是歐氏距離
  • 當 $p→∞$ 時,就是切比雪夫距離

python實現

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

"""
ord=1: 一範數
ord=2: 二範數
ord=np.inf: 無窮範數
"""
d = np.linalg.norm(vec1-vec2, ord=arg)

漢明距離(Hamming Distance)

在信息論中,兩個等長字符串之間的漢明距離(Hamming distance)是兩個字符串對應位置的不一樣字符的個數

Hamming Distance

計算公式

$$dist(A,B)=\sum_{i=0}^n{A[i]\bigoplus B[i]}$$機器學習

試用場景

  • 信息編碼(爲了加強容錯性,應使得編碼間的最小漢明距離儘量大)

python實現

import numpy as np

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = len(np.nonzero(vec1-vec2)[0])
# 或者
d = np.shape(np.nonzero(vec1-vec2)[0])[0]

餘弦類似度(Cosine Similarity)

餘弦類似度,又稱爲餘弦類似性,是經過計算兩個向量的夾角餘弦值來評估他們的類似度

Cosine Similarity

計算公式

$$\cos(\theta)=\cfrac{A\cdot B}{|A||B|}$$
or
$$\cos(\theta)=\cfrac{\sum_{i=1}^nA_iB_i}{\sqrt{\sum_{i=1}^nA_i^2}\sqrt{\sum_{i=1}^nB_i^2}}$$ide

試用場景

  • 衡量兩個向量方向的差別

python實現

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*(np.linalg.norm(vec2)))

皮爾森相關係數(Pearson Correlation Coefficient)

用於度量兩個變量之間的相關程度

計算公式

$$P(A,B)=\cfrac{\sum_{i=1}^n(A_i-\overline A)(B_i-\overline B)}{\sqrt{\sum_{i=1}^n(A_i-\overline A)^2\sum_{i=1}^n(B_i-\overline B)^2}}$$學習

試用場景

  • 反映兩個變量是正相關仍是負相關

python實現

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

p = np.corrcoef(vec1, vec2)

傑卡德類似係數(Jaccard Similarity Coefficient)及傑卡德距離(Jaccard Distance)

用於比較有限樣本集之間的類似性與差別性

Jaccard

傑卡德類似係數計算公式

$$J(A,B)=\cfrac{|A\bigcap B|}{|A\bigcup B|}$$編碼

傑卡德距離計算公式

$$J_\delta(A,B)=1-J(A,B)=\cfrac{|A\bigcup B|-|A\bigcap B|}{|A\bigcup B|}$$idea

試用場景

  • 比較文本類似度,用於文本查重與去重;
  • 計算對象間距離,用於數據聚類或衡量兩個集合的區分度等。

python實現

import numpy as np
import scipy.spatial.distance as dist

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = dist.pdist(np.array([vec1, vec2]), "jaccard")

參考連接spa

相關文章
相關標籤/搜索