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

时间:2015-08-28 11:50:06

标签: algorithm similarity cosine-similarity

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

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

1 个答案:

答案 0 :(得分:0)

将您的投票视为随机样本

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

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

模糊您的数据

如果您有大量数据,即您真的需要比较投票1-2次的人,您可以尝试“模糊投票”,即对{{ 1}}为1/2投票,8投票,每对7投9票。例如,您的向量8[0,0,0,0,0,0,0,0,0,1]将变为[0,0,0,0,0,0,0,0,1,0]和{{1} }。

这相当于使用“不寻常”的点积:而不是简单的[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],其中(v,u)=sum_i(v_i*u_i*)是一个几乎对角矩阵(e.g.,{ {1}},(Av,u)=sum_ij(a_ij*v_i*u_j)如果A,则a_ii=4。然后将新的余弦相似度定义为

a_ij=1

对于tridiagonal示例 上面,公式如下:

|i-j|=1

使用统计

如果你有很多数据,也就是说,每个人都有至少5次每个数字的投票(即,每个长度为10的向量都包含所有组件> = 5),那么你可以使用Chi-squared test或,better yetLikelihood-ratio test

推荐系统

您应该指定哪些坐标匹配(如果您怀疑,请执行推荐系统)。 例如,如果用户1投票为a_ij=0而用户2投票为CS(u,v)=arccos( (Av,u) / sqrt( (Av,v) * (Au,u) ) ) ,则您需要知道得分(Av,u) = 4*sum(v_i,u_i) + sum(v_i,u_{i-1}) + (v_i,u_{i+1}) 是否与得分[3]或{{1}相同的对象或者对于一个完全不同的对象。