【问题标题】:How can i check how the predict function in MATLAB is working?如何检查 MATLAB 中的预测函数是如何工作的?
【发布时间】:2018-02-13 20:33:48
【问题描述】:

我有一个非常简单的 MATLAB 程序用于训练和测试回归树,我使用教程示例中的相同数据 carsmall:

clear all 
clc
close all

load carsmall

X = [Cylinders, Weight, Horsepower, Displacement];
Y = MPG;
tree = fitrtree(X,Y, 'PredictorNames',{'Cylinders', 'Weight', 'Horsepower', 'Displacement'},'ResponseName','MPG','MinLeaf',10); 
Xtest=[6,4100,150,130];
MPGest = predict(tree, Xtest);

结果是 MPGest=14.9167

我想知道 predict 函数是如何得出该值的,通常是为了理解我在函数内部逐行执行。这个非常棘手,因为使用类,所以我到达了这一行

node = findNode(this.Impl,X,this.DataSummary.CategoricalPredictors,subtrees);

在那个函数里面我到达了

            n = classreg.learning.treeutils.findNode(X,...
            subtrees,this.PruneList,...
            this.Children',iscat,...
            this.CutVar,this.CutPoint,this.CutCategories,...
            this.SurrCutFlip,this.SurrCutVar,...
            this.SurrCutPoint,this.SurrCutCategories,...
            verbose);

当我尝试进入这一步时,它只给我 n=10,MATLAB 是如何得出这个数字的?例如,如果我想编写自己的程序来使用树对象作为输入而不使用预测来计算这个数字?

【问题讨论】:

    标签: matlab tree predict regression-testing


    【解决方案1】:

    实际上,您要查找的函数已定义在MEX 文件中。如果你尝试使用open function打开它,你会得到如下结果:

    打开'classreg.learning.treeutils.findNode'

    使用打开时出错(第 145 行)无法编辑 MEX 文件 'C:...\toolbox\stats\classreg+classreg+learning+treeutils\findNode.mexw64'

    不幸的是,MEX 文件是从C++ 源编译成字节码(更广为人知的assembly 语言)。您可以使用许多反编译器来重建编译到库中的指令(this 是一个很好的起点,如果您想快速了解一下),整个过程是可行的,特别是因为文件本身是很小。

    您将得到的代码不会是原始源代码,而是类似的东西:变量将有一个默认且无意义的名称,到处都是指针,它还可能包含由于某些程序集的错误反转而导致的错误指示。这可能足以让您了解发生了什么,但您将无法通过 Matlab 中的逐步调试会话来跟踪计算。

    现在,您必须回答的唯一问题是:这值得付出努力吗?

    【讨论】:

    • 我的问题可能被误解了。我不是想对 mex 程序进行逆向工程,我只是想了解预测函数是如何得出该特定预测的。我如何使用存储在树中的信息加上测试数据并得出特定的预测。我只是在寻找它背后的理论以及如何使用树结构中已经存在的信息。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多