当前位置:   article > 正文

20种数据相似性计算方法_两组数据的相似度计算

两组数据的相似度计算

不同的相似性计算方法适用于不同类型的数据和问题。在选择相似性计算方法时,需根据数据的特性、问题的定义以及所关注的数据特点来做出合适的选择。
本文归纳了20种数据相似性计算方法以及它们的特点和适用场景,并给出了参考python实现。

相似性计算方法

  1. 欧几里德距离(Euclidean Distance)
    特点:简单易懂,适用于连续数值数据,关注绝对值的差异。
    适用场景:数值型数据相似性比较,如向量、时间序列等。

  2. 曼哈顿距离(Manhattan Distance)
    特点:考虑每个维度的绝对差异,不受尺度影响,适用于连续数值数据。
    适用场景:数值型数据相似性比较,如地理坐标、时间序列等。

  3. 余弦相似度(Cosine Similarity)
    特点:适用于稀疏数据,只关注方向而非大小,适合文本分类、推荐系统等。
    适用场景:文本数据、向量表示的数据相似性比较。

  4. 皮尔逊相关系数(Pearson Correlation Coefficient)
    特点:衡量线性关系,对尺度敏感,适合关注变量间的线性关联性。
    适用场景:变量之间的线性关系比较,如数据分析、金融领域等。

  5. 汉明距离(Hamming Distance)
    特点:适用于二进制数据,衡量位不同的数量。
    适用场景:比特串、二值序列等相似性比较。

  6. Jaccard相似系数(Jaccard Similarity)
    特点:适用于集合型数据,衡量共同元素的比例。
    适用场景:集合数据、文本分类、社交网络分析等。

  7. 编辑距离(Edit Distance)
    特点:衡量序列的相似性,适用于字符串、序列等。
    适用场景:字符串匹配、语音识别、生物序列比对等。

  8. 汉明权重(Hamming Weight)
    特点:用于二进制数据,衡量位为1的数量。
    适用场景:比特串、二值序列等相似性比较。

  9. Jensen-Shannon散度(Jensen-Shannon Divergence)
    特点:适用于概率分布的相似性比较,考虑概率分布之间的差异。
    适用场景:概率分布比较、文本分类、信息检索等。

  10. 汉明相似度(Hamming Similarity)
    特点:适用于二进制数据,衡量位相同的比例。
    适用场景:比特串、二值序列等相似性比较。

  11. KL散度(Kullback-Leibler Divergence)
    特点:衡量两个概率分布之间的差异,非对称。
    适用场景:概率分布比较、信息论领域。

  12. DTW(Dynamic Time Warping)动态时间规整
    特点:适用于序列数据,考虑时间轴的变化,捕捉序列的形状相似性。
    适用场景:时间序列比较、语音识别等。

  13. Gower距离
    特点:适用于混合型数据,考虑不同数据类型的权重。
    适用场景:多类型数据的相似性比较。

  14. 矩阵距离(Matrix Distance)
    特点:适用于矩阵数据,衡量矩阵之间的差异。
    适用场景:图像相似性比较、矩阵数据分析等。

  15. Czekanowski-Dice系数
    特点:适用于集合型数据,考虑共同元素的比例。
    适用场景:生态学、遗传学等领域。

  16. Minkowski距离
    特点:通用距离度量,包括曼哈顿和欧几里德距离作为特例。
    适用场景:数值型数据相似性比较。

  17. Tanimoto系数
    特点:适用于集合型数据,衡量共同元素的比例。
    适用场景:集合数据、生物信息学等。

  18. Spearman等级相关系数
    特点:非线性关系,考虑等级关系的相似性。
    适用场景:排序数据的相似性比较。

  19. Haversine距离
    特点:适用于地理坐标数据,考虑球面上的距离。
    适用场景:地理位置数据的相似性比较。

  20. Wasserstein距离
    特点:适用于概率分布的相似性比较,考虑分布之间的运输成本。
    适用场景:概率分布比较、图像生成等。

相似性算法的数学公式

下面是上述20种数据相似性计算方法的数学表达式:

  1. 欧几里德距离(Euclidean Distance)
    Euclidean Distance = ∑ i = 1 n ( x i − y i ) 2 \text{Euclidean Distance} = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} Euclidean Distance=i=1n(xiyi)2

  2. 曼哈顿距离(Manhattan Distance)
    Manhattan Distance = ∑ i = 1 n ∣ x i − y i ∣ \text{Manhattan Distance} = \sum_{i=1}^{n} |x_i - y_i| Manhattan Distance=i=1nxiyi

  3. 余弦相似度(Cosine Similarity)
    Cosine Similarity = ∑ i = 1 n x i ⋅ y i ∑ i = 1 n x i 2 ⋅ ∑ i = 1 n y i 2 \text{Cosine Similarity} = \frac{\sum_{i=1}^{n} x_i \cdot y_i}{\sqrt{\sum_{i=1}^{n} x_i^2} \cdot \sqrt{\sum_{i=1}^{n} y_i^2}} Cosine Similarity=i=1nxi2 i=1nyi2 i=1nxiyi

  4. 皮尔逊相关系数(Pearson Correlation Coefficient)
    Pearson Correlation = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ⋅ ∑ i = 1 n ( y i − y ˉ ) 2 \text{Pearson Correlation} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2} \cdot \sqrt{\sum_{i=1}^{n} (y_i - \bar{y})^2}} Pearson Correlation=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

  5. 汉明距离(Hamming Distance)
    Hamming Distance = count ( x i ≠ y i ) \text{Hamming Distance} = \text{count}(x_i \neq y_i) Hamming Distance=count(xi=yi)

  6. Jaccard相似系数(Jaccard Similarity)
    Jaccard Similarity = count ( x i = y i ) count ( x i ∪ y i ) \text{Jaccard Similarity} = \frac{\text{count}(x_i = y_i)}{\text{count}(x_i \cup y_i)} Jaccard Similarity=count(xiyi)count(xi=yi)

  7. 编辑距离(Edit Distance)
    计算两个序列之间的最小操作数,如插入、删除和替换操作。(以字符串为例)
    编 辑 距 离 = 最 小 编 辑 操 作 次 数 编 辑 距 离 = 最 小 编 辑 操 作 次 数 编辑距离=最小编辑操作次数 编辑距离=最小编辑操作次数 ==

  8. 汉明权重(Hamming Weight)
    Hamming Weight = count ( x i = 1 ) \text{Hamming Weight} = \text{count}(x_i = 1) Hamming Weight=count(xi=1)

  9. Jensen-Shannon散度(Jensen-Shannon Divergence)
    JS ( P ∥ Q ) = 1 2 ∑ i = 1 n ( P i log ⁡ 2 2 P i P i + Q i + Q i log ⁡ 2 2 Q i P i + Q i ) \text{JS}(P \parallel Q) = \frac{1}{2} \sum_{i=1}^{n} \left( P_i \log_2 \frac{2P_i}{P_i + Q_i} + Q_i \log_2 \frac{2Q_i}{P_i + Q_i} \right) JS(PQ)=21i=1n(Pilog2Pi+Qi2Pi+Qilog2Pi+Qi2Qi)

  10. 汉明相似度(Hamming Similarity)
    Hamming Similarity = count ( x i = y i ) n \text{Hamming Similarity} = \frac{\text{count}(x_i = y_i)}{n} Hamming Similarity=ncount(xi=yi)

  11. KL散度(Kullback-Leibler Divergence)
    KL ( P ∥ Q ) = ∑ i = 1 n P i log ⁡ 2 P i Q i \text{KL}(P \parallel Q) = \sum_{i=1}^{n} P_i \log_2 \frac{P_i}{Q_i} KL(PQ)=i=1nPilog2QiPi

  12. DTW(Dynamic Time Warping)
    动态时间规整计算两个序列的最佳匹配。考虑两个序列之间的最佳匹配,可以允许时间轴的不同步长,捕捉序列之间的相似性。给出一个递归形式的表达式:
    DTW ( i , j ) = ∣ x [ i ] − y [ j ] ∣ + min ⁡ ( DTW ( i − 1 , j ) , DTW ( i , j − 1 ) , DTW ( i − 1 , j − 1 ) ) \text{DTW}(i, j) = |x[i] - y[j]| + \min(\text{DTW}(i-1, j), \text{DTW}(i, j-1), \text{DTW}(i-1, j-1)) DTW(i,j)=x[i]y[j]+min(DTW(i1,j),DTW(i,j1),DTW(i1,j1))

  13. Gower距离
    Gower Distance = 1 n ∑ i = 1 n d i j \text{Gower Distance} = \frac{1}{n} \sum_{i=1}^{n} d_{ij} Gower Distance=n1i=1ndij

  14. 矩阵距离(Matrix Distance)
    定义两个矩阵之间的距离度量方法。
    "矩阵距离"并不是一个常见的术语,可能会有不同的解释。如果您是指矩阵之间的距离或相似度计算,这可以用来比较两个矩阵的相似性或差异。如欧几里德距离(Euclidean Distance), 弗罗贝尼乌斯范数距离(Frobenius Norm Distance)等。
    弗罗贝尼乌斯范数是矩阵的一种范数,用于衡量矩阵的大小。弗罗贝尼乌斯范数距离衡量了两个矩阵之间的差异。如果有两个矩阵 A 和 B,其维度相同,弗罗贝尼乌斯范数距离的计算公式如下:
    Frobenius Norm Distance = ∑ i ∑ j ( A [ i , j ] − B [ i , j ] ) 2 \text{Frobenius Norm Distance} = \sqrt{\sum_{i}\sum_{j}(A[i, j] - B[i, j])^2} Frobenius Norm Distance=ij(A[i,j]B[i,j])2
    欧几里德距离考虑了每个元素之间的差异,而弗罗贝尼乌斯范数距离考虑了整个矩阵的差异。

  15. Czekanowski-Dice系数
    Czekanowski-Dice Coefficient = 2 × count ( x i = y i ) count ( x i ) + count ( y i ) \text{Czekanowski-Dice Coefficient} = \frac{2 \times \text{count}(x_i = y_i)}{\text{count}(x_i) + \text{count}(y_i)} Czekanowski-Dice Coefficient=count(xi)+count(yi)2×count(xi=yi)

  16. Minkowski距离
    Minkowski Distance = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p \text{Minkowski Distance} = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{\frac{1}{p}} Minkowski Distance=(i=1nxiyip)p1

  17. Tanimoto系数
    Tanimoto Coefficient = count ( x i = y i ) count ( x i ) + count ( y i ) − count ( x i = y i ) \text{Tanimoto Coefficient} = \frac{\text{count}(x_i = y_i)}{\text{count}(x_i) + \text{count}(y_i) - \text{count}(x_i = y_i)} Tanimoto Coefficient=count(xi)+count(yi)count(xi=yi)count(xi=yi)

  18. Spearman等级相关系数
    Spearman Rank Correlation = 1 − 6 ∑ i = 1 n d i 2 n ( n 2 − 1 ) \text{Spearman Rank Correlation} = 1 - \frac{6 \sum_{i=1}^{n} d_i^2}{n(n^2 - 1)} Spearman Rank Correlation=1n(n21)6i=1ndi2

  19. Haversine距离
    用于地理坐标数据的距离计算方法,基于球面距离的计算。
    Haversine Distance = 2 r arcsin ⁡ sin ⁡ 2 ( ϕ 2 − ϕ 1 2 ) + cos ⁡ ( ϕ 1 ) ⋅ cos ⁡ ( ϕ 2 ) ⋅ sin ⁡ 2 ( λ 2 − λ 1 2 ) \text{Haversine Distance} = 2r \arcsin \sqrt{\sin^2\left(\frac{\phi_2 - \phi_1}{2}\right) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \sin^2\left(\frac{\lambda_2 - \lambda_1}{2}\right)} Haversine Distance=2rarcsinsin2(2ϕ2ϕ1)+cos(ϕ1)cos(ϕ2)sin2(2λ2λ1)
    其中 r r r 为球体的半径,
    ϕ 1 , ϕ 2 \phi_1, \phi_2 ϕ1,ϕ2为两个点的纬度,
    λ 1 , λ 2 \lambda_1, \lambda_2 λ1,λ2为两个点的经度。

  20. Wasserstein距离
    衡量两个概率分布之间的距离,即将一个分布转移到另一个分布所需的最小成本。
    Wasserstein Distance = inf ⁡ γ ∈ Π ( P , Q ) ∑ i = 1 n ∑ j = 1 m γ i j ⋅ d ( x i , y j ) \text{Wasserstein Distance} = \inf_{\gamma \in \Pi(P, Q)} \sum_{i=1}^{n} \sum_{j=1}^{m} \gamma_{ij} \cdot d(x_i, y_j) Wasserstein Distance=γΠ(P,Q)infi=1nj=1mγijd(xi,yj)
    其中 Π ( P , Q ) \Pi(P, Q) Π(P,Q) 表示 P , Q P, Q P,Q 两个分布上的所有联合分布,
    d ( x i , y j ) d(x_i, y_j) d(xi,yj) 是数据点之间的距离。

算法的python参考实现

下面是20种数据相似性计算方法的Python参考实现代码:

import numpy as np
from scipy.spatial.distance import pdist, squareform


# 欧几里德距离
def euclidean_distance(x, y):
    return np.sqrt(np.sum((x - y)**2))

# 曼哈顿距离
def manhattan_distance(x, y):
    return np.sum(np.abs(x - y))

# 余弦相似度
def cosine_similarity(x, y):
    return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))

# 皮尔逊相关系数
def pearson_correlation(x, y):
    return np.corrcoef(x, y)[0, 1]

# 汉明距离
def hamming_distance(x, y):
    return np.sum(x != y)

# Jaccard相似系数
def jaccard_similarity(x, y):
    intersection = np.sum(np.logical_and(x, y))
    union = np.sum(np.logical_or(x, y))
    return intersection / union

# 编辑距离
def edit_distance(x, y):
    m, n = len(x), len(y)
    dp = np.zeros((m + 1, n + 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 x[i - 1] == y[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]
            else:
                dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
    return dp[m][n]

# 汉明权重
def hamming_weight(x):
    return np.sum(x)

# Jensen-Shannon散度
def jensen_shannon_divergence(p, q):
    m = 0.5 * (p + q)
    return 0.5 * (kl_divergence(p, m) + kl_divergence(q, m))

# 汉明相似度
def hamming_similarity(x, y):
    return np.sum(x == y) / len(x)

# KL散度
def kl_divergence(p, q):
    return np.sum(p * np.log2(p / q))

# 动态时间规整(DTW)
def dtw_distance(x, y):
    m, n = len(x), len(y)
    dp = np.zeros((m + 1, n + 1))
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            cost = abs(x[i - 1] - y[j - 1])
            dp[i][j] = cost + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
    return dp[m][n]

# Gower距离
def gower_distance(x, y, weights=None):
    if weights is None:
        weights = np.ones(len(x))
    diff = np.abs(x - y)
    return np.sum(weights * diff) / np.sum(weights)

# Matrix Distance: 矩阵距离的实现取决于具体用例。

# Czekanowski-Dice系数
def czekanowski_dice_coefficient(x, y):
    common_elements = np.sum(np.logical_and(x, y))
    total_elements = np.sum(np.logical_or(x, y))
    return 2 * common_elements / total_elements

# Minkowski距离
def minkowski_distance(x, y, p=2):
    return np.power(np.sum(np.power(np.abs(x - y), p)), 1/p)

# Tanimoto系数
def tanimoto_coefficient(x, y):
    common_elements = np.sum(np.logical_and(x, y))
    total_elements = np.sum(np.logical_or(x, y))
    return common_elements / (total_elements - common_elements)

# Spearman等级相关系数
def spearman_rank_correlation(x, y):
    rank_x = np.argsort(np.argsort(x))
    rank_y = np.argsort(np.argsort(y))
    return 1 - (6 * np.sum((rank_x - rank_y)**2)) / (len(x) * (len(x)**2 - 1))

# Haversine距离: 实现取决于具体用例。
def haversine_distance(coord1, coord2):
    lat1, lon1 = coord1
    lat2, lon2 = coord2
    radius = 6371  # 地球半径(单位:公里)
    dlat = np.radians(lat2 - lat1)
    dlon = np.radians(lon2 - lon1)
    a = np.sin(dlat/2) * np.sin(dlat/2) + np.cos(np.radians(lat1)) * np.cos(np.radians(lat2)) * np.sin(dlon/2) * np.sin(dlon/2)
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
    distance = radius * c
    return distance

# Wasserstein距离: 实现取决于具体用例。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117

矩阵距离和Wasserstein距离的实现因为涉及到更多的数据处理和计算,具体实现可能需要根据具体问题和数据类型进行调整。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/835291
推荐阅读
相关标签
  

闽ICP备14008679号