如何在MATLAB中创建相似度矩阵?

时间:2010-11-13 05:51:37

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

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

% 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,其他地方的值为零。我期望每行的前几个元素的“大”值和列索引>的元素的“小”值。有人可以解释一下是什么问题吗?任何建议都表示赞赏。

4 个答案:

答案 0 :(得分:2)

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

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

但你真的想这样做:

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

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

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

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

答案 1 :(得分:0)

你得到的结果似乎合情合理。回想一下exp(-x)的行为。当x为零时,exp(-x)为1.当x为大时,exp(-x)为零。

也许你做M(i,j)= normImageTemp;你会看到你期望看到的东西。

答案 2 :(得分:0)

考虑这个解决方案:

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)是相似度矩阵(这就是为什么你在对角线上得到的)

答案 3 :(得分:0)

已经实现了函数pdist,如果你有矩阵A,你可以直接执行

Sim = squareform(pdist(A))