在递归函数中创建树

2024-09-29 21:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用java实现C4.5算法。为了初步了解C4.5算法,我从这个link引用了一段python代码。在这个项目上有一个名为我的.py它包含以下函数。你知道吗

def mine_c45(table, result):
    """ An entry point for C45 algorithm.
        _table_ - a dict representing data table in the following format:
        {
            '<column name>': [<column values>],
            '<column name>': [<column values>],
            ...
        }
        _result_: a string representing a name of column indicating a result.
    """
    col = max([(k, gain(table, k, result)) for k in table.keys() if k != result],
              key=lambda x: x[1])[0]
    tree = []
    for subt in get_subtables(table, col):
        v = subt[col][0]
        if is_mono(subt[result]):
            tree.append(['%s=%s' % (col, v),
                         '%s=%s' % (result, subt[result][0])])
        else:
            del subt[col]
            tree.append(['%s=%s' % (col, v)] + mine_c45(subt, result))
    return tree

通过使用link中的代码,我尝试在Java中对这些代码进行一些修改。我成功地得到了我想要的输出,但问题是我不能以递归的方式构建树。你知道吗

这里是用java转换的代码。你知道吗

public void mineC45(Map<String, Attribute> table, String result) {
    int maxGain = 0;
    double[] gains = new double[table.size()];
    int counter = 0;
    SplitPoints point = null;
    for (Entry<String, Attribute> entry : table.entrySet()) {
        if (!entry.getKey().equals(result)) {
            boolean nominal = entry.getValue().isNominal();
            if (nominal)
                gains[counter++] = Utils
                        .gain(table, entry.getKey(), result);
            else {
                point = Utils.numericGain(table, entry.getKey(), result);
                gains[counter++] = point.getGain();
            }
        }
    }

    // calculate maximum gain column index
    maxGain = Utils.getMax(gains);
    List<String> keys = new ArrayList<String>(table.keySet());
    String column = keys.get(maxGain);
    if (table.get(column).isNominal()) {
        for (Map<String, Attribute> subTable : Utils.createSubTables(table,
                column)) {
            String value = subTable.get(column).getValues().get(0);
            if (Utils.isMono(subTable.get(result))) {
                System.out.println("\t" + column + " = " + value + " "
                        + result + " = "
                        + subTable.get(result).getValues().get(0));
            } else {
                subTable.remove(column);
                System.out.println(column + " = " + value + " ");
                mineC45(subTable, result);
            }
        }
    } else {
        boolean first = true;
        for (Map<String, Attribute> subTable : Utils.createNSubtables(
                table, column, result, point.getSplitValue())) {
            String sign = "";
            sign = first ? "<=" : ">";
            first = false;
            if (Utils.isMono(subTable.get(result))) {
                System.out.println("\t" + column + " "
                        + point.getSplitValue().toString() + " " + result
                        + " = " + subTable.get(result).getValues().get(0));
            } else {
                subTable.remove(column);
                System.out.println(column + " "
                        + point.getSplitValue().toString() + " ");
                mineC45(subTable, result);
            }
        }
    }
}

这里我创建了Map<String, Attribute>,它表示一个表。字符串键表示列名,属性存储值列表。如果有人能解释我该如何将输出转换成树,以便形成规则。你知道吗


Tags: forgetstringiftableattributecolumncol

热门问题