如何在matlab中创建邻接/联合概率矩阵



从一个二进制矩阵,我想计算一种邻接/联合概率密度矩阵(不太确定如何标记它,所以请随意重命名(。

例如,我从这个矩阵开始:

A = [1   1   0   1   1
1   0   0   1   1
0   0   0   1   0]

我想产生这样的输出:

Output = [1   4/5   1/5 
4/5   1    1/5 
1/5   1/5   1]

基本上,对于每一行,我都想计算他们达成一致的次数比例(1和1或0和0(。A总是与自身一致,因此沿对角线将其设为1。无论添加多少不同的js,它仍然会产生3x3,但额外的i变量会产生4x4。

我喜欢把A矩阵中沿着I的输入看作人,把Js看作问题,所以最终输出是3x3(人数(矩阵。

我在matlab上遇到了一些问题。如果你能帮我指明正确的方向,那就太棒了。

因此,您可以分两部分来完成此操作。

bothOnes = A*A';

给出一个矩阵,显示每对行共享多少个1,以及

bothZeros = (1-A)*(1-A)';

给出一个矩阵,显示每对行共享多少0。

如果你把它们加起来,你就会得到它们共享的任何一种元素的数量:

bothSame = A*A' + (1-A)*(1-A)';

然后只需除以行长度即可得到所需的分数表示:

output = (A*A' + (1-A)*(1-A)') / size(A, 2);

这应该能让你到达那里。

请注意,只有当A只包含1和0时,这才有效,但它可以适用于其他情况。

以下是一些替代方案,假设A只能包含01:

  • 如果您有统计工具箱:

    result = 1-squareform(pdist(A, 'hamming'));
    
  • 隐含扩展的手动方法:

    result = mean(permute(A, [1 3 2])==permute(A, [3 1 2]), 3);
    
  • 使用按位操作。这是一种更深奥的方法,由于浮点限制,只有当A最多有53列时才有效:

    t = bin2dec(char(A+'0')); % convert each row from binary to decimal
    u = bitxor(t, t.'); % bitwise xor
    v = mean(dec2bin(u)-'0', 2); % compute desired values
    result = 1 - reshape(v, size(A,1), []); % reshape to obtain result
    

相关内容

  • 没有找到相关文章

最新更新