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