excel公式如何建立相似度矩阵

时间:2013-10-21 14:02:31

标签: excel matrix similarity

我想创建一个公式,它将从数据表中创建一个相似度矩阵。以下是所需输出后面的数据示例。数据行表示模块化类算法的结果。我需要我的输出来计算两个国家共享相同类别值的月数(只要它们相等就可以是任何值)除以总月数。

输入模块化类

        jan feb mar apr may
USA     0   1   2   4   3
UK      0   3   2   3   3
AU      0   2   2   2   3
CH      1   0   1   1   2
EG      2   3   0   0   1

输出相似度矩阵

      USA   UK   AU  CH  EG
USA   1             
UK   0.6    1           
AU   0.6    0.6  1      
CH    0     0    0    1 
EG    0     0.2  0    0   1

我没有尝试过任何公式,因为我不明白从哪里开始。我读过关于countifs和mmult的内容,但我不知道什么是最合适的。

2 个答案:

答案 0 :(得分:2)

我将提供正确方向的推动,而不是整个解决方案。我想你将能够从给定的公式推广解决方案。

我将输入矩阵放在A1:F6中。然后我建立了一个中间矩阵。 A9只是“第1栏中的匹配”。

=== edit:在列===

中使用月份名称

然后我复制了月份名称jan ..可能在B10:F10。还有美国..在A11中的EG .. A15。

然后在B12,乐趣开始了。我把一个公式=IF(B3=B2,1,0)。这样做的是,如果B3 = B2,则在单元格中放置1,否则为0。然后我从B12到F12直接填写,我得到以下行计算:

1   0   1   0   1

你会注意到这些是英国=美国的月份。

如果您选择B12并填写B15然后将B12 .. B15填入F15,您将获得每个国家与其相邻邻居之间的差异。我的矩阵原来是:

    jan feb mar apr may
USA                 
UK  1   0   1   0   1
AU  1   0   1   0   1
CH  0   0   0   0   0
EG  0   0   0   0   0

如果您将行数之和除以国家/地区数量,您将得到3 / 5,3 / 5,0 / 5,0 / 5。这些对应于第一列的输出矩阵,0.6,0.6,0,0。

答案 1 :(得分:2)

是的,有一种方法可以使用SUM()IF()COUNT()并使用数组公式。

您可以使用的基本公式是(假设您的顶部数组为A1:F6,包括标题,因此数据位于A2:F6):

{=SUM(IF($B$2:$F$2=$B2:$F2,1,0))/COUNT($B$2:$F$2)}

使用数组公式,可以使IF()函数返回1表示匹配,0表示不匹配,迭代遍历行中的每个元素。 SUM()添加匹配项,然后除以处理的单元格数COUNT(),即可获得相似度指数。

上面的示例是针对您示例中的顶级USA / USA单元格,您可以填写,但每个新对角线需要调整以将固定行号更改为新行。所以英国专栏的顶部是:

{=SUM(IF($B$3:$F$3=$B3:$F3,1,0))/COUNT($B$3:$F$3)}

Conditional sum using array formulas

如果您事先了解了多少列/国家,则可以删除COUNT()

注意:您不要输入花括号。输入完公式后, Ctrl - Shift - 输入编辑时,要显示这些内容,并将公式视为数组公式。出于这个原因,这些公式通常被称为 CSE公式(Ctrl-Shift-Enter)。

<强>更新

您可以使用单个公式,使用INDIRECT()COLUMN()来填充单元格。

{=SUM(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0))/COUNT(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2)))}

这使用了列号与行号相同的事实,提供了转置。

更新2:

实际上,COUNT()可以被删除,SUM()替换为AVERAGE(),因为所有匹配都是1,平均值是正确的值。

所以这适用于所有细胞:

{=AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0))}

更新3:

如果你绝对不需要在对角线上方出现任何东西,制作一个下三角形块,那么你可以使用IF()包裹上面的公式,检查列是否大于行并制作在这种情况下,单元格为空白。然后,您可以使用公式填充整个块,它看起来正确,无需删除。

{=IF(COLUMN(B2)>ROW(B2),"",AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0)))}