如何按频率修剪数据集以符合论文的描述
Posted
技术标签:
【中文标题】如何按频率修剪数据集以符合论文的描述【英文标题】:How to prune data set by frequency to conform to paper's description 【发布时间】:2011-02-28 08:34:18 【问题描述】:MovieLens 数据集提供了一个包含列的表:
userid | movieid | tag | timestamp
我无法重现他们修剪以下中使用的 MovieLens 数据集的方式:
Tag Informed Collaborative Filtering, by Zhen, Li and Young
在上述论文的 4.1 Data Set 中,它写道 “对于标签信息,我们只保留那些添加的标签 在至少 3 部不同的电影中。对于用户,我们只 保留那些使用至少 3 个不同标签的用户 标记历史。对于电影,我们只保留那些 由至少 3 个不同的标签注释。”
我尝试查询数据库:
select TMP.userid, count(*) as tagnum
from (select distinct T.userid as userid, T.tag as tag from tags T) AS TMP
group by TMP.userid
having tagnum >= 3;
我得到了一个包含 1760 个用户的列表,他们标记了 3 个不同的标签。但是,有些标签 没有添加到至少 3 部不同的电影中。
感谢任何帮助。
【问题讨论】:
您使用的是什么关系型数据库?效果是累积的还是独立的?例如如果一个标签因为不在至少 3 个不同的电影上而被丢弃,这种删除是否会影响那些在标签历史中使用至少 3 个不同标签的用户的计算? (独立似乎更有意义) 我正在使用 mysql。如果一个标签因为不在至少 3 个不同的电影上而被丢弃,我认为删除应该会影响那些在标签历史中使用至少 3 个不同标签的用户的计算。该论文的作者得到了一个包含 757 个用户的列表。如果它是独立的,使用我在第一篇文章中键入的 SQL 查询应该得到 1760。 【参考方案1】:您不会在任何地方限制每个标签的电影。似乎您应该首先丢弃至少三部电影和三个用户未使用过的标签。然后限制为已标记 3 次的用户。
这个查询应该给你三个以上用户和三个以上电影的标签:
select T1.tag,
(select count( distinct T2.movieid ) from tags T2 where T2.tag = T1.tag) as mcount,
(select count( distinct T3.userid ) from tags T3 where T3.tag = T1.tag) as ucount
from tags T1
having mcount >= 3 and ucount >= 3;
如果您改为按用户查询,并将整个事物用作子查询,您应该能够检查也标记了 3 次的用户:
select T4.user, count(*) as ucount from
(select T1.userid as user,
(select count( distinct T2.movieid ) from tags T2 where T2.tag = T1.tag) as mcount,
(select count( distinct T3.userid ) from tags T3 where T3.tag = T1.tag) as ucount
from tags T1
having mcount >= 3 and ucount >= 3) as T4
group by user
having ucount > 3;
【讨论】:
以上是关于如何按频率修剪数据集以符合论文的描述的主要内容,如果未能解决你的问题,请参考以下文章