开源机器学习C++库Shark的编译与开发环境搭建

        Shark是一个快速、模块化、功能丰富的开源C++机器学习库,提供了各种机器学习相关技术,比如线性/非线性优化、基于内核学习算法、神经网络等。

开源机器学习C++库Shark的编译与开发环境搭建_第1张图片

 

        机器学习(MachineLearning)是一门多领域交叉学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 

    详细介绍请见http://image.diku.dk/shark/sphinx_pages/build/html/index.html

 

   说明:

  • shark2.3.4版本是可以从sourceForge直接下载得到的,有编译好的Windows安装包和源代码,但是现在shark的官方网站已经使用了shark3.0的版本,这个版本中做了很多改变,包括源代码的目录结构,因此如果你用的是2.3.4的版本,而又参照现有的官网上的教程来操作的话,你会出现无法打开头文件的错误,当然,你改变一下路径某些情况下是可以的,但是3.0增加了一些头文件,比如官网第一个教程的Csv.h这个文件,2.3.4的版本是没有的。
  • 另外,2.3.4版本没有用到boost库,所以如果你用那个版本可以不用担心boost库的问题。但是在Windows系统下开发2.3.4有个问题,2.3.4版本的Array在初始化的时候是设定的默认值为0,但是在Windows下创建一个Array对象,它的默认值并不会等于零,这就会造成某些莫名其妙的逻辑错误。

     所以,奉劝各位还是用3.0版本的吧。本文也只关注3.0版本的编译与开发环境搭建。

 

    首先,用svn或者Git,在  https://svn.code.sf.net/p/shark-project/code/trunk/Shark 这个路径下获取最新的源代码包。(注意:如果是Git,需要用git svn clone命令。)由于3.0的版本是基于boost库的,那么在编译之前自然要装上boost库,这个安装方法很多地方都有,我就不啰嗦了。需要注意的是,如果没有安装在默认的路径,而是自行配置的别的boost路径,后面需要多设置一个sharkCMake参数,不然编译会出错,提示找不到boost库。

 

    好,假设你已经正确安装上了boost库,现在我们来编译shark。如果你的boost库是在自定义的路径,那么用记事本打开shark源代码包的CMakeList.txt文件。

找到Boost库的配置相关代码。

增加两句代码,后面的路径分别是boost库的includelib的相应安装路径。保存后关闭文件,这样后面就不会出错了。

计算机生成了可选文字: SET(BoostUSEMULTITHREADEDON)ET(cMAKE_1NcLUDE_pATHS{cMAKE_INcLUDE_pATH}"D,/3rd--Party/bOO5tET(cHAKEL工sRARYPATH${cHAKEL工BRARYpATH}"D:/3rdParty/boost1551550/include")0/lib")l八DDDEFINITIONS一DBOOSTPARAMETERHAXA只ITY=15一DBOOSTFILESYSTEHVERSION=3

现在,打开CMake,填写相应的参数如下,第一个是shark的源代码包路径,第二个是CMake生成的工程路径。

开源机器学习C++库Shark的编译与开发环境搭建_第2张图片

设置好路径点击Configure,弹出如下所示提示框,选择正确的IDE版本。

应该不会有错误的,然后点击Generate,就会在刚刚设置的路径下生成sharkVS工程文件了。

 

打开这个shark.sln文件,在VS里面加载进入工程之后,直接全部生成,就OK了。

开源机器学习C++库Shark的编译与开发环境搭建_第3张图片

 

这时,你把shark源代码包根目录下的include文件夹拷贝出去,再把编译生成的lib文件shark_debug.lib拷贝出去,就可以作为开发库了。

 

计算机生成了可选文字: 名称鉴s卜。rk--deb。g.lib修改日期2014/812015:55

 

或者你在VS理单独编译一个叫INSTALL的项目,就会在刚才CMake配置的路径下生成一个shark的开发包文件,当然这个路径是可以自己修改的。多了几个文件夹,不过也就用到includelib做开发。

计算机生成了可选文字: 飞~.,.护气口飞L飞州尹飞矛飞.‘护悦卜刁J.,.压.、JIJ'.、“‘户弓JLM,U','J以I丫,U,'J占,仙VU,'1JIVVU呀口甘以IVVU.,JUOCMAKEINSTALLpRERXOpTCOMpILEDOCUMEN刀订IONC:/programFIleS/shark

 

开源机器学习C++库Shark的编译与开发环境搭建_第4张图片

 

好,开发包有了,我们还是来示例一个程序吧,看能否顺利运行。

新建项目,并添加一个新的cpp文件。在项目属性里,填写附加包含目录。分别是boost库的头文件目录和shark的头文件目录。

开源机器学习C++库Shark的编译与开发环境搭建_第5张图片

链接器中同样加入boostsharklib路径。

开源机器学习C++库Shark的编译与开发环境搭建_第6张图片

在链接器的输入选项中,输入sharklib文件名称。

OK,现在从shark的源代码包中,找到示例的数据,如下图所示的路径和所需文件。

    我们这个例子是官网的第二个线性回归分析的例子,(为什么不用第一个呢?Hello World的例子需要运行程序时传入命令行参数,好吧,又有很多朋友要头疼了,Windows下怎么带参数运行程序??所以……我们直接用第二个例子吧!),现在把下面的代码复制到你新建的那个cpp文件中,更改掉loadData函数的参数为相应的文件路径,并运行程序。

#include <shark/Data/Csv.h>
#include <shark/Algorithms/GradientDescent/CG.h>
#include <shark/ObjectiveFunctions/ErrorFunction.h>
#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h>
#include <shark/Models/LinearModel.h>
#include <string>

using namespace std;
using namespace shark;

RegressionDataset loadData( const string& dataFile, const string& labelFile )
{
    Data<RealVector> inputs;
    Data<RealVector> label;
    try
    {
        importCSV( inputs, dataFile, ' ' );
        importCSV( label, labelFile, ' ' );
    }
    catch ( ... )
    {
        cerr << "Unable to open file " <<  dataFile << " and/or " << labelFile << ". Check paths!" << endl;
        exit( EXIT_FAILURE );
    }
    RegressionDataset data( inputs, label );
    return data;
}

void main()
{
//一定要更改这行代码中的两个文件路径,否则这里会出错!
    RegressionDataset data = loadData( "E:\\SourceCode\\Shark\\examples\\Supervised\\data\\regressionInputs.csv", "E:\\SourceCode\\Shark\\examples\\Supervised\\data\\regressionLabels.csv" );
    
RegressionDataset test = splitAtElement( data, static_cast<std::size_t>( 0.8 * data.numberOfElements() ) );
    
    LinearModel<> model( inputDimension( data ), labelDimension( data ) );
    
    SquaredLoss<> loss;
    ErrorFunction<RealVector, RealVector> errorFunction( data, &model, &loss );
    
    CG optimazer;
    optimazer.init( errorFunction );
    for ( int i = 0; i < 100; i++ )
    {
        optimazer.step( errorFunction );
    }
    
    double trainingError = optimazer.solution().value;
    
    model.setParameterVector( optimazer.solution().point );
    Data<RealVector> prediction = model( test.inputs() );
    double testError = loss.eval( test.labels(), prediction );
    
    cout << "RESULTS: " << endl;
    cout << "======== \n" << endl;
    cout << "training error " << trainingError << endl;
    cout << "test error: " << testError << endl;
    
    getchar();
}
 
 


               运行程序后,如果正确的话,会得到如下的结果。


     这样就说明你的开发库没有问题了。后面就可以跟着官方上面的例子一步一步的学习这个强大的机器学习库了!

你可能感兴趣的:(C++,开源,机器学习,库,shark)