【发布时间】:2021-03-14 04:58:18
【问题描述】:
我试图解决的问题是在事务数据中找到每个项集的支持。
例如,
transactions = [
'b c d',
'a g' ,
'a c d e',
'e f h',
'a b c g h',
'd' ,
'a e g h',
'b c d',
'a b f g h',
'a c d g',
]
将有[2, 5, 1, 1, 1, 5, 1, 2, 1, 1]
所以基本上对于第二个事务a, g,它是其他事务的子集,例如'a g'、'a b c g h'、'a e g h'、'a b f g h'、'a c d g',因此计数为 5。
现在,最初,我使用 mlxtend 事务编码器将此数据集转换为一种 One Hot Encoded 事务。并使用了类似的东西
df.progress_apply(lambda x: (df.iloc[:, np.where(x==1)[0]].sum(1)==len(np.where(x==1)[0])).sum(), axis=1)
获取值。
这个想法就像用当前行的元素切片矩阵/df,然后跨行求和。与当前行的元素长度相同的情况是子集,因此计算它。
但是,这对于较小的数据集效果很好,然后当我遇到 kosarak 时,由于 OOM 错误,我无法获得密集的表示。所以,我切换回 countVectorizer 并生成一个稀疏表示,然后使用与前一个类似的逻辑。
现在的问题是,scipy sparse 在对稀疏进行求和时比在运行时间为密集时慢 4 倍
164 ms ± 22.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
即使使用集合来解决问题也没有太大改善。
到目前为止,这是我的方法,我相信它具有 O(n2) 复杂性。有没有更好的算法/包来加快速度。
感谢任何帮助。提前致谢。
【问题讨论】:
-
时间以示例为例?
-
所以我查看了kosarak数据集,我有一个问题:每行中交易的顺序重要吗? (例如 3, 5 等价于 5, 3)。根据您对集合的使用,我会说“不”是答案,但我不能确定。
-
还有一个问题——有些行确实重复了。对重复的方法应该是什么? (完全有可能忽略它们,我不确定是否值得进行额外的比较来缓存/删除结果。)
-
您能尝试分而治之的方法吗?按长度排序,计算重复项,只检查更长的字符串,记住结果(我的意思是,如果
l9是l11的子集,那么如果l5是l9的子集,那么它也是一个子集l11)。
标签: python numpy scipy set apriori