如何计算两个数组之间的相似度?

How to calculate similarity between two arrays?

我有两个这样的数组:a1=[8,6,4,8,8,9] , a2=[7,3,8,4,3,9,9,5,8,3 ,5,8] 。它们可能包含不同数量的可以重复的整数。如何计算它们之间的相似度?我应该使用哪个指标?

更新:数字代表从 1 到 10 的投票。用户对一个特定类别的项目进行投票。我们不知道他们投票的项目。我们只知道这些物品属于同一类别。所以我们在类别中有投票数组。问题是我们如何计算这些用户之间的相似度。

将您的投票视为随机样本

如果你真的不知道他们投的是什么,你唯一知道的就是选票的分布。即,您有来自两个分布的两个样本,您需要评估分布之间的差异。

最简单的方法是计算用户给定投票的次数,即,将 [8,6,4,8,8,9] 转换为 [0,0,0,1,0,1,0,3,9,0](即 3 票 8 表示 3 在第 8 位).现在你的向量有相同的长度,你可以使用余弦相似度。

模糊你的数据

如果你没有有很多数据,即你确实需要比较投票1-2次的人,你可以尝试"fuzzying the votes",即对待对 8 的投票为 1/2 对 8 的投票,对 7 和 9 各有 1/4 的投票。例如,您的向量 [0,0,0,0,0,0,0,0,0,1][0,0,0,0,0,0,0,0,1,0] 将变为 [0,0,0,0,0,0,0,0,0.33,0.66][0,0,0,0,0,0,0,0.25,0.5,0.25].

这相当于使用 "unusual" 点积:使用 (Av,u)=sum_ij(a_ij*v_i*u_j) 而不是简单的 (v,u)=sum_i(v_i*u_i*),其中 A 几乎是对角矩阵(e.g.a_ii=4a_ij=1 如果 |i-j|=1a_ij=0 否则)。那么新的余弦相似度则定义为

CS(u,v)=arccos( (Av,u) / sqrt( (Av,v) * (Au,u) ) )

tridiagonal为例 上面的公式看起来像:

(Av,u) = 4*sum(v_i,u_i) + sum(v_i,u_{i-1}) + (v_i,u_{i+1})

使用统计数据

如果你有很多数据,即每个人对每个数字至少有5次投票(即每个长度为10的向量的所有分量>=5) , 那么你可以使用 Chi-squared test or, better yet, Likelihood-ratio test.

推荐系统

您应该指定匹配的坐标(如果我怀疑您在做推荐系统)。 例如,如果用户 1 的投票是 [3],用户 2 的投票是 [4,5],您需要知道分数 3 与分数 4 或 [=30 是针对同一个对象=] 或完全不同的对象。