List of usage examples for weka.core ContingencyTables chiSquared
public static double chiSquared(double[][] matrix, boolean yates)
From source file:cba.AprioriItemSet.java
License:Open Source License
/** * Generates all significant rules for an item set. * * @param minMetric the minimum metric (confidence, lift, leverage, * improvement) the rules have to have// ww w .j a v a2 s . com * @param metricType (confidence=0, lift, leverage, improvement) * @param hashtables containing all(!) previously generated * item sets * @param numItemsInSet the size of the item set for which the rules * are to be generated * @param numTransactions * @param significanceLevel the significance level for testing the rules * @return all the rules with minimum metric for the given item set * @exception Exception if something goes wrong */ public final FastVector[] generateRulesBruteForce(double minMetric, int metricType, FastVector hashtables, int numItemsInSet, int numTransactions, double significanceLevel) throws Exception { FastVector premises = new FastVector(), consequences = new FastVector(), conf = new FastVector(), lift = new FastVector(), lev = new FastVector(), conv = new FastVector(); FastVector[] rules = new FastVector[6]; AprioriItemSet premise, consequence; Hashtable hashtableForPremise, hashtableForConsequence; int numItemsInPremise, help, max, consequenceUnconditionedCounter; double[][] contingencyTable = new double[2][2]; double metric, chiSquared; // Generate all possible rules for this item set and test their // significance. max = (int) Math.pow(2, numItemsInSet); for (int j = 1; j < max; j++) { numItemsInPremise = 0; help = j; while (help > 0) { if (help % 2 == 1) numItemsInPremise++; help /= 2; } if (numItemsInPremise < numItemsInSet) { hashtableForPremise = (Hashtable) hashtables.elementAt(numItemsInPremise - 1); hashtableForConsequence = (Hashtable) hashtables.elementAt(numItemsInSet - numItemsInPremise - 1); premise = new AprioriItemSet(m_totalTransactions); consequence = new AprioriItemSet(m_totalTransactions); premise.m_items = new int[m_items.length]; consequence.m_items = new int[m_items.length]; consequence.m_counter = m_counter; help = j; for (int i = 0; i < m_items.length; i++) if (m_items[i] != -1) { if (help % 2 == 1) { premise.m_items[i] = m_items[i]; consequence.m_items[i] = -1; } else { premise.m_items[i] = -1; consequence.m_items[i] = m_items[i]; } help /= 2; } else { premise.m_items[i] = -1; consequence.m_items[i] = -1; } premise.m_counter = ((Integer) hashtableForPremise.get(premise)).intValue(); consequenceUnconditionedCounter = ((Integer) hashtableForConsequence.get(consequence)).intValue(); if (metricType == 0) { contingencyTable[0][0] = (double) (consequence.m_counter); contingencyTable[0][1] = (double) (premise.m_counter - consequence.m_counter); contingencyTable[1][0] = (double) (consequenceUnconditionedCounter - consequence.m_counter); contingencyTable[1][1] = (double) (numTransactions - premise.m_counter - consequenceUnconditionedCounter + consequence.m_counter); chiSquared = ContingencyTables.chiSquared(contingencyTable, false); metric = confidenceForRule(premise, consequence); if ((!(metric < minMetric)) && (!(chiSquared > significanceLevel))) { premises.addElement(premise); consequences.addElement(consequence); conf.addElement(new Double(metric)); lift.addElement( new Double(liftForRule(premise, consequence, consequenceUnconditionedCounter))); lev.addElement(new Double(leverageForRule(premise, consequence, premise.m_counter, consequenceUnconditionedCounter))); conv.addElement(new Double(convictionForRule(premise, consequence, premise.m_counter, consequenceUnconditionedCounter))); } } else { double tempConf = confidenceForRule(premise, consequence); double tempLift = liftForRule(premise, consequence, consequenceUnconditionedCounter); double tempLev = leverageForRule(premise, consequence, premise.m_counter, consequenceUnconditionedCounter); double tempConv = convictionForRule(premise, consequence, premise.m_counter, consequenceUnconditionedCounter); switch (metricType) { case 1: metric = tempLift; break; case 2: metric = tempLev; break; case 3: metric = tempConv; break; default: throw new Exception("ItemSet: Unknown metric type!"); } if (!(metric < minMetric)) { premises.addElement(premise); consequences.addElement(consequence); conf.addElement(new Double(tempConf)); lift.addElement(new Double(tempLift)); lev.addElement(new Double(tempLev)); conv.addElement(new Double(tempConv)); } } } } rules[0] = premises; rules[1] = consequences; rules[2] = conf; rules[3] = lift; rules[4] = lev; rules[5] = conv; return rules; }