/** * Method that finds all association rules. * * @exception Exception if an attribute is numeric */ private void findRulesQuickly() throws Exception { FastVector[] rules; RuleGeneration currentItemSet; // Build rules for (int j = 0; j < m_Ls.size(); j++) { FastVector currentItemSets = (FastVector) m_Ls.elementAt(j); Enumeration enumItemSets = currentItemSets.elements(); while (enumItemSets.hasMoreElements()) { currentItemSet = new RuleGeneration((ItemSet) enumItemSets.nextElement()); m_best = currentItemSet.generateRules( m_numRules, m_midPoints, m_priors, m_expectation, m_instances, m_best, m_count); m_count = currentItemSet.m_count; if (!m_bestChanged && currentItemSet.m_change) m_bestChanged = true; // update minimum expected predictive accuracy to get into the n best if (m_best.size() > 0) m_expectation = ((RuleItem) m_best.first()).accuracy(); else m_expectation = 0; } } }
/** * Method that generates all large itemsets with a minimum support, and from these all association * rules. * * @param instances the instances to be used for generating the associations * @exception Exception if rules can't be built successfully */ public void buildAssociations(Instances instances) throws Exception { int temp = m_premiseCount, exactNumber = m_numRules - 5; if (instances.checkForStringAttributes()) { throw new Exception("Can't handle string attributes!"); } m_instances = instances; m_instances.setClassIndex(m_instances.numAttributes() - 1); // prior estimation m_priorEstimator = new PriorEstimation(m_instances, m_numRandRules, m_numIntervals, false); m_priors = m_priorEstimator.estimatePrior(); m_midPoints = m_priorEstimator.getMidPoints(); m_Ls = new FastVector(); m_hashtables = new FastVector(); for (int i = 1; i < m_instances.numAttributes(); i++) { m_bestChanged = false; // find large item sets findLargeItemSets(i); // find association rules (rule generation procedure) findRulesQuickly(); if (m_bestChanged) { temp = m_premiseCount; while (RuleGeneration.expectation(m_premiseCount, m_premiseCount, m_midPoints, m_priors) <= m_expectation) { m_premiseCount++; if (m_premiseCount > m_instances.numInstances()) break; } } if (m_premiseCount > m_instances.numInstances()) { // Reserve space for variables m_allTheRules = new FastVector[3]; m_allTheRules[0] = new FastVector(); m_allTheRules[1] = new FastVector(); m_allTheRules[2] = new FastVector(); int k = 0; while (m_best.size() > 0 && exactNumber > 0) { m_allTheRules[0].insertElementAt((ItemSet) ((RuleItem) m_best.last()).premise(), k); m_allTheRules[1].insertElementAt((ItemSet) ((RuleItem) m_best.last()).consequence(), k); m_allTheRules[2].insertElementAt(new Double(((RuleItem) m_best.last()).accuracy()), k); boolean remove = m_best.remove(m_best.last()); k++; exactNumber--; } return; } if (temp != m_premiseCount && m_Ls.size() > 0) { FastVector kSets = (FastVector) m_Ls.lastElement(); m_Ls.removeElementAt(m_Ls.size() - 1); kSets = ItemSet.deleteItemSets(kSets, m_premiseCount, Integer.MAX_VALUE); m_Ls.addElement(kSets); } } // Reserve space for variables m_allTheRules = new FastVector[3]; m_allTheRules[0] = new FastVector(); m_allTheRules[1] = new FastVector(); m_allTheRules[2] = new FastVector(); int k = 0; while (m_best.size() > 0 && exactNumber > 0) { m_allTheRules[0].insertElementAt((ItemSet) ((RuleItem) m_best.last()).premise(), k); m_allTheRules[1].insertElementAt((ItemSet) ((RuleItem) m_best.last()).consequence(), k); m_allTheRules[2].insertElementAt(new Double(((RuleItem) m_best.last()).accuracy()), k); boolean remove = m_best.remove(m_best.last()); k++; exactNumber--; } }