【问题标题】:Represent the similarity between many items in a nice manner MATLAB [closed]以一种很好的方式表示许多项目之间的相似性MATLAB [关闭]
【发布时间】:2016-05-26 20:09:37
【问题描述】:

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

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

对于 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 矩阵存储是一个坏主意吗?我们能不能想一个很酷的想法,可以帮助我快速找到哪些相似性对应哪些项目?

谢谢。

【问题讨论】:

    标签: matlab machine-learning dataset distance-matrix


    【解决方案1】:

    您可以使用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 是您的训练集中的模式数)。另一方面,访问这样的向量肯定比较棘手,而矩阵绝对简单。

    【讨论】:

      【解决方案2】:

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

      S = squareform(pdist(A'));
      

      最好的,

      【讨论】:

      • 感谢这两个解决方案都运行良好。目前,对于 14K 项目,我没有遇到内存问题,但您的评论是正确的 Allessiox
      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2015-10-30
      • 2018-05-14
      • 1970-01-01
      相关资源
      最近更新 更多