以优雅的方式表示多个项目之间的相似性 MATLAB

我想与大家一起在MATLAB中讨论一个想法。给定一个矩阵,具有许多列(14K)和少量行(7),其中列表示项目,行表示项目的特征,我希望计算所有项目之间的相似性,并将其保存在一个矩阵中,该矩阵应具备以下特点:

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

对于第1点,我想到一个绝妙的想法,使用pdist()函数,它非常快:

 A % 我的矩阵 S = pdist(A')  % 非常快速地计算所有列之间的相似性

然而,访问s并不方便。我更希望通过S(i,j)来访问项目ij之间的相似性,例如:

 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本质上是建议节省空间:由于这样的矩阵是对称的,你可以将其一半存储在一个向量中。实际上,数组Sm(m-1)/2个元素,而矩阵形式有m^2个元素(如果m是你的训练集中模式的数量)。另一方面,访问这样的向量肯定会更加复杂,而矩阵则非常直观。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注