目录
欧氏距离应用场景:
import numpy as np
from scipy.spatial.distance import cdist
# 示例数据
data = np.array([[1, 2, 3], [4, 5, 6]])
# 计算欧氏距离矩阵
distance_matrix = cdist(data, data, metric='euclidean')
print("欧氏距离矩阵:\n", distance_matrix)
这里使用了scipy包中的的cdist。
也可以进行自定义:
import numpy as np
def euclidean_distance(x,y):
x = np.array(x)
y = np.array(y)
distance = np.sqrt(np.sum(np.square(x-y))
return distance
data1 = [1,2,3]
data2 = [4,5,6]
distance = euclidean_distance(data1,data2)
曼哈顿距离主要应用场景:
路径规划和导航:在特定的城市区域或地图上,可以使用曼哈顿距离来估计两点之间的实际行驶距离或路程,从而确定最短路径或导航方案。
电子商务:在购物网站或电子商务平台上,可以使用曼哈顿距离来衡量产品或服务之间的相似性,从而向用户推荐相关的商品或服务。
计算机视觉:在图像处理和计算机视觉领域中,可以使用曼哈顿距离来比较两个图像之间的相似性或距离,例如在文本检测和OCR(光学字符识别)中使用。
数据挖掘:在聚类、分类和异常检测等数据挖掘任务中,可以使用曼哈顿距离来度量数据点之间的差异和相似性,以便进行模式识别和异常检测。
传感器网络:在传感器网络中,可以使用曼哈顿距离来估计物理位置或传感器之间的距离,从而实现位置估计和目标跟踪等任务。
曼哈顿距离是在城市街区中的距离度量方法,它表示两点之间沿着坐标轴的总距离。
曼哈顿距离采用各个坐标点之间的绝对值之和,它的距离定义为:
d ( x , y ) = ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ + ⋅ ⋅ ⋅ + ∣ x n − y n ∣ d(x,y)=|x_1-y_1|+|x_2-y_2|+···+|x_n-y_n| d(x,y)=∣x1−y1∣+∣x2−y2∣+⋅⋅⋅+∣xn−yn∣
自定义曼哈顿距离
import numpy as np
def manhattan_distance(x,y):
x = np.array(x)
y = np.array(y)
distance = np.sum(np.abs(x-y))
return distance
data1 = [1,2,3]
data2 = [4,5,6]
distance = manhattan_distance(data1,data2)
使用cdist库来进行实现
distance.cdist(x,x,"cityblock")
闵可夫斯基距离是欧氏距离和曼哈顿距离的一般化形式,可以表示为:$ d ( x , y ) = ( ∣ x 1 − y 1 ∣ p + ∣ x 2 − y 2 ∣ p + . . . + ∣ x n − y n ∣ p ) ( 1 / p ) d(x, y) = (|x1 - y1|^p + |x2 - y2|^p + ... + |xn - yn|^p)^{(1/p)} d(x,y)=(∣x1−y1∣p+∣x2−y2∣p+...+∣xn−yn∣p)(1/p),其中p为正实数。
import numpy as np
def minkowski_distance(x,y):
x = np.array(x)
y = np.array(y)
distance = np.power(np.sum(np,power(np.abs(x-y), p)),1/p)
return distance
data1 = [1,2,3]
data2 = [4,5,6]
p = 2 # 欧氏距离’
distance=minkowski_distance(data1,data2,p)
使用cdist库来实现
from scipy.spatial.distance import cdist
# 示例数据
data1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
data2 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]
p = 2 # 欧氏距离
# 使用cdist计算闵可夫斯基距离
distance_matrix = cdist(data1, data2, metric='minkowski', p=p)
print("距离矩阵:")
print(distance_matrix)
切比雪夫距离是在棋盘格上的距离度量方法,它表示两点之间坐标数值差的最大值。
切比雪夫距离是指两个点之间各个坐标数值差绝对值的最大值,定义为:
d ( x , y ) = m a x i ( ∣ x i − y i ∣ ) d(x,y)=max_i(|x_i-y_i|) d(x,y)=maxi(∣xi−yi∣)
import numpy as np
def chebyshev_distance(x,y):
x = np.array(x)
y = np.array(y)
distance = np.max(np.abs(x-y))
return distance
data1 = [1,2,3]
data2 = [4,5,6]
distance = chebyshev_distance(data1,data2)
使用cdist库来实现
distance.cdist(x,x,"chebyshev")
余弦距离通常用于计算文本和稀疏数据之间的相似度。余弦相似度度量的是两个向量之间的角度关系,而不是其具体数值大小。余弦相似度定义为两个向量的内积除以它们的模长乘积。
余弦距离是通过测量两个向量夹角来进行度量两个向量之间的相似性,余弦距离定义为:
d ( x , y ) = x ∗ y ∑ x i 2 ∗ ∑ y i 2 d(x,y)=\frac{x*y}{\sqrt{ \sum x_i^2}*\sqrt{\sum y_i^2}} d(x,y)=∑xi2∗∑yi2x∗y
import numpy as np
def cosine_distance(x, y):
x = np.array(x)
y = np.array(y)
# 计算向量的内积
dot_product = np.dot(x, y)
# 计算向量的模长
norm_x = np.linalg.norm(x)
norm_y = np.linalg.norm(y)
# 计算余弦距离
distance = 1-(dot_product / (norm_x * norm_y))
return distance
data1=[1,2,3]
data2=[4,5,6]
distance = cosine_distance(data1,data2)
使用cdist库实现
distance.cdist(x,x,"cosine")
相关系数距离主要用于衡量个两个变量之间的相关性或者相似度。它可以用来比较两个向量,时间序列或者数据集之间的相似程度,如下场景可能会用到:
import math
# 示例数据
vector1 = [1, 2, 3]
vector2 = [4, 5, 6]
# 计算平均值
mean1 = sum(vector1) / len(vector1)
mean2 = sum(vector2) / len(vector2)
# 计算标准差
std1 = math.sqrt(sum((x - mean1) ** 2 for x in vector1) / len(vector1))
std2 = math.sqrt(sum((x - mean2) ** 2 for x in vector2) / len(vector2))
# 计算协方差
covariance = sum((x - mean1) * (y - mean2) for x, y in zip(vector1, vector2)) / len(vector1)
# 计算相关系数距离
correlation_distance = 1 - (covariance / (std1 * std2))
print("相关系数距离:", correlation_distance)
使用库函数来进行实现:
# 二维以上因为cdist中的参数是向量,
distance.cdist(x,x,"correlation")
# 或者使用numpy中的corrcoef库
data1 = [1,2,3]
data2 = [4,5,6]
# 计算相关系数
correlation_coefficient = np.corrcoef(data1, data2)[0,1]
# 计算相关系数距离
correlation_distance = 1-correlation_coefficient
马氏距离表示数据的协方差距离,是一种计算两个未知样本集的相似度的有效方法,距离定义为:
d ( x , y ) = ( X − Y ) T ∑ − 1 ( X − Y ) d(x,y)=\sqrt{(X-Y)^T\sum ^{-1}(X-Y)} d(x,y)=(X−Y)T∑−1(X−Y)
distance.cdist(x,x,"mahalanobis")