Rapidminer FPGrowth也返回子集。我只需要最频繁的项目集

时间:2014-08-10 13:48:03

标签: r groovy data-mining text-mining rapidminer

让我用样本Iris数据集简化我的问题。以下是通过Iris数据集启动FPGrowth运算符时看到的输出:

enter image description here

以红色查看我的笔记,在此示例中我只需要a3_range1和a2_range5以及所有3项集,因为所有其他的都是较大集的子集。

有没有办法在FPGrowth本身的帮助下做到这一点?或者我必须使用ExecuteScript解决?在后一种情况下,我似乎无法在FPGrowth之后导入并迭代输入:如果我这样做:

ExampleSet exampleSet = operator.getInput(ExampleSet.class);

我得到"操作员需要一些未提供的ExampleSet输入"。如果我将其更改为:

FPGrowth exampleSet = operator.getInput(FPGrowth.class);

它抱怨它无法解析FPGrowth类。

如何在ExecuteScript Groovy代码中导入它?

2 个答案:

答案 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"列是存储子集/集的位置