【问题标题】:How to calculate Jaccard similarity coefficient with sqlite如何用sqlite计算Jaccard相似系数
【发布时间】:2019-05-26 16:38:12
【问题描述】:
我有一个用 sqlite3 创建的数据库,其中每个用户有 3 个可能的爱好,这些爱好保存为布尔值(如果用户喜欢,则为 1,如果他不喜欢,则为 0)。
我想得到一个按 Jaccard 相似系数排序的相似配对列表,这意味着我必须计算他们俩都正确的爱好的数量,然后除以他们中任何一个选择的爱好的数量。
I have created this VIEW
所有对都必须在视图中包含 wonka。 Carros、tecnologia 和 comida 都是爱好。
【问题讨论】:
标签:
database
sqlite
statistics
coefficients
【解决方案1】:
与其尝试将所有爱好存储在每个用户的一行中,然后加入它们(就像您的视图似乎正在做的那样),然后尝试将它们相加,而是使用更好的数据库设计更容易计算通过在另一个表中跟踪用户和爱好来表达关系(想想添加第四个爱好需要做什么。)。您需要查找诸如多对多关系和联结表之类的术语以了解更多信息,和/或查找有关数据库设计的良好资源。
有了这样的设计,给定这些表格:
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;