我试图解决的问题是找到交易数据中每个项集的支持度。
例如,
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事务编码器将此数据集转换为一种热编码事务。 并使用类似于以下内容:
df.progress_apply(lambda x: (df.iloc[:, np.where(x==1)[0]].sum(1)==len(np.where(x==1)[0])).sum(), axis=1)
获取这些值的方法。
这个想法就像是使用当前行元素切片矩阵/数据框,然后沿着行求和。当它与当前行元素长度相同时,就是子集,因此要计算它。
然而,对于较小的数据集,这种方法效果良好,但当我遇到kosarak时,由于OOM错误,我无法使用密集表示。所以,我切换回countVectorizer并生成稀疏表示,然后使用类似于之前的逻辑。
现在的问题是,使用scipy sparse进行sum操作比dense慢4倍,运行时间为
164 ms ± 22.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
即使使用集合来解决问题,也没有什么改进。
目前我的做法是 O(n2) 的时间复杂度。是否有更好的算法/包能加速处理?
非常感谢任何帮助。
l9
是l11
的子集,则如果l5
是l9
的子集,则它也是l11
的子集)。 - gboffi