在Matlab中优化成对距离函数的参数

时间:2014-01-28 23:02:46

标签: arrays matlab matrix find

此问题与matlab: find the index of common values at the same entry from two arrays有关。

假设我有100010000矩阵,其中包含值012。每行都被视为样本。我想根据公式d = 1-1/(2p)sum(a/c+b/d)计算这些样本之间的成对距离,其中abcd可以视为行向量长度10000根据某些定义和p=10000cd的概率是c+d=1

如何找到abcd的值的示例:假设我们想要在示例{{d之间找到i 1}}和b j,然后我会查看行ij

如果行ki的{​​{1}}条目的值为j2,那么2(我想我会分配)在这种情况下a=2,b=0,c=1,d=0)。

如果行0/0=0k的{​​{1}}条目的值为ij,反之亦然,那么2

相似的作业将针对1a=1,b=0,c=3/4,d=1/4),2,0a=0,b=0,c=1/2,d=1/2),1,1a=1,b=1,c=1/2,d=1/2)的情况1,0a=0,b=1,c=1/4,d=3/4)。

我到目前为止使用的matlab代码是0,0a=0,b=2,c=0,d=1使用for循环,然后使用i找到上述情况,然后为{创建两个数组{1}}和j。这是非常缓慢的,有没有办法可以提高效率?

修改:距离find是第13页的this paper中给出的公式。

1 个答案:

答案 0 :(得分:0)

如果那些系数是固定的,那么我认为我已经成功地对距离函数进行了矢量化。弄清楚公式很有趣。我把事情翻了一下,以尽量减少分裂,因为直到@ horchler的注释我都不知道pdist,所以你将它包含在循环中,并将常量考虑在内:

% m is the data
[n p] = size(m, 1);
distance = zeros(n);
for ii=1:n
    for jj=ii+1:n
        a = min(m(ii,:), m(jj,:));
        b = 2 - max(m(ii,:), m(jj,:));
        c = 4 ./ (m(ii,:) + m(jj,:));
        c(c == Inf) = 0;
        d = 1 - c;

        distance(ii,jj) = sum(a.*c + b.*d);
        % distance(jj,ii) = distance(ii,jj); % optional for the full matrix
    end
end
distance = 1 - (1 / (2 * p)) * distance;