有没有办法使用MATLAB将classregtree对象保存到文件中,以便我可以从java应用程序中读取文件?
理想情况下,我想从matlab保存到XML文件。
答案 0 :(得分:2)
classregtree
对象可以使用disp(t)
以文本形式显示。该函数背后的逻辑位于MATLAB/R201Xx/toolbox/stats/stats/@classregtree/disp.m
。
为了以编程方式将此输出保存到文件,需要对该函数应用一些修改。
以下代码添加了将文本表单保存到文本文件的功能,然后可以使用Java解析该文本文件:
function save_classregtree(t, filename)
fileId = fopen(filename, 'w');
% Get some information about the whole tree
maxnode = numel(t.node);
nd = 1 + floor(log10(maxnode)); % number of digits for node number
varnames = names(t);
if isempty(varnames)
numCell = textscan(sprintf('%d\n',1:t.npred),'%s\n');
varnames = strcat('x',numCell{1});
end
isregression = isequal(t.method,'regression');
if isregression
fprintf(fileId, getString(message('stats:classregtree:disp:DecisionTreeForRegression')));
else
fprintf(fileId, getString(message('stats:classregtree:disp:DecisionTreeForClassification')));
end
% Display information about each node
for j=1:maxnode
if any(t.children(j))
% branch node
vnum = t.var(j);
vname = varnames{abs(vnum)};
cut = t.cut{j};
kids = t.children(j);
if strcmp(type(t),'regression')
Yfit = t.class(j);
Yfit = num2str(Yfit,'%g');
elseif strcmp(type(t),'classification')
Yfit = t.classname(t.class(j));
end
if vnum>0 % continuous predictor "<" condition
condleft = sprintf('%s<%g',vname,cut);
condright = sprintf('%s>=%g',vname,cut);
fprintf(fileId, '%*d %s\n',nd,j,getString(message('stats:classregtree:disp:TreeBranch',...
condleft,kids(1),condright,kids(2),char(Yfit))));
else % categorical predictor, membership condition
cats = cut{1};
if isscalar(cats)
condleft = sprintf('%s=%g',vname,cats);
else
set = deblank(num2str(cats,'%g '));
condleft = sprintf('%s %s {%s}',vname,getString(message('stats:classregtree:disp:ElementInSet')),set);
end
cats = cut{2};
if isscalar(cats)
condright = sprintf('%s=%g',vname,cats);
else
set = deblank(num2str(cats,'%g '));
condright = sprintf('%s %s {%s}',vname,getString(message('stats:classregtree:disp:ElementInSet')),set);
end
fprintf(fileId, '%*d %s\n',nd,j,getString(message('stats:classregtree:disp:TreeBranch',...
condleft,kids(1),condright,kids(2),Yfit)));
end
else
% terminal node, display fit (regression) or class assignment
if isregression
fprintf(fileId, sprintf('%s %s %s\n','%*d',getString(message('stats:classregtree:disp:FittedResponse')),'%g'),nd,j,t.class(j));
else
fprintf(fileId, sprintf('%s %s %s\n','%*d',getString(message('stats:classregtree:disp:PredictedClass')),'%s'),nd,j,char(t.classname(t.class(j))));
end
end
fclose(fileId);
end
当然,你也可以在迭代孩子的同时在Matlab中直接构建XML。以下递归函数为您提供了如何实现该函数的提示:
function [] = build_xml(t, filename)
children = t.children(1);
xml = '<classregtree>';
xml = [xml, rec(t,children(1))];
xml = [xml, rec(t,children(2))];
xml = [xml, '</classregtree>'];
fileId = fopen(filename, 'w+t', 'n');
fwrite(fileId, xml, 'char');
fclose(fileId);
end
function [xml] = rec(t, child)
xml = ['<child id="', num2str(child), '">'];
children = t.children(child);
if any(children)
if children(1)
xml = [xml, rec(t,children(1))];
end
if children(2)
xml = [xml, rec(t,children(2))];
end
end
xml = [xml, '</child>'];
end
答案 1 :(得分:0)
我能管理的最好的方法是导出拆分定义并从那些重新实现树:
classificationtree.view
如果您的对象被调用classificationtree
,将显示决策树的文本版本。
它出现在if-elseif-else-goto伪代码中,并没有太多变成你选择的语言:如果你必须经常更改训练数据,宏或某种字符串处理可能会很有用。它可能是他们可以选择的最有用的形式。
如果对输入变量应用有意义的名称(通过设置PredictorNames
属性),这将有所帮助 - 使这些名称与java程序中的变量名称相同,并且只需要少一些转录。做。