距离度量方法——余弦相似度、汉明距离、马氏距离、编辑距离

目录

一、 余弦相似度(Cosine Similarity)

1、简介

2、代码实现

二、汉明距离(Hamming Distance)

1、简介

2、代码实现

三、马氏距离(Mahalanobis Distance)

1、简介

2、代码实现

四、编辑距离(Levenshtein Distance)

1、简介

2、代码实现


一、 余弦相似度(Cosine Similarity)

1、简介

  • 余弦相似度是一种常用的向量相似性度量方法,通常用于文本挖掘、信息检索和推荐系统等领域。它衡量了两个向量之间的夹角的余弦值,而不考虑它们的大小。
  • 余弦相似度的计算公式如下:
    • eq?d%28A%2CB%29%3D%5Cfrac%7BAB%7D%7B%5Cleft%20%5C%7C%20A%20%5Cright%20%5C%7C%5Cleft%20%5C%7C%20B%20%5Cright%20%5C%7C%7D,其中 A 和 B 是两个向量,||A|| 表示向量 A 的模长。

2、代码实现

  • 计算两个向量 eq?a%281%2C2%2C3%29eq?b%284%2C5%2C6%29 之间的余弦相似度。
  • 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)
        similarity = dot_product / (norm_a * norm_b)
        return similarity
    
    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    similarity = cosine_similarity(a, b)
    print("余弦相似度:", similarity)

二、汉明距离(Hamming Distance)

1、简介

  • 汉明距离是一种用于比较两个等长字符串之间的差异性的度量。它衡量了两个字符串之间在相同位置上不同字符的数量。具体来说,汉明距离是通过对比两个字符串中对应位置上的字符来计算的,不同字符的数量即为汉明距离。
  • 例如,假设有两个等长字符串 "1011101" 和 "1001001",它们之间的汉明距离为 2,因为在第 2 和第 5 个位置上的字符不同。

2、代码实现

  • 计算两个字符串 26d700000006000100520004 和 17eb00000006000100480003 之间的汉明距离。
  • def hamming_distance(str1, str2):
        if len(str1) != len(str2):
            raise ValueError("两个字符串必须具有相同的长度")
        distance = sum(c1 != c2 for c1, c2 in zip(str1, str2))
        return distance
    
    str1 = "26d700000006000100520004"
    str2 = "17eb00000006000100480003"
    distance = hamming_distance(str1, str2)
    print("汉明距离:", distance)

三、马氏距离(Mahalanobis Distance)

1、简介

  • 马氏距离是一种考虑了数据协方差结构的距离度量方法,通常用于多维空间中数据点之间的距离计算。它衡量了两个数据点在多维空间中的差异性,同时考虑了各个特征之间的相关性。
  • 马氏距离可以看作是欧氏距离的一种修正,修正了欧氏距离中各维度尺度不一致且相关的问题。
  • 单个数据点的马氏距离:
    • eq?d%28x%29%3D%5Csqrt%7B%28x-%5Cmu%20%29%5ETS%5E%7B-1%7D%28x-%5Cmu%29%7D,其中 eq?%5Cmu 为样本均值。
  • 数据点 x, y 之间的马氏距离:
    • eq?d%28x%2Cy%29%3D%5Csqrt%7B%28x-y%29%5ETS%5E%7B-1%7D%28x-y%29%7D,其中 eq?S%5E%7B-1%7D 为样本集的协方差矩阵的逆矩阵。
    • 协方差矩阵的计算公式如下:
      • eq?S%3D%5Cfrac%7B1%7D%7Bn-1%7D%5Csum_%7Bi%7D%5E%7Bn%7D%28x_i-%5Cbar%7Bx%7D%29%28x_i-%5Cbar%7Bx%7D%29%5ET,其中 eq?x_i 表示第 i 个样本,eq?%5Cbar%7Bx%7D 表示所有样本的均值向量。eq?%28x_i-%5Cbar%7Bx%7D%29 是每个样本与均值向量的偏差,eq?%28x_i-%5Cbar%7Bx%7D%29%5ET 表示它的转置。

2、代码实现

  • 计算一样本数据集 { [1, 2], [3, 4], [4, 6], [6, 8] },其中两个数据 [1, 2] 和 [3, 4] 的马氏距离。
  • import numpy as np
    
    
    def mahalanobis_distance(x, y, covariance_inv):
        diff = np.array(x) - np.array(y)
        distance = np.sqrt(np.dot(np.dot(diff, covariance_inv), diff.T))
        return distance
    
    
    # 计算协方差矩阵
    data = np.array([[1, 2], [3, 4], [4, 6], [6, 8]])  # 样本数据
    covariance_matrix = np.cov(data, rowvar=False)  # 计算协方差矩阵
    
    # 计算协方差矩阵的逆矩阵
    covariance_inv = np.linalg.inv(covariance_matrix)
    
    # 两个点
    x = [1, 2]
    y = [3, 4]
    
    # 计算马氏距离
    distance = mahalanobis_distance(x, y, covariance_inv)
    print("马氏距离:", distance)

四、编辑距离(Levenshtein Distance)

1、简介

  • 编辑距离是衡量两个字符串之间的相似度的一种度量方法。它表示通过插入、删除或替换操作将一个字符串转换为另一个字符串所需的最小编辑次数。
  • 每次修改的方式如下:
    • 增加一个字符。如:abc -> abcd
    • 删除一个字符。如:abc -> ab
    • 修改一个字符。如:abc -> abd

2、代码实现

  • 计算两个字符串 26d700000006000100520004 和 17eb00000006000100480003 之间的编辑距离。
  • def edit_distance(str1, str2):
        m = len(str1)
        n = len(str2)
    
        # 创建一个(m+1) x (n+1)的二维数组来保存编辑距离
        dp = [[0] * (n + 1) for _ in range(m + 1)]
    
        # 初始化第一行和第一列
        for i in range(m + 1):
            dp[i][0] = i
        for j in range(n + 1):
            dp[0][j] = j
    
        # 动态规划计算编辑距离
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if str1[i - 1] == str2[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
    
        return dp[m][n]
    
    str1 = "26d700000006000100520004"
    str2 = "17eb00000006000100480003"
    distance = edit_distance(str1, str2)
    print("编辑距离:", distance)

 

 

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恣睢s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值