我的数据如下:
CustomerId Category
100 2
100 2
100 3
100 6
100 4
200 3
200 6
200 7
300 2
所以我想要的结果是jaccard相似性指数:
jaccard(100200)=2(项目共享)/5(项目并集)
jaccard(100300)=1(项目共享)/4(项目并集)
jaccard(200300)=0(项目共享)/4(项目并集)。
我最初尝试的是寻找术语的并集和交集,但我不确定这是否是最有效的方法。另外,我想避免重复像jaccard(100300)和jaccard(300100)出现在一起。有人能帮忙吗?
select t1.customer_id, t2.customer_id,
sum(case when t1.category_id = t2.category_id then 1 else 0 end) intersection,
sum(case when t1.category = t2.category then 1
when t1.category <> t2.category then 1 else 0 end)
union
from t t1 cross join
t t2
Where t1.customer_id <> t2.customer_id
group by t1.customer_id, t2.customer_id
不幸的是,我也检查了,我有一个客户购买多个项目在同一类别。所以我编辑了这个表,以反映Customer100在类别2中有两个项目。但是,它不应更改jaccard相似性度量值。
1条答案
按热度按时间kmbjn2e31#
你不需要一个
cross join
. 通过计算一对的不同类别id的总和并从中减去相交的类别id,得到分母。如果不支持不等式
join
,使用如果您只需要对的交叉点计数,下面的查询就足够了。
编辑:根据op的评论,一个客户可以多次拥有同一类别,但只应计算一次。