93 lines
2.8 KiB
Java
93 lines
2.8 KiB
Java
package de.hsel.spm.baudas.analysis;
|
|
|
|
import de.hsel.spm.baudas.BauDas;
|
|
import weka.associations.Apriori;
|
|
import weka.associations.AssociationRule;
|
|
import weka.associations.Item;
|
|
import weka.core.Instances;
|
|
import weka.filters.Filter;
|
|
import weka.filters.unsupervised.attribute.NumericCleaner;
|
|
import weka.filters.unsupervised.attribute.NumericToNominal;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* The shopping-cart analysis.
|
|
*
|
|
* @author Julian Hinxlage
|
|
* @version 1.0
|
|
*/
|
|
public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
|
|
|
|
private Instances instances;
|
|
private Map<List<String>, List<String>> result;
|
|
|
|
@Override
|
|
public Map<List<String>, List<String>> getResult() {
|
|
if (result != null) {
|
|
return result;
|
|
}
|
|
|
|
result = new HashMap<>();
|
|
|
|
for (int i = 0; i < 11; i++) {
|
|
instances.deleteAttributeAt(0);
|
|
}
|
|
|
|
//convert data to only contain bought/not bought
|
|
NumericCleaner nc = new NumericCleaner();
|
|
nc.setMaxThreshold(1.0);
|
|
nc.setMaxDefault(1.0);
|
|
try {
|
|
nc.setInputFormat(instances);
|
|
instances = Filter.useFilter(instances, nc);
|
|
} catch (Exception e) {
|
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
|
}
|
|
|
|
|
|
NumericToNominal num2nom = new NumericToNominal();
|
|
num2nom.setAttributeIndices("first-last");
|
|
try {
|
|
num2nom.setInputFormat(instances);
|
|
instances = Filter.useFilter(instances, num2nom);
|
|
} catch (Exception e) {
|
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
|
}
|
|
|
|
Apriori model = new Apriori();
|
|
|
|
model.setTreatZeroAsMissing(true);
|
|
try {
|
|
model.buildAssociations(instances);
|
|
} catch (Exception e) {
|
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
|
}
|
|
|
|
for (int i = 0; i < model.getAssociationRules().getRules().size(); i++) {
|
|
AssociationRule rule = model.getAssociationRules().getRules().get(i);
|
|
|
|
List<String> premises = new ArrayList<>();
|
|
for (Item item : rule.getPremise()) {
|
|
premises.add(item.getAttribute().name());
|
|
}
|
|
List<String> consequences = new ArrayList<>();
|
|
for (Item item : rule.getConsequence()) {
|
|
consequences.add(item.getAttribute().name());
|
|
}
|
|
|
|
result.put(premises, consequences);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public ShoppingCart(File file) {
|
|
instances = load(file);
|
|
}
|
|
}
|