让我用样本Iris数据集简化我的问题。以下是通过Iris数据集启动FPGrowth运算符时看到的输出:
以红色查看我的笔记,在此示例中我只需要a3_range1和a2_range5以及所有3项集,因为所有其他的都是较大集的子集。
有没有办法在FPGrowth本身的帮助下做到这一点?或者我必须使用ExecuteScript解决?在后一种情况下,我似乎无法在FPGrowth之后导入并迭代输入:如果我这样做:
ExampleSet exampleSet = operator.getInput(ExampleSet.class);
我得到"操作员需要一些未提供的ExampleSet输入"。如果我将其更改为:
FPGrowth exampleSet = operator.getInput(FPGrowth.class);
它抱怨它无法解析FPGrowth类。
如何在ExecuteScript Groovy代码中导入它?
答案 0 :(得分:1)
您所描述的是挖掘频繁最大项目集而非所有频繁项目集的问题。
在文献中,针对这个问题提出了几种算法:GenMax,LCMMax,FPMax,MAFIA等。特别是,FPMax基于FPGrowth。
但我不认为它们是在您正在使用的工具中实现的。
如果效率不重要,您可以通过后处理来实现。如果效率很重要,您可以使用上述算法之一(如果没有提供,可能会实现它们)
顺便说一句,您可以查看我的SPMF Java open-source data mining library,它提供了60多种算法,专门用于模式挖掘。特别地,它提供了Charm-MFI的实现,以通过对闭项集的后处理来发现最大项集,从而避免探索所有频繁项集的搜索空间。
答案 1 :(得分:0)
我用以下R脚本解决了它:
FPSet <- as.data.frame(FPSet)
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
for(i in 1:nrow(FPSet)) {
current <- trim(unlist(strsplit(toString(FPSet[i,"Items"]),',')))
for(j in 1:nrow(FPSet)) {
if(i!=j) {
compare <- trim(unlist(strsplit(toString(FPSet[j,"Items"]),',')))
if(setequal(intersect(current,compare),current) || length(current) == 1) {
FPSet[i,'subset'] = 1
}
}
}
}
FPSet<-FPSet[is.na(FPSet$subset), ]
FPSet$subset <- NULL
"Items"
列是存储子集/集的位置