【问题标题】:Finding similar rows in MATLAB在 MATLAB 中查找相似行
【发布时间】:2015-02-16 02:38:41
【问题描述】:

我有一个包含大量行的矩阵。我有另一个矩阵,我将一次循环遍历一行。对于第二个矩阵中的每一行,我需要在第一个矩阵中寻找相似的行。一旦找到所有相似的行,我需要知道相似行的行号。这些行几乎永远不会准确,因此ismember 不起作用。

此外,该解决方案最好(但不一定)提供某种方式来设置相似度,从而触发代码说它相似并给我行号。

有没有办法做到这一点?我环顾四周,找不到任何东西。

【问题讨论】:

  • 你的相似性度量是多少,欧几里得距离? pdist2 应该能帮到你
  • @ServerS 另请注意,pdist2 可以用于其他距离,而不仅仅是欧几里得

标签: matlab matrix rows


【解决方案1】:

您可以使用余弦距离,它可以找到两个向量之间的角度。相似向量(在您的情况下是一行和您的比较向量)的值接近 1,而不同向量的值接近 0。

function d = cosSimilarity(u, v)
  d = dot(u,v)/(norm(u)*norm(v));
end

要将此函数应用于矩阵MV 中的所有行对,您可以使用嵌套的for 循环。几乎不是最优雅的,但它会起作用:

numRowsM = size(M, 1)
numRowsV = size(V, 1)
similarThresh = .9

for m = 1:numRowsM
    for v = 1:numRowsV 
        similarity = cosSimilarity(V(v,:), M(m, :))

        % Notify about similar rows
        if similarity > similarThresh
            disp([num2str(m) ' is similar to a row in V'])
        end
    end
end

除了嵌套的for 循环之外,肯定还有其他方法。您可以从查看this 问题的解决方案开始,这将通过将矩阵的行转换为元胞数组的元胞然后使用cellfun 应用函数来帮助您避免循环。

【讨论】:

  • 那么V 是我的第二个矩阵吗?
  • 啊,我以为 V 是你想要比较的向量。误读了你的问题。因此,您想将 V 中的每一行与 M 中的每一行进行比较?很快会再次访问
  • 对,虽然 V 中的值总是比 M 中的少。我想要 M 中相似行的行号。
  • 好的,嵌套的for 循环应该可以工作,但可能有更好的解决方案。
猜你喜欢
  • 2011-04-19
  • 2015-05-07
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多