• 机器学习-计算数据之间的距离


    目录

    欧氏距离

    欧氏距离应用场景:

    1. 聚类分析:在聚类算法中(K-means)中,可以使用欧式距离来衡量数据点之间的相似性或距离,以便于将他们划分到不用的簇中。
    2. 特征匹配:在计算机视觉和图像处理中,可以使用欧氏距离来比较两个特征向量之间的相似性,如图像检索,图像分类,人脸识别等任务。
    3. 数据降维:在主成分分析(PCA)和线性判别分析(LDA)等降维技术中,可以使用欧氏距离来衡量高维数据空间中的变量之间的相似性,从而进行有效的特征选择和降维。
    4. 推荐系统:在协同过滤推荐算法中,可以使用欧氏距离来衡量用户之间的兴趣相似性,从而根据用户的历史行为向其推荐相似的物品或内容。
    5. 数据挖掘:在聚类,分类和异常检测层数据挖掘任务中,可以使用欧氏距离来度量数据点之间的差异和相似性,以便进行模式识别和异常检测。
      大多数情况欧式距离都是比较适合的。但是对于某些特殊类型的
      欧氏距离是最常见的距离度量方法,它定义为两个点之间的直线距离。对于两个n维向量X和Y,欧氏距离可以表示为: d ( x , y ) = ( ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ + ( x n − y n ) 2 ) d(x,y)=\sqrt((x_1-y_1)^2+(x_2-y_2)^2+······+(x_n-y_n)^2) d(x,y)=( (x1y1)2+(x2y2)2+⋅⋅⋅⋅⋅⋅+(xnyn)2)
      代码实现:
    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里使用了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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    曼哈顿距离

    曼哈顿距离主要应用场景:

    1. 路径规划和导航:在特定的城市区域或地图上,可以使用曼哈顿距离来估计两点之间的实际行驶距离或路程,从而确定最短路径或导航方案。

    2. 电子商务:在购物网站或电子商务平台上,可以使用曼哈顿距离来衡量产品或服务之间的相似性,从而向用户推荐相关的商品或服务。

    3. 计算机视觉:在图像处理和计算机视觉领域中,可以使用曼哈顿距离来比较两个图像之间的相似性或距离,例如在文本检测和OCR(光学字符识别)中使用。

    4. 数据挖掘:在聚类、分类和异常检测等数据挖掘任务中,可以使用曼哈顿距离来度量数据点之间的差异和相似性,以便进行模式识别和异常检测。

    5. 传感器网络:在传感器网络中,可以使用曼哈顿距离来估计物理位置或传感器之间的距离,从而实现位置估计和目标跟踪等任务。
      曼哈顿距离是在城市街区中的距离度量方法,它表示两点之间沿着坐标轴的总距离。
      曼哈顿距离采用各个坐标点之间的绝对值之和,它的距离定义为:
      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)=x1y1+x2y2+⋅⋅⋅+xnyn
      自定义曼哈顿距离

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用cdist库来进行实现

    distance.cdist(x,x,"cityblock")
    
    • 1

    闵可夫斯基距离

    闵可夫斯基距离是欧氏距离和曼哈顿距离的一般化形式,可以表示为:$ 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)=(x1y1p+x2y2p+...+xnynp)(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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    切比雪夫距离

    切比雪夫距离是在棋盘格上的距离度量方法,它表示两点之间坐标数值差的最大值。
    切比雪夫距离是指两个点之间各个坐标数值差绝对值的最大值,定义为:
    d ( x , y ) = m a x i ( ∣ x i − y i ∣ ) d(x,y)=max_i(|x_i-y_i|) d(x,y)=maxi(xiyi)

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用cdist库来实现

    distance.cdist(x,x,"chebyshev")
    
    • 1

    余弦距离

    余弦距离通常用于计算文本和稀疏数据之间的相似度。余弦相似度度量的是两个向量之间的角度关系,而不是其具体数值大小。余弦相似度定义为两个向量的内积除以它们的模长乘积。
    余弦距离是通过测量两个向量夹角来进行度量两个向量之间的相似性,余弦距离定义为:
    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 yi2 xy

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用cdist库实现

    distance.cdist(x,x,"cosine")
    
    • 1

    相关系数距离

    相关系数距离主要用于衡量个两个变量之间的相关性或者相似度。它可以用来比较两个向量,时间序列或者数据集之间的相似程度,如下场景可能会用到:

    1. 数据分析和统计学:相关系数距离可用于评估不同变量之间之间的相关性,在数据分析和统计学中,我们可以使用相关系数距离来确定两个变量之间的线性关系强弱。
    2. 机器学习和数据挖掘:在特征选择,聚类,回归和分类等机器学习任务中,相关系数距离可以用作相似性度量。例如在聚类算法中,可以使用相关系数距离来测量数据点之间的相似程度,进而将相似的数据点分组。
    3. 图像处理和计算机视觉:相关系数距离可以用于图像匹配和相似性比较。通过计算连个图像之间的相关系数距离,来评估他们之间的相似度,用于图像检索,目标识别和图形匹配等应用。
    4. 自然语言处理和文本挖掘:在文本分析领域,相关数据里可以用于比较文本之间的相似性。通过计算文本之间的相关系数距离,可以进行文本聚类,文档相似度计算和信息检索等任务。
      相关系数距离只能测量线性关系的相似性,对于非线性关系的判断不太准确。
      定义为:
      d ( x , y ) = ( x − x ˉ ) ∗ ( y − y ˉ ) ∑ x i − X ˉ ∗ ∑ y i − Y ˉ d(x,y)=\frac{(x-\bar x)*(y-\bar y)}{\sqrt{\sum x_i-\bar X}*\sqrt{\sum y_i -\bar Y}} d(x,y)=xiXˉ yiYˉ (xxˉ)(yyˉ)
    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    使用库函数来进行实现:

    # 二维以上因为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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    马氏距离

    马氏距离表示数据的协方差距离,是一种计算两个未知样本集的相似度的有效方法,距离定义为:
    d ( x , y ) = ( X − Y ) T ∑ − 1 ( X − Y ) d(x,y)=\sqrt{(X-Y)^T\sum ^{-1}(X-Y)} d(x,y)=(XY)T1(XY)

    distance.cdist(x,x,"mahalanobis")
    
    • 1
  • 相关阅读:
    SpringBoot系列——Starter
    小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的记录
    滴滴弹性云基于 K8S 的调度实践
    视频监控/视频汇聚/安防视频监控平台EasyCVR配置集群后有一台显示离线是什么原因?
    【操作系统】第五章 IO
    Flink Window&Time 原理
    web网页设计期末课程大作业 HTML+CSS+JavaScript 美食餐饮文化主题网站设计 学生DW静态网页设计
    java毕业设计驾考预约系统mybatis+源码+调试部署+系统+数据库+lw
    吴恩达老师机器学习课程笔记 04 多元线性回归
    java继承的优缺点分析
  • 原文地址:https://blog.csdn.net/weixin_45911397/article/details/133898901