【问题标题】:How to create an adjacency/joint probability matrix in matlab如何在matlab中创建邻接/联合概率矩阵
【发布时间】:2021-04-17 18:55:45
【问题描述】:

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

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

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 上遇到了一些麻烦。如果你能帮助我指出正确的方向,那将是非常棒的。

【问题讨论】:

  • 根据您的描述,预期输出应为[1 4/5 2/5 ; ​4/5 1 3/5 ;2/5 3/5 1]

标签: matlab matrix adjacency-matrix probability-density


【解决方案1】:

所以,您可以分两部分进行。

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 的情况,但它可以适用于其他情况。

【讨论】:

    【解决方案2】:

    这里有一些替代方案,假设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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多