以一种很好的方式表示许多项目之间的相似性 MATLAB

Represent the similarity between many items in a nice manner MATLAB

我想和你们一起在 MATLAB 中集思广益。给定一个包含许多列(14K)和几行(7)的矩阵,其中列是项目和项目的行特征,我想计算与所有项目的相似度并将其保存在矩阵中:

  1. 易于计算
  2. 易于访问

对于 1.,我想出了一个使用 pdist() 的好主意,它非常快:

 A % my matrix
 S = pdist(A')  % computes the similarity btw all columns very fast

但是访问s并不方便。我更喜欢访问项目 ij 之间的相似性,例如使用 S(i,j):

 S(4,5)  % is the similarity between item 4 and 5

在其原始定义中,S 是一个数组而不是矩阵。将其作为 2D 矩阵在存储方面是个坏主意吗?我们能否想出一个很酷的主意,可以帮助我快速找到哪些相似度对应于哪些项目?

谢谢。

您可以使用 pdist2(A',A')。返回的本质上是标准形式的距离矩阵,其中元素 (i,j) 是第 i 个和第 j 个模式之间的差异(或相似)。
另外,如果你想使用pdist(),也可以,你可以使用函数squareform()将结果数组转换为众所周知的距离矩阵。

因此,总而言之,如果 A 是您的数据集,S 是距离矩阵,您可以使用

S=pdist(A');
S=squareform(S);

S=pdist2(A',A');

现在,从存储的角度来看,你肯定会注意到这样的矩阵是对称的。 Matlab 本质上对 pdist() 中的数组 S 提出的是保存 space:由于这样的矩阵是对称的,你也可以将它的一半保存在一个向量中。事实上,数组 Sm(m-1)/2 个元素,而矩阵形式有 m^2 个元素(如果 m 是训练集中的模式数)。另一方面,访问这样的向量肯定比较棘手,而矩阵绝对简单。

我不太确定你的问题是什么,但如果你想轻松访问 S(i, j) 那么函数 squareform 就是为此而设计的:

S = squareform(pdist(A'));

最佳,