首页 文章

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

提问于
浏览
0

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

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

如何查找 abcd 的值的示例:假设我们要在样本 i 和b j 之间找到 d ,然后我查看行 ij .

如果行 ijk 条目具有值 22 ,那么 a=2,b=0,c=1,d=0 (我想在这种情况下我将分配 0/0=0 ) .

如果行 ijk 条目具有值 21 ,反之亦然,那么 a=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 ), 0,0a=0,b=2,c=0,d=1 )提供案件 .

我到目前为止使用的matlab代码是 ij 使用 for 循环,然后使用 find 找到上述情况,然后为 a/cb/d 创建两个数组 . 这是非常缓慢的,有没有办法可以提高效率?

编辑:距离 d 是第13页的this paper中给出的公式 .

1 回答

  • 0

    如果这些系数是固定的,那么我想我知道 pdist 直到@ horchler的注释,你得到它包含在循环中,并将常数考虑在内:

    % 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;
    

相关问题