我想在Weka 3.8.6中运行apriori算法后得到每行生成规则的前提和结果。
`apriori.setNumRules(NUMBER_OF_RULES); apriori.setMinMetric(MINIMUM_CONFIDENCE); apriori.setLowerBoundMinSupport(MINIMUM_SUPPORT);
apriori.setCar(true);
apriori.buildAssociations(instances);`
但有一个例外:java.lang.ClassCastException:类weka.associations.ItemSet无法转换为类weka.associations.AprioriItemSet(weka.associations.ItemSet和weka.associations.AprioriItemSet位于加载器的未命名模块中。
为什么当我简单地将 setCar(false) 更改为 setCar(true) 时,我无法调用 buildAssociations(instances)?当 setCar(false) 时,我可以毫无问题地调用该方法。我怎样才能做到这一点?如何使用 setCar(true) 调用 buildAssociations 方法。
我想调用 apriori.buildAssociations(instances) 而没有错误
使用
car==false
时,不能使用getAssociationRules()
,因为内部构建了不同的数据结构。相反,您需要致电 getAllTheRules()
。
你必须做这样的事情:
import weka.associations.Apriori;
import weka.associations.ItemSet;
import weka.core.Instances;
import weka.core.Utils;
import weka.core.converters.ConverterUtils.DataSource;
public class AprioriCarExample {
public static void main(String[] args) throws Exception {
Instances instances = DataSource.read("/some/where/supermarket.arff");
instances.setClassIndex(instances.numAttributes() - 1);
Apriori apriori = new Apriori();
apriori.setNumRules(10);
apriori.setMinMetric(0.50);
apriori.setLowerBoundMinSupport(0.1);
apriori.setCar(true);
apriori.buildAssociations(instances);
// rules
System.out.println("\nRules:");
for (int i = 0; i < apriori.getAllTheRules()[0].size(); i++) {
String premise = ((ItemSet) apriori.getAllTheRules()[0].get(i)).toString(apriori.getInstancesNoClass(), ' ', ' ');
String consequence = ((ItemSet) apriori.getAllTheRules()[1].get(i)).toString(apriori.getInstancesOnlyClass(), ' ', ' ');
String confidence = Utils.doubleToString(((Double) apriori.getAllTheRules()[2].get(i)), 2);
System.out.println((i+1) + ".:");
System.out.println(" premise: " + premise);
System.out.println(" consequence: " + consequence);
System.out.println(" confidence: " + confidence);
}
}
}