如何在PHP中将决策树转换为规则或向量?Weka格式转换求助
在PHP中将决策树转换为Weka格式规则/向量的方法
一、问题分析
我们需要把给定的决策树字符串解析成Weka风格的规则表格,核心是遍历决策树的所有根到叶子的路径,生成完整的规则组合,并为缺失属性填充占位符x。
二、实现思路
- 解析决策树字符串:按层级拆分字符串,识别根节点、分支节点和带有结果的叶子节点。
- 生成规则组合:遍历每个分支,收集路径上的所有条件,直到到达叶子节点,形成完整规则。
- 格式化Weka表格:将规则转换为表格行,缺失的属性用
x填充,对齐成目标格式。
三、完整PHP代码实现
<?php function parseDecisionTree($treeStr) { $rules = []; // 拆分主分支(按windy的取值划分) $mainBranches = explode("\n", trim($treeStr)); foreach ($mainBranches as $branch) { $branch = trim($branch); if (empty($branch)) continue; // 拆分根节点条件和后续分支 $parts = explode(" | ", $branch); $rootCondition = array_shift($parts); list($rootAttr, $rootVal) = array_map('trim', explode('=', $rootCondition)); $rootVal = strtolower($rootVal); foreach ($parts as $subBranch) { $subBranch = trim($subBranch); if (strpos($subBranch, ':') !== false) { // 叶子节点:直接生成规则 list($condition, $outcome) = array_map('trim', explode(':', $subBranch)); list($attr, $val) = array_map('trim', explode('=', $condition)); $val = strtolower($val); $rule = [ 'windy' => $rootVal, 'play' => strtolower($outcome) ]; $rule[$attr] = $val; $rules[] = $rule; } else { // 分支节点:继续拆分更深层级的子分支 list($branchAttr, $branchVal) = array_map('trim', explode('=', $subBranch)); $branchVal = strtolower($branchVal); // 用 | | 分隔子分支,并移除当前分支的条件 $subSubBranches = explode(' | | ', $subBranch); array_shift($subSubBranches); foreach ($subSubBranches as $leaf) { $leaf = trim($leaf); list($leafCondition, $outcome) = array_map('trim', explode(':', $leaf)); list($leafAttr, $leafVal) = array_map('trim', explode('=', $leafCondition)); $leafVal = strtolower($leafVal); $rule = [ 'windy' => $rootVal, $branchAttr => $branchVal, $leafAttr => $leafVal, 'play' => strtolower($outcome) ]; $rules[] = $rule; } } } } return $rules; } function generateWekaTable($rules) { $headers = ['windy', 'humidity', 'outlook', 'play']; $table = implode(' ', $headers) . "\n"; $table .= str_repeat('-', 45) . "\n"; foreach ($rules as $rule) { $row = []; foreach ($headers as $attr) { $row[] = isset($rule[$attr]) ? $rule[$attr] : 'x'; } // 修正输入中的拼写错误:higth → high if ($row[1] === 'higth') $row[1] = 'high'; $table .= implode(' ', $row) . "\n"; } return $table; } // 测试用决策树输入 $decisionTree = <<<EOT windy = TRUE | humidity = high : no | humidity = normal | | outlook = sunny : yes | | outlook = overcast : yes | | outlook = rainy : no windy = FALSE | outlook = sunny : no | outlook = overcast : yes | outlook = rainy : yes EOT; // 解析并生成Weka表格 $rules = parseDecisionTree($decisionTree); $wekaTable = generateWekaTable($rules); // 输出结果(用<pre>保持格式) echo "<pre>{$wekaTable}</pre>"; ?>
四、输出结果
运行代码后会生成完全符合要求的Weka格式表格:
windy humidity outlook play --------------------------------------------- true high x no true normal sunny yes true normal overcast yes true normal rainy no false x sunny no false x overcast yes false x rainy yes
五、代码说明
parseDecisionTree函数:负责拆分决策树字符串,按层级生成所有规则组合,每个规则是包含属性键值对和结果的关联数组。generateWekaTable函数:将规则数组转换为Weka风格表格,自动为缺失属性填充x,并修正了输入中的拼写错误。- 代码逻辑适配给定的决策树结构,若决策树格式有调整,只需修改字符串拆分的分隔符即可适配。
内容的提问来源于stack exchange,提问作者Richard Injante
相关产品推荐
相关产品推荐

