如何计算两个数组之间的相似度?
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=4
、a_ij=1
如果 |i-j|=1
、a_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 是针对同一个对象=] 或完全不同的对象。
我有两个这样的数组: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=4
、a_ij=1
如果 |i-j|=1
、a_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 是针对同一个对象=] 或完全不同的对象。