转自 Koala++'s blog
先运行起来,函数如下:
publicvoid GetAssociationRules1()
{
try{
Discretize discretize = new Discretize();
discretize.setInputFormat( m_instances );
m_instances = Filter.useFilter( m_instances, discretize);
Apriori apriori = new Apriori();
apriori.buildAssociations( m_instances );
System.out.println( apriori.toString() );
}catch( Exception e )
{
e.printStackTrace();
}
}
publicstaticvoid main(String[] args) throws Exception
{
AssociationTest at = new AssociationTest();
at.LoadInstances( "F:\\Program Files\\Weka-3-6\\data\\iris.arff" );
at.GetAssociationRules();
}
我只需要得到它的规则,所以只分析了一点它的toString代码:
Utils.doubleToString((double) i + 1, (int)(Math.log(m_numRules)
/ Math.log(10) + 1), 0)
(double) i + 1表示第几个规则,而(int)(Math.log(m_numRules) / Math.log(10) + 1)表示要用几位来表示,因为十进制所以除以log(10)。比如有20个规则就是2,如果是200个规则就是3位,最后一个参数表示小数点后保留几位。
((AprioriItemSet)m_allTheRules[0].elementAt(i)).toString(m_instances)
这里是取m_allTheRules[0]的第i个元素,allTheRules[0]是关联规则的左部,第i个元素则是第几个规则,再看AprioriItemSet.toString(Instances)函数,它调用父类ItemSet的toString函数。
publicfinal String toString(Instances instances) {
returnsuper.toString(instances);
}
termsSet的toString如下:
public String toString(Instances instances) {
StringBuffer text = new StringBuffer();
for (int i = 0; i < instances.numAttributes(); i++)
if (m_items[i] != -1) {
text.append(instances.attribute(i).name() + '=');
text.append(instances.attribute(i).value(m_items[i]) + ' ');
}
text.append(m_counter);
return text.toString();
}
到这里就很清楚了,如果m_items[i]不等于-1就是规则中有第i个属性,text追加属性名和属性值。并且将这个规则出现的次数追加。
((AprioriItemSet) m_allTheRules[1].elementAt(i)).toString(m_instances)
当然就是规则的右部。
Utils.doubleToString(((Double) m_allTheRules[2].elementAt(i)).doubleValue(), 2) + ")");
是置信度。