沿一个轴的矩阵相似性

时间:2014-11-06 17:32:32

标签: python matlab matrix correlation

你有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,将第一个组件作为相似性的衡量标准。然而,它有点慢,我觉得它有点矫枉过正。欢迎任何建议!

2 个答案:

答案 0 :(得分:3)

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

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

如果这确实是你想要的,它很容易计算如下,其中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

答案 1 :(得分:1)

allaxis=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]])