我想和你们一起在MATLAB中集思广益。给定一个包含许多列(14K)和几行(7)的矩阵,其中列是项目的项目和行特征,我想计算所有项目的相似性并将其保存在矩阵中:
对于1.,我想出了一个非常快速使用pdist()
的好主意:
A % my matrix
S = pdist(A') % computes the similarity btw all columns very fast
但访问s
并不方便。我更喜欢访问项i
和j
之间的相似性,例如使用S(i,j)
:
S(4,5) % is the similarity between item 4 and 5
在其原始定义中,S
是一个数组而不是一个矩阵。是否将它作为2D矩阵存储在一个坏主意?我们可以考虑一个很酷的想法,可以帮助我快速找到哪个类似物与哪些项目相对应?
谢谢。
答案 0 :(得分:2)
您可以使用pdist2(A',A')
。返回的内容基本上是标准形式的距离矩阵,其中元素(i,j)
是第i个和第j个模式之间的不相似性(或相似性)。
此外,如果您想使用pdist()
,也可以使用函数squareform()
将结果数组转换为众所周知的距离矩阵。
因此,总而言之,如果A
是您的数据集而S
是距离矩阵,则可以使用
S=pdist(A');
S=squareform(S);
或
S=pdist2(A',A');
现在,关于存储视点,您肯定会注意到这种矩阵是对称的。 Matlab基本上在S
中使用数组pdist()
提出的是节省空间:由于这样的矩阵是对称的,所以你可以在向量中保存一半。实际上,数组S
具有m(m-1)/2
元素,而矩阵形式具有m^2
元素(如果m
是训练集中的模式数)。另一方面,访问这样的向量肯定是比较棘手的,而矩阵绝对是直截了当的。
答案 1 :(得分:2)
我不完全确定您的问题是什么,但如果您想轻松访问composer require laravelcollective/html
,则可以使用S(i, j)
函数:
squareform
最好,