微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

今天在 Matlab 中是否有更好的成对马哈拉诺比斯距离计算器

如何解决今天在 Matlab 中是否有更好的成对马哈拉诺比斯距离计算器

对于每个数据点都有自己的协方差矩阵的测量数据,我一直在寻找内置的马氏距离计算器,希望能提高我的软件效率。

查看 pdist2 函数,它将计算马哈拉诺比斯距离,但我只能提供一个协方差矩阵,显然它用于计算每个成对距离。它似乎不允许每个数据点(或数据点对)使用不同的协方差值。(我理解对吗?如果是这样,我看不出它有什么用处。)

我一直在使用 Profiler 来加速测试我的代码。原始代码使用 pdist2 和欧几里得距离。

这段代码有两个嵌套的 for 循环,但允许我提供成对的协方差矩阵。 (仅显示测试部分。)

na = size(a,1);
nb = size(b,1);

D2 = zeros(na,nb);

if na > 1 && nb > 1
    if isequal(a,b)    
        for ia = 1:na
            for ib = ia+1:nb
                if ~isempty(manhattanLimit) && sum(abs(a(ia,:)-b(ib,:))) > manhattanLimit
                    D2(ia,ib) = squareOfAVeryLargedistance;
                    D2(ib,ia) = D2(ia,ib);
                else
                    D2(ia,ib) = mahaldist(a(ia,:),(covA(:,:,ia))+(covB(:,ib)));
                    D2(ib,ib);
                end
            end
        end
    else

这与我从 a post from 2012 获得的函数 mahadist 一起使用:

function D2 = mahaldist(dx,C)

if isrow(dx)
    dx = dx';
end

if isdiag(C)
    D2 = sum(dx.*dx./diag(C));
else

    % Using this answer from StackOverflow:
    %       "Mahalanobis distance inverting the covariance matrix"
    %       https://stackoverflow.com/a/11799356/696042
    %   Relative time is 24.88 vs. 53.77 for direct calculation with x*inv(C)*x'
    %   when called 6,124,012 times.

    L=chol(C); 
    z=L\dx; 
    D2=z'*z; 
end

这比 pdist2(欧几里得)慢 24 倍。如果我没有对 manhattanLimit 或协方差的对角线进行测试,它将运行另一个因子 5.5,或比 pdist2(euclidean) 慢约 132 倍。

在我开始重新发明之前,有没有人知道我应该采取的其他方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。