-1

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

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

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

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

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

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

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

谢谢你。

4

2 回答 2

2

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

所以,总而言之,如果A是你的数据集和S距离矩阵,你可以使用

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

或者

S=pdist2(A',A');

现在,关于存储的观点,你肯定会注意到这样的矩阵是对称的。Matlab 本质上建议使用数组Spdist()节省空间:由于这样的矩阵是对称的,您也可以将其中的一半保存在向量中。实际上,数组Sm(m-1)/2元素,而矩阵形式有m^2元素(如果m是训练集中的模式数量)。另一方面,访问这样的向量肯定更棘手,而矩阵绝对简单。

于 2016-02-15T19:29:10.413 回答
2

我不完全确定您的问题是什么,但是如果您想S(i, j)轻松访问,那么该功能squareform就是为此而设计的:

S = squareform(pdist(A'));

最好的,

于 2016-02-15T19:32:19.730 回答