以一种很好的方式表示许多项目之间的相似性 MATLAB
Represent the similarity between many items in a nice manner MATLAB
我想和你们一起在 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 矩阵在存储方面是个坏主意吗?我们能否想出一个很酷的主意,可以帮助我快速找到哪些相似度对应于哪些项目?
谢谢。
您可以使用 pdist2(A',A')
。返回的本质上是标准形式的距离矩阵,其中元素 (i,j)
是第 i 个和第 j 个模式之间的差异(或相似)。
另外,如果你想使用pdist()
,也可以,你可以使用函数squareform()
将结果数组转换为众所周知的距离矩阵。
因此,总而言之,如果 A
是您的数据集,S
是距离矩阵,您可以使用
S=pdist(A');
S=squareform(S);
或
S=pdist2(A',A');
现在,从存储的角度来看,你肯定会注意到这样的矩阵是对称的。 Matlab 本质上对 pdist()
中的数组 S
提出的是保存 space:由于这样的矩阵是对称的,你也可以将它的一半保存在一个向量中。事实上,数组 S
有 m(m-1)/2
个元素,而矩阵形式有 m^2
个元素(如果 m
是训练集中的模式数)。另一方面,访问这样的向量肯定比较棘手,而矩阵绝对简单。
我不太确定你的问题是什么,但如果你想轻松访问 S(i, j)
那么函数 squareform
就是为此而设计的:
S = squareform(pdist(A'));
最佳,
我想和你们一起在 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 矩阵在存储方面是个坏主意吗?我们能否想出一个很酷的主意,可以帮助我快速找到哪些相似度对应于哪些项目?
谢谢。
您可以使用 pdist2(A',A')
。返回的本质上是标准形式的距离矩阵,其中元素 (i,j)
是第 i 个和第 j 个模式之间的差异(或相似)。
另外,如果你想使用pdist()
,也可以,你可以使用函数squareform()
将结果数组转换为众所周知的距离矩阵。
因此,总而言之,如果 A
是您的数据集,S
是距离矩阵,您可以使用
S=pdist(A');
S=squareform(S);
或
S=pdist2(A',A');
现在,从存储的角度来看,你肯定会注意到这样的矩阵是对称的。 Matlab 本质上对 pdist()
中的数组 S
提出的是保存 space:由于这样的矩阵是对称的,你也可以将它的一半保存在一个向量中。事实上,数组 S
有 m(m-1)/2
个元素,而矩阵形式有 m^2
个元素(如果 m
是训练集中的模式数)。另一方面,访问这样的向量肯定比较棘手,而矩阵绝对简单。
我不太确定你的问题是什么,但如果你想轻松访问 S(i, j)
那么函数 squareform
就是为此而设计的:
S = squareform(pdist(A'));
最佳,