通透!機(jī)器學(xué)習(xí)中常用的幾種距離度量方法
大家好,我是小寒。
今天給大家分享機(jī)器學(xué)習(xí)中經(jīng)常使用的不同類型的距離度量。
在機(jī)器學(xué)習(xí)中,距離度量是一種用于計(jì)算兩個數(shù)據(jù)點(diǎn)之間相似性或差異性的方法。它在許多算法中起著至關(guān)重要的作用,尤其是在無監(jiān)督學(xué)習(xí)(如聚類)和監(jiān)督學(xué)習(xí)(如最近鄰分類)中。
向量距離測量
讓我們首先了解機(jī)器學(xué)習(xí)中使用的不同向量距離測量。
1.歐幾里得距離
歐幾里得距離是最常見的距離度量,用于計(jì)算兩個點(diǎn)在 n 維空間中的直線距離。
import numpy as np
def euclidean_distance(x, y):
return np.sqrt(np.sum((np.array(x) - np.array(y))**2))
# 示例
x = [1, 2, 3]
y = [4, 5, 6]
print(euclidean_distance(x, y)) # 輸出:5.196152422706632
2.曼哈頓距離
曼哈頓距離計(jì)算兩個點(diǎn)之間的絕對坐標(biāo)差的總和,適用于在規(guī)則網(wǎng)格上測量距離的情況,例如城市街道、棋盤格等。
曼哈頓距離的公式為
其中, x 和 y 是 n 維空間中的兩個點(diǎn),
def manhattan_distance(x, y):
return sum(abs(a - b) for a, b in zip(x, y))
# 示例
x = [1, 2]
y = [4, 6]
print(manhattan_distance(x, y)) # 輸出:7
3.明科夫斯基距離
明科夫斯基距離是歐幾里得距離和曼哈頓距離的廣義形式,取決于參數(shù) p 的值。
當(dāng) p 為 1時(shí),為曼哈頓距離;當(dāng) p 為 2時(shí),為歐幾里得距離;當(dāng) p 為無窮大時(shí),為切比雪夫距離。
def minkowski_distance(x, y, p=2):
return np.sum(np.abs(np.array(x) - np.array(y))**p)**(1/p)
# 示例
x = [1, 2, 3]
y = [4, 5, 6]
print(minkowski_distance(x, y, p=3)) # 輸出:4.3267487109222245
統(tǒng)計(jì)相似性
1.余弦相似度
余弦相似度是通過計(jì)算兩個向量之間的余弦角度來度量它們的相似性。
余弦相似度的值介于 -1 和 1 之間,1 表示完全相似,-1 表示完全不相似。
import numpy as np
def cosine_similarity(A, B):
dot_product = np.dot(A, B)
norm_A = np.linalg.norm(A)
norm_B = np.linalg.norm(B)
return dot_product / (norm_A * norm_B)
# 示例向量
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
# 計(jì)算余弦相似度
similarity = cosine_similarity(A, B)
print("余弦相似度:", similarity)
2.皮爾遜相關(guān)系數(shù)
皮爾遜相關(guān)系數(shù)衡量的是兩個變量之間的線性相關(guān)性,取值范圍為 -1 到 1。
1 表示完全正相關(guān),-1 表示完全負(fù)相關(guān),0 表示無相關(guān)性。
import numpy as np
def pearson_correlation(A, B):
mean_A = np.mean(A)
mean_B = np.mean(B)
numerator = np.sum((A - mean_A) * (B - mean_B))
denominator = np.sqrt(np.sum((A - mean_A)**2)) * np.sqrt(np.sum((B - mean_B)**2))
return numerator / denominator
# 示例向量
A = np.array([1, 2, 3, 4, 5])
B = np.array([5, 4, 3, 2, 1])
# 計(jì)算皮爾遜相關(guān)系數(shù)
correlation = pearson_correlation(A, B)
print("皮爾遜相關(guān)系數(shù):", correlation)
3.杰卡德指數(shù)
杰卡德指數(shù)(Jaccard Index),又稱杰卡德相似系數(shù)(Jaccard Similarity Coefficient),是一種用于衡量兩個集合之間相似度的統(tǒng)計(jì)指標(biāo)。
它通過計(jì)算兩個集合的交集和并集的比率來衡量它們的相似性。
def jaccard_index(set1, set2):
intersection = len(set(set1).intersection(set(set2)))
union = len(set(set1).union(set(set2)))
return intersection / union
# 示例數(shù)據(jù)
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(jaccard_index(set1, set2)) # 輸出:0.5
基于編輯的距離測量
1.漢明距離
它測量兩個等長字符串之間不同字符的數(shù)量。
def hamming_distance(x, y):
if len(x) != len(y):
raise ValueError("Strings must be of the same length")
return sum(el1 != el2 for el1, el2 in zip(x, y))
# 示例
x = '1011101'
y = '1001001'
print(hamming_distance(x, y))
2.編輯距離
它根據(jù)將一個字符串轉(zhuǎn)換為另一個字符串需要多少次更正來計(jì)算。允許的更正包括插入、刪除和替換。
def edit_distance(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
for j in range(n + 1):
if i == 0:
dp[i][j] = j
elif j == 0:
dp[i][j] = i
elif s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1])
return dp[m][n]
# 示例
s1 = "kitten"
s2 = "sitting"
print(edit_distance(s1, s2))