我怀疑您的代码不打印任何内容的原因是因为您忘记了endl
. (这就是Joachim Pileborg在他的评论中提到的。)
如果您使用的是 Visual Studio,您可能希望在代码末尾添加一个断点(可能在 return 语句上),因为在某些模式下,它可以在您看到输出之前关闭您的应用程序,这可能使它看起来像如果什么都没发生。
例子
下面是一个对我来说很好的完整示例。它包括您的实例。它从中加载一个 K-最近邻学习器2blobs_knn.json
,然后在其上评估您的实例。您可以将该文件名替换为由 waffles 工具生成的任何经过训练的监督模型的名称。
使用我使用的模型,程序打印“1”并退出。
如果你想使用我测试我的代码的确切模型(如果你构建学习器的方法是问题)请参阅示例代码后面的部分。
#include <GClasses/GMatrix.h>
#include <GClasses/GHolders.h>
#include <GClasses/GRand.h>
#include <GClasses/GLearner.h>
#include <GClasses/GDom.h>
#include <iostream>
#include <cassert>
using namespace GClasses;
using std::cout; using std::endl;
int main(int argc, char *argv[])
{
//Load my trained learner from a file named 2blobs_knn.json and put
//it in hModel which is a shared-pointer class.
GLearnerLoader ll(GRand::global());
GDom dom;
dom.loadJson("2blobs_knn.json");
Holder<GSupervisedLearner> hModel(ll.loadSupervisedLearner(dom.root()));
assert(hModel.get() != NULL);
//Here is your code
GMatrix Instance(1,8);// Instance has 8 real attributes and one row
double out; // The value in attribute 'class' is nominal
Instance[0][0]=6;
Instance[0][1]=148;
Instance[0][2]=72;
Instance[0][3]=35;
Instance[0][4]=0;
Instance[0][5]=33.6;
Instance[0][6]=0.62;
Instance[0][7]=50;
hModel.get()->predict(Instance[0],&out);
cout << out << endl;
return 0;
}
我在示例中使用的学习器是如何构建的
为了获得学习者,我使用 Matlab(Octave是免费的模仿者)生成一个 CSV 文件,其中 0 类是一个 8 维球面单位高斯,以 (0,0,0,0,0,0,0,0 为中心) 和第 1 类具有相同的分布,但集中在 (2,2,2,2,2,2,2,2)
m=[[randn(200,8);randn(200,8)+2], [repmat(0,200,1);repmat(1,200,1)]];
csvwrite('2blobs.csv',m)
然后,我拿了那个 CSV,用它把它转换成 ARFF
waffles_transform import 2blobs.csv > 2blobs.arff
接下来,我在文本编辑器中将最后一个属性从 更改为@ATTRIBUTE attr8 real
,
@ATTRIBUTE class {0,1}
因此它是名义上的。
最后,我用
waffles_learn train 2blobs.arff knn -neighbors 10 > 2blobs_knn.json