我正在开发一个应用程序,其中需要动态地动态地为特定的一组实例排序属性。现在,我使用信息增益对属性进行排名,但它有点太慢了。
注意:我使用的数据集有大约50,000个属性。
代码I正在运行,
AttributeSelection attsel = new AttributeSelection();
InfoGainAttributeEval eval = new InfoGainAttributeEval();
Ranker search = new Ranker();
attsel.setEvaluator(eval);
attsel.setSearch(search);
double[][] attrRanks = new double[data.numAttributes()][2];
try {
attsel.SelectAttributes(data);
attrRanks = attsel.rankedAttributes();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:0)
事实证明排名实际上非常快,但创建~30,000 - 40,000个属性对象的过程需要一段时间。我删除了那部分代码,它开始工作正常。 新代码
GainRatioAttributeEval eval = new GainRatioAttributeEval();
try{
eval.buildEvaluator(data);
} catch(Exception e) {
LOGGER.error("Couldn't evaluate gain ratio", e);
}
Double infogain = Double.MIN_VALUE;
ObjectNode objNode;
int k, i;
double[][] ig = new double[data.numAttributes()][2];
for(int j=0;j<data.numAttributes();j++){
try {
ig[j][0] = j;
ig[j][1] = eval.evaluateAttribute(j);
} catch (Exception e) {
// TODO Auto-generated catch block
LOGGER.error("Couldn't evaluate gain ratio for empty entrezIds.",e);
}
}
Arrays.sort(ig, new Comparator<double[]>(){
@Override
public int compare(double[] o1, double[] o2) {
// TODO Auto-generated method stub
if (o1[1] > o2[1]) {
return -1;
} else if (o1[1] < o2[1]) {
return 1;
}
return 0;
}
});
//Ig is sorted array.