我想与大家一起在MATLAB中讨论一个想法。给定一个矩阵,具有许多列(14K)和少量行(7),其中列表示项目,行表示项目的特征,我希望计算所有项目之间的相似性,并将其保存在一个矩阵中,该矩阵应具备以下特点:
- 易于计算
- 易于访问
对于第1点,我想到一个绝妙的想法,使用pdist()
函数,它非常快:
A % 我的矩阵 S = pdist(A') % 非常快速地计算所有列之间的相似性
然而,访问s
并不方便。我更希望通过S(i,j)
来访问项目i
和j
之间的相似性,例如:
S(4,5) % 是项目4和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
本质上是建议节省空间:由于这样的矩阵是对称的,你可以将其一半存储在一个向量中。实际上,数组S
有m(m-1)/2
个元素,而矩阵形式有m^2
个元素(如果m
是你的训练集中模式的数量)。另一方面,访问这样的向量肯定会更加复杂,而矩阵则非常直观。