【问题标题】:How do I create a simliarity matrix in MATLAB?如何在 MATLAB 中创建相似度矩阵?
【发布时间】:2011-05-09 10:37:26
【问题描述】:

我正在努力比较多张图片。我将这些图像数据作为称为“图像”的矩阵的列向量。我想通过首先计算它们的欧几里德距离来评估图像的相似性。然后我想创建一个矩阵,我可以在该矩阵上执行多个随机游走。现在,我的代码如下:

% clear
% clc
% close all
% 
% load tea.mat;

images = Input.X;

M = zeros(size(images, 2), size (images, 2));

for i = 1:size(images, 2)
    for j = 1:size(images, 2)
        normImageTemp = sqrt((sum((images(:, i) - images(:, j))./256).^2));

        %Need to accurately select the value of gamma_i
        gamma_i = 1/10;

        M(i, j) = exp(-gamma_i.*normImageTemp);
    end 
end

然而,我的矩阵 M 最终沿其主对角线的值为 1,而其他地方的值为 0。我期待每行的前几个元素的“大”值和列索引> 4的元素的“小”值。有人可以解释什么是错的吗?任何建议表示赞赏。

【问题讨论】:

    标签: matlab matrix cluster-analysis similarity euclidean-distance


    【解决方案1】:

    您得到的结果似乎是合理的。回忆一下 exp(-x) 的行为。 x 为零时,exp(-x) 为 1。x 较大时,exp(-x) 为零。

    也许如果你让 M(i,j) = normImageTemp;你会看到你期望看到的。

    【讨论】:

      【解决方案2】:

      由于您尝试计算 Euclidean distance,因此在计算 normImageTemp 时,括号的放置位置似乎有误。你有这个:

      normImageTemp = sqrt((sum((...)./256).^2));
                        %# ^--- Note that this parenthesis...
      

      但你实际上想要这样做:

      normImageTemp = sqrt(sum(((...)./256).^2));
                        %#    ^--- ...should be here
      

      换句话说,您需要执行逐元素平方,然后求和,然后是平方根。您现在所做的是先对元素求和,然后平方并取总和的平方根,这基本上相互抵消(或者实际上相当于只取绝对值)。 p>

      顺便说一句,您实际上可以使用函数NORM 为您执行此操作,如下所示:

      normImageTemp = norm((images(:, i) - images(:, j))./256);
      

      【讨论】:

        【解决方案3】:

        考虑这个解决方案:

        I = Input.X;
        
        D = squareform( pdist(I') );       %'# euclidean distance between columns of I
        M = exp(-(1/10) * D);              %# similarity matrix between columns of I
        

        PDIST 和 SQUAREFORM 是统计工具箱中的函数。

        否则考虑这个等效的矢量化代码(仅使用内置函数):

        %# we know that: ||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v
        X = sum(I.^2,1);
        D = real( sqrt(bsxfun(@plus,X,X')-2*(I'*I)) );
        M = exp(-(1/10) * D);
        

        正如其他答案中所解释的,D 是距离矩阵,而 exp(-D) 是相似度矩阵(这就是为什么你会在对角线上得到一个)

        【解决方案4】:

        有一个已经实现的函数pdist,如果你有一个矩阵A,你可以直接做

        Sim=squareform(pdist(A))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-12
          • 2013-08-28
          • 2021-01-09
          • 2017-06-13
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多