Matrix 计算不同列之间的相似度

Matrix 计算不同列之间的相似度,matrix,google-sheets,Matrix,Google Sheets,我想计算谷歌电子表格中不同列的相似性百分比,但我不知道如何计算 在谷歌表单中,我有两张表单: 首先有一个表格,列出了几个(即将提出的)政治提案,以及一些政党如何投票支持这些提案。将手动添加每个投票值(是或否) 第二有一个区块矩阵,两个政党的%投票赞成相同的提案。在这张纸中,我从第一张纸开始计算各方与其他各方的相似性。或者:X中有多少次投票给完全相同的两个政党 一些例子: 甲方的投票次数与乙方完全相同,反之亦然。 我用于计算块矩阵中%的公式为=2/5 甲方与丙方进行了1次完全相同的投票,反之亦然

我想计算谷歌电子表格中不同列的相似性百分比,但我不知道如何计算

在谷歌表单中,我有两张表单:

首先有一个表格,列出了几个(即将提出的)政治提案,以及一些政党如何投票支持这些提案。将手动添加每个投票值(是或否)

第二有一个区块矩阵,两个政党的%投票赞成相同的提案。在这张纸中,我从第一张纸开始计算各方与其他各方的相似性。或者:X中有多少次投票给完全相同的两个政党

一些例子:

  • 甲方的投票次数与乙方完全相同,反之亦然。 我用于计算块矩阵中%的公式为=2/5
  • 甲方与丙方进行了1次完全相同的投票,反之亦然。我用来计算块矩阵中%的公式是=1/5
  • 乙方的投票次数与丙方完全相同,反之亦然。我用于计算块矩阵中%的公式为=2/5
  • 等等
注意:X/5中的“5”是目前最多五个提案,但在不久的将来,这个数字将增加到更大的数字

样品

现在,我手工计算相似性的百分比,这对我来说似乎不是很有效,而且随着政治提案数量的增加,这会更加耗时。我认为通过公式计算相似度百分比可以更聪明、更高效,因此当我必须添加一些新的投票结果时,区块矩阵中自动计算的相似度百分比将自动调整


如何提高效率?

这可以通过矩阵乘法实现

这是我使用的公式:

=ArrayFormula(
    (SUMPRODUCT(
        MMULT(
            (IF('Overview of votes by party'!$B$2:$E$2=B$2;'Overview of votes by party'!$B$3:$E$7)="Yes")*1;
            TRANSPOSE(($B$2:$E$2>0)*1)
        )*
        MMULT(
            (IF('Overview of votes by party'!$B$2:$E$2=$A3;'Overview of votes by party'!$B$3:$E$7)="Yes")*1;
            TRANSPOSE(($B$2:$E$2>0)*1))
    )+
    SUMPRODUCT(
        MMULT(
            (IF('Overview of votes by party'!$B$2:$E$2=B$2;'Overview of votes by party'!$B$3:$E$7)="No")*1;
            TRANSPOSE(($B$2:$E$2>0)*1)
        )*
        MMULT(
            (IF('Overview of votes by party'!$B$2:$E$2=$A3;'Overview of votes by party'!$B$3:$E$7)="No")*1;
            TRANSPOSE(($B$2:$E$2>0)*1)))
    )/
    (
        COUNTIF('Overview of votes by party'!B:B;"Yes")+
        COUNTIF('Overview of votes by party'!B:B;"No")
    )
)
基本上,这个过程是:

  • 取双方比较值的矩阵。i、 e:

    IF('Overview of votes by party'!$B$2:$E$2=B$2;'Overview of votes by party'!$B$3:$E$7)="Yes")*1 
    

  • 两个矩阵中每行的总和,创建两个新矩阵
    (每个矩阵的维数为1 x)。这是通过将每个矩阵乘以一个单列矩阵来实现的,该矩阵由与#提案行数相同的所有1组成。i、 e:

    MMULT(
            (IF(..PartyA..)*1;
            TRANSPOSE(($B$2:$E$2>0)*1)
        )
    

  • 将步骤2中的两个矩阵相乘,创建最终矩阵

  • 使用
    SUMPRODUCT

  • 填写1-4中的“否”和“是”,将两个总和相加

  • 将第5步的总和除以提案总数:

    (
        COUNTIF('Overview of votes by party'!B:B;"Yes")+
        COUNTIF('Overview of votes by party'!B:B;"No")
    )
    

  • 您可以在现场看到这一点。

    我复制了您的示例工作表,该工作表产生了相同的输出


    公式位于“相似矩阵”表的单元格B3中

    哇,谢谢你,Chancea!让我检查并测试一下你(和Chris Hick)的精彩代码/公式。非常感谢您快速友好的解决方案!哇,谢谢你,克里斯!让我检查并测试一下你(和Chancea)的奇妙代码/公式。非常感谢您快速友好的解决方案!
    MMULT(
            (IF(..PartyB..)*1;
            TRANSPOSE(($B$2:$E$2>0)*1)
        )
    
    (
        COUNTIF('Overview of votes by party'!B:B;"Yes")+
        COUNTIF('Overview of votes by party'!B:B;"No")
    )