【问题标题】:Matrix similarity along one axis沿一个轴的矩阵相似度
【发布时间】:2014-11-06 17:32:32
【问题描述】:

Hi 有 2D 矩阵并且想要计算沿 Y 轴的相似性度量。

例如,下面的矩阵应该产生 0:

[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]

虽然这个应该产生 1:

[0, 1, 1, 0]
[0, 1, 1, 0]
[0, 1, 1, 0]
[0, 1, 1, 0]

在这些示例中,我在矩阵中使用了二进制值,但实际上它们是介于 0 和 1 之间的浮点数。矩阵要大得多并且存在噪声 - 计算必须非常快,因为我有大量矩阵为每个实验计算。

现在我正在做一个随机 PCA,将第一个组件作为相似度的度量。但是,它有点慢,我觉得它有点矫枉过正。欢迎提出任何建议!

【问题讨论】:

  • 元素明智的乘法将给出相似度的度量。
  • 哪种编程语言?
  • 对行求和,您将在第一种情况下得到 [1,1,1,1],在第二种情况下得到 [0,4,4,0]。然后你可以规范化,比如 1 映射到 0 和 4 到 1。

标签: python matlab matrix correlation


【解决方案1】:

这里真正的问题是如何定义相似度。

我假设您将相似性定义为相等行的比例。也就是说,如果你随机取两行不同的行,这两行相等的概率是多少?这个定义是我能想到的最简单的定义,适合您的示例所需的结果。

如果这确实是您想要的,它很容易计算如下,其中A 表示数据矩阵:

d = squeeze(all(bsxfun(@eq, A, permute(A, [3 2 1])), 2)); %// test all pairs
    %// of rows for equality
result = (sum(d(:))-size(d,1))/(numel(d)-size(d,1)); %// compute average, but
    %// removing similarity of each row with itself

【讨论】:

  • 我同意相似性的定义是问题所在。平均数是一个合理的选择。
【解决方案2】:

使用all和axis=0可以得到逻辑结果,然后重新应用于矩阵:

例子:

mx
matrix([[1, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])

mx1
matrix([[0, 1, 1, 0],
        [0, 1, 1, 0],
        [0, 1, 1, 0]])

申请:

# use .A to convert to array to do the logical calculation
np.matrix(mx.A * mx.all(axis=0).A)
matrix([[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]])

mx1 也一样:

np.matrix(mx1.A * mx1.all(axis=0).A) 
matrix([[0, 1, 1, 0],
        [0, 1, 1, 0],
        [0, 1, 1, 0]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多