机器学习算法--欧几里得距离、余弦距离和曼哈顿距离的计算

两个向量之间的距离可以通过很多不同的方式来度量如欧几里得距离、余弦距离和曼哈顿距离

import numpy as np

# 向量的差
A = np.array([[1, 2, 3], [4, 5, 6]])
print(A[0])
print(A[1])
print(np.diff(A, axis=0))
print(A[1] - A[0])

# 欧几里得距离也称为 L2 范数
# 它是两个向量差的长度。L2 中的“L”代表长度。L2 中
# 的“2”表示在对这些值求和之前(且在求和的平方根之前)向量差的各个维度对应的指数(平方)
euclidean_distance = np.sqrt(((A[1] - A[0]) ** 2).sum())
print("欧几里得距离:", euclidean_distance)
print("欧几里得距离:", np.linalg.norm(A[1] - A[0]))

# 余弦距离(0 到+2):
# 余弦距离是余弦相似度的取反结果(cosine_distance = 1 - cosine_similarity)。
# 余弦相似度是两个向量之间夹角的余弦。
# 然而与欧几里得距离相比,余弦距离有一个缺点:它不是真正的距离度量,因为此时三
# 角形不等式并不成立
vector_query = np.array([1, 1])
vector_tc = np.array([1, 0])
vector_wired = np.array([5, 6])
normalized_query = vector_query / np.linalg.norm(vector_query)
normalized_tc = vector_tc / np.linalg.norm(vector_tc)
normalized_wired = vector_wired / np.linalg.norm(vector_wired)
print(normalized_query)
print(normalized_tc)
print(normalized_wired)

# 余弦距离是余弦相似度(−1 到+1)的取反结果
print("余弦相似度:", np.dot(normalized_query, normalized_tc)) # cosine similarity
print("余弦相似度:", np.dot(normalized_query, normalized_wired)) # cosine similarity
print("余弦距离:", 1 - np.dot(normalized_query, normalized_tc)) # cosine distance
print("余弦距离:", 1 - np.dot(normalized_query, normalized_wired)) # cosine distance

# 曼哈顿距离也称为出租车距离或 L1 范数:
# 计算所有维度的绝对距离的和
# 与欧几里得距离一样,曼哈顿距离是一个真实度量,因此它遵从三角不等式,并且可以用于依赖真实距离度
# 量的数学证明中
print("曼哈顿距离:", np.abs(vector_tc - vector_wired).sum())
print("归一化的二维向量之间的曼哈顿距离", np.abs(normalized_tc - normalized_wired).sum())

猜你喜欢

转载自blog.csdn.net/fgg1234567890/article/details/114499940