首页 > 其他分享 >Hausdorff Distance 和 Euclidean Distance Mean欧氏距离

Hausdorff Distance 和 Euclidean Distance Mean欧氏距离

时间:2024-08-31 17:14:31浏览次数:13  
标签:Distance target Euclidean pred 距离 点集 Hausdorff

import torch
import torch.nn as nn


class HausdorffDistanceLoss(nn.Module):
    def __init__(self):
        super(HausdorffDistanceLoss, self).__init__()

    def forward(self, pred, target):
        # 扩展为 (B, N, 1, D) 和 (B, 1, M, D)
        pred = pred.unsqueeze(1)  # (N, D) -> (N, 1, D)
        target = target.unsqueeze(0)  # (M, D) -> (1, M, D)

        # 计算两组点之间的 pairwise 距离
        distances = torch.norm(pred - target, dim=2)  # (N, M)

        # Hausdorff 距离的两个方向
        h_a_to_b = distances.min(dim=1)[0].max()  # a -> b 距离
        h_b_to_a = distances.min(dim=0)[0].max()  # b -> a 距离

        return (h_a_to_b + h_b_to_a) / 2  # 返回 Hausdorff 距离


class OptimizedHausdorffDistanceLoss(nn.Module):
    def __init__(self):
        super(OptimizedHausdorffDistanceLoss, self).__init__()

    def forward(self, pred, target):
        """
        pred: (B, N, D) - 预测点集
        target: (B, M, D) - 目标点集
        B: 批量大小
        N: 每个预测点集的点数
        M: 每个目标点集的点数
        D: 点的维度
        """
        # 确保两个张量的数据类型一致
        if pred.dtype != target.dtype:
            target = target.to(pred.dtype)

        # 使用torch.cdist计算距离矩阵
        distances = torch.cdist(pred, target)  # (B, N, M)

        # 从pred到target的最大最小距离
        h_a_to_b = distances.min(dim=1)[0].max(dim=0)[0]  # (B,)
        # 从target到pred的最大最小距离
        h_b_to_a = distances.min(dim=1)[0].max(dim=0)[0]  # (B,)

        # 返回Hausdorff距离作为损失值
        return ((h_a_to_b + h_b_to_a) / 2).mean()  # 返回批量的平均损失


def euclidean_distance_mean(pred, target):
    """
    计算两个点集之间的欧氏距离,并返回平均值。

    参数:
    pred: Tensor (N, D) - 预测点集
    target: Tensor (M, D) - 目标点集

    返回:
    mean_distance: float - 欧氏距离的平均值
    """
    # 计算两个点集之间的 pairwise 欧氏距离
    distances = torch.cdist(pred, target, p=2)  # 使用 p=2 计算欧氏距离

    # 计算 pairwise 距离的平均值
    mean_distance = distances.mean()

    return mean_distance

# 测试部分
if __name__ == "__main__":
    # 创建两个点集,每个点集只有两个点
    pred = torch.tensor([[1.0, 2.0, 3.0], [3.0, 4.0, 5.0]])
    target = torch.tensor([[2.0, 3.0, 3.0], [3.0, 4.0, 5.0]])

    # 初始化损失函数
    loss_fn = HausdorffDistanceLoss()
    loss_fn2 = OptimizedHausdorffDistanceLoss()

    # 计算损失值
    loss = loss_fn(pred, target)
    loss2 = loss_fn2(pred, target)

    print("Hausdorff Distance Loss:", loss.item())
    print("Optimized Hausdorff Distance Loss:", loss2.item())

    # 计算欧氏距离的平均值
    mean_distance = euclidean_distance_mean(pred, target)

    print("Euclidean Distance Mean:", mean_distance.item())
D:\ProgramData\Anaconda3\envs\torch38\python.exe D:\Desktop\Aidyna\test2.py 
Hausdorff Distance Loss: 1.4142135381698608
Optimized Hausdorff Distance Loss: 1.4142135381698608
Euclidean Distance Mean: 1.8319511413574219

进程已结束,退出代码为 0

区别解释:

  1. Hausdorff Distance:

    • Hausdorff 距离用于衡量两个点集之间最远的最近点的距离。
    • 它首先计算从一个点集到另一个点集的最短距离,然后在这些最短距离中选择最大的那个值。这通常用于比较两个几何形状的相似性。
    • h_a_to_b 计算的是 predtarget 的最大最小距离,h_b_to_a 计算的是 targetpred 的最大最小距离,最终 Hausdorff 距离是这两个距离的平均值。

    由于 Hausdorff 距离只关心两个点集中最远的最近点,因此它的值通常较小,尤其是在两个点集较为相似的情况下。

  2. Euclidean Distance Mean:

    • 欧氏距离的均值则是两个点集中所有点之间的 pairwise 距离的均值。
    • 它计算所有点对之间的欧氏距离,然后取这些距离的平均值。

    因为它考虑了所有点对的距离,因此它会产生一个相对较大的值,尤其是当点集中的所有点距离都不近时。

为什么结果不同?

  • Hausdorff 距离 专注于找到两个点集中最不相似的部分,因此它的值反映的是最远的最近距离,这在你例子中是 1.4142135381698608(即 sqrt(2),与点 (1, 2, 3)(2, 3, 3) 的距离一致)。
  • 欧氏距离均值 则计算了所有点对的距离,包括一些距离较大的点对(如 (1, 2, 3)(3, 4, 5)),因此它得出了较大的平均值 1.8319511413574219

这就是为什么 Hausdorff 距离和欧氏距离的平均值会不同,它们度量的东西不同:

  • Hausdorff 距离:更关注最坏情况的点对。
  • 欧氏距离均值:关注所有点对的整体距离。

 

标签:Distance,target,Euclidean,pred,距离,点集,Hausdorff
From: https://www.cnblogs.com/arwen-xu/p/18390510

相关文章

  • TCPIP路由技术第一卷 第三大部分-7 策略路由、distance、环路
    r1:routerospf110redripsubnetstag100route-maptagmatchipadd10routerospf110redripsubnetsroute-maptagroute-maptagsettag114access-list10permit33.1.1.00.0.0.255r4:access-list10permit33.1.1.00.0.0.255route-maptmatchipad......
  • 汉明距离(Hamming distance)
    在图像信号处理中,汉明距离(Hammingdistance)通常用于比较两个图像之间的差异程度。汉明距离原本是衡量两个等长字符串之间对应位置上不同字符的数量,但在图像处理中,它也可以用来比较两个图像的像素值差异。计算步骤1、图像预处理:确保两个图像的尺寸相同,如果不同,则需要通过缩放或......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance
    https://codeforces.com/contest/1881/problem/F不难发现一件事情,我们这里最后的答案所在的点是1和3号点。我们有没有发现一个性质:就是这两个点都是红点间的路径上的,而且最后的答案就是最长的红点间的距离的长度除以二上取整。那么,我们怎么找到最长的红点间的距离呢?很显......
  • ABC201E Xor Distances 题解
    ABC201EXorDistances题解题目大意给定一个带权树,求树上每两点的简单路径上的边权的异或和的和。形式化的,定义\(dis(i,j)\)为\(i\)到\(j\)的简单路径上的边权的异或和,求\(\large\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n\text{dis}(i,j)\)。Solve令\(\largef(u)=......
  • 论文笔记:Investigation of Passengers’ Perceived Transfer Distance in Urban Rail
    (基于XGBoost和SHAP的城市轨道交通站点乘客感知换乘距离研究)话题点:城市轨道交通站点、换乘距离、XGBoost模型、SHAP模型:感知传输距离偏差theRatioofPerceivedTransferDistanceDeviation(R)、XGBoost和SHAP模型考虑的因素:乘客个人属性、换乘设施和换乘环境相关的32个指......
  • Distance to Different
    最开始观察\(a\)没看出什么东西来,于是看\(b\),由于统计的是不同的\(b\)的数量,所以考虑一个\(b\)可以由什么\(a\)搞出来,然后就不难发现如果我们将\(a\)分段(相同的数放一段),那么对应的\(b\)在同一段就会从\(1\)开始增加,然后到达一个峰值之后再减小到\(1\)(开头和结尾的两段只有减少或增......
  • Leetcode 3244. Shortest Distance After Road Addition Queries II
    Leetcode3244.ShortestDistanceAfterRoadAdditionQueriesII1.解题思路2.代码实现题目链接:3244.ShortestDistanceAfterRoadAdditionQueriesII1.解题思路这一题的话由于题目限制了road不会交叉,因此我们只需要在每次增加road之后将中间节点删除,剩余的路......
  • 图像生成中图像质量评估指标—Chamfer Distance介绍
    文章目录1.背景介绍2.实际应用3.总结和讨论1.背景介绍ChamferDistance是一种用于度量两个集合之间相似性的方法,尤其在计算机视觉和图像处理中,它常用于比较图像或形状的二值表示。ChamferDistance基于局部邻域的概念,通过计算一个集合中每个点到另一个集合最近......
  • 每日一题- Jump Distance Sum
    https://www.luogu.com.cn/problem/AT_abc351_e*这是我的第一个随笔,请大佬们指正。数学知识:https://oi-wiki.org/geometry/distance/*曼哈顿距离:在二维空间内,两个点之间的曼哈顿距离(Manhattandistance)为它们横坐标之差的绝对值与纵坐标之差的绝对值之和。设点A(x1,y1),B(x2,......
  • P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance
    思路:注意到点对数量有\(N^2\)个,考虑丢掉一些无用的点对。对于点对\((x_1,y_1),(x_2,y_2)\),满足\(x_1\lex_2<y_2\ley_1\),即区间\([x_2,y_2]\)被\([x_1,y_1]\)包含,此时满足若询问到了\([x_1,y_1]\),则一定会询问到\([x_2,y_2]\)。若满足\(\operatorname{dis}(x_1......