如何使用sqlite计算Jaccard相似系数

时间:2019-05-26 16:38:12

标签: database sqlite statistics coefficients

我有一个用sqlite3创建的数据库,其中每个用户都有3个可能的爱好,这些爱好被保存为布尔值(如果用户喜欢,则为1,如果他不喜欢,则为0)。 我想获得按Jaccard相似系数排序的相似对的列表,这意味着我必须计算对两个人都真实的兴趣爱好的数量,然后将其除以他们选择的兴趣爱好的数量。

I have created this VIEW 所有对在视图中必须包含wonka。卡罗斯(Carros),技术和喜剧爱好者(comida)是爱好。

1 个答案:

答案 0 :(得分:0)

与其尝试将所有兴趣爱好存储在每个用户的一行中,然后将它们加入(就像您的视图似乎正在做的那样),然后尝试将它们加起来,不如通过更好的数据库设计来计算,这要容易得多通过在另一个表中跟踪用户和兴趣爱好之间的关系来表达他们的想法(考虑添加第四项爱好需要做什么。)您将需要查找诸如多对多关系连接表之类的术语,和/或在数据库设计中找到良好的资源。

使用这样的设计,并给出以下表格:

CREATE TABLE users(userID INTEGER PRIMARY KEY, userName TEXT UNIQUE);
CREATE TABLE hobbies(hobbyID INTEGER PRIMARY KEY, hobbyName TEXT UNIQUE);
CREATE TABLE interests(userID INTEGER REFERENCES users(userID) ON DELETE CASCADE
                     , hobbyID INTEGER REFERENCES hobbies(hobbyID) ON DELETE CASCADE
                     , liked INTEGER
                     , PRIMARY KEY(userID, hobbyID)) WITHOUT ROWID;

您可以使用以下方法计算所有对的相似系数:

SELECT u1.userName AS "Person 1", u2.UserName AS "Person 2"
     , ifnull(total(i1.liked AND i2.liked) / total(i1.liked OR i2.liked), 0.0) AS Similarity
FROM users AS u1
JOIN users AS u2 ON u1.userId <> u2.userId
LEFT JOIN interests AS i1 ON u1.userId = i1.userId
LEFT JOIN interests AS i2 ON u2.userId = i2.userId AND i1.hobbyId = i2.hobbyID
GROUP BY u1.userId, u2.userId;