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

时间:2016-02-15 19:24:27

标签: matlab machine-learning dataset distance-matrix

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

  1. 易于计算
  2. 易于访问
  3. 对于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矩阵存储在一个坏主意?我们可以考虑一个很酷的想法,可以帮助我快速找到哪个类似物与哪些项目相对应?

    谢谢。

2 个答案:

答案 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

最好,