【问题标题】:How to compute distance between two vectors based on measures?如何根据度量计算两个向量之间的距离?
【发布时间】:2019-05-29 12:53:20
【问题描述】:

我想计算矩阵中每列与除自身之外的其他列之间的距离的平均值。

我写了这段代码:

For i=1:m
  For j=1:m-1
    If(i==j)
      d=0;
    Else
      d=pdist2(a(:,i),a(:,j),'jaccard');
      s=sum(d)/(m-1);
    End
  End
End

矩阵是 nxm。

我知道 pdist2 函数支持一些距离度量,例如 jaccard 、 cosine 、 hamming 、 euclidean....

但如果我想计算堪培拉或克拉克距离度量或类似的度量,我应该以这种方式在 pdist2 中定义一个函数:

D=pdist2(x,y,@distfun) 

我想知道如何为这些度量定义距离函数?


编辑:目的是然后凭经验获得值开始减少的点,但数字没有显示这一点......

【问题讨论】:

    标签: matlab matrix euclidean-distance


    【解决方案1】:

    Canberra Distance 定义为

    您将两个列向量传递给pdist2,因此我们可以将上述等式实现为接受向量输入的匿名函数...

    fCanberraDist = @(p,q) sum( abs(p - q) ./ ( abs(p) + abs(q) ) );
    

    现在你有了函数句柄,你可以使用如下:

    % ... previous code
    d = pdist2( a(:,i), a(:,j), fCanberraDist );
    % ... further code
    

    请注意,您目前没有对结果做任何事情,我假设这只是为了示例代码。

    您可以以类似的方式将任何其他自定义距离度量定义为匿名函数或完全独立的函数(在其自己的 .m 文件中或在本地定义)。

    【讨论】:

    • 在循环之后,我想使用 plot(s) 来绘制 m 偏差,也许我可以找到这些值的阈值。从值的图中找到阈值是否可行?还是有更好的程序?
    • 不清楚您所说的“找到一个阈值”是什么意思——这个阈值的标准是什么?如果您可以用数学方式定义它,那么最好以编程方式进行。
    • 我想凭经验获得值开始减少的点,但数字没有显示这一点,例如,我在我的问题中附上了堪培拉距离的数字。你的意思是我应该先在数学上定义它。
    • 我已经回答了您的原始问题,我无法告诉您为什么您生成的数字未显示您预期的结果...您没有提供minimal reproducible example 来重现这些结果,或任何解释为什么它们不符合预期?如果这里关于实施自定义距离测量的原始问题已经得到解答,这可能需要它自己的问题。如果是这种情况,请将我的回答标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多