Shark是一个快速、模块化、功能丰富的开源C++机器学习库,提供了各种机器学习相关技术,比如线性/非线性优化、基于内核学习算法、神经网络等。
机器学习(MachineLearning)是一门多领域交叉学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。
详细介绍请见http://image.diku.dk/shark/sphinx_pages/build/html/index.html
说明:
所以,奉劝各位还是用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路径,后面需要多设置一个shark的CMake参数,不然编译会出错,提示找不到boost库。
好,假设你已经正确安装上了boost库,现在我们来编译shark。如果你的boost库是在自定义的路径,那么用记事本打开shark源代码包的CMakeList.txt文件。
找到Boost库的配置相关代码。
增加两句代码,后面的路径分别是boost库的include和lib的相应安装路径。保存后关闭文件,这样后面就不会出错了。
现在,打开CMake,填写相应的参数如下,第一个是shark的源代码包路径,第二个是CMake生成的工程路径。
设置好路径点击Configure,弹出如下所示提示框,选择正确的IDE版本。
应该不会有错误的,然后点击Generate,就会在刚刚设置的路径下生成shark的VS工程文件了。
打开这个shark.sln文件,在VS里面加载进入工程之后,直接全部生成,就OK了。
这时,你把shark源代码包根目录下的include文件夹拷贝出去,再把编译生成的lib文件shark_debug.lib拷贝出去,就可以作为开发库了。
或者你在VS理单独编译一个叫INSTALL的项目,就会在刚才CMake配置的路径下生成一个shark的开发包文件,当然这个路径是可以自己修改的。多了几个文件夹,不过也就用到include和lib做开发。
好,开发包有了,我们还是来示例一个程序吧,看能否顺利运行。
新建项目,并添加一个新的cpp文件。在项目属性里,填写附加包含目录。分别是boost库的头文件目录和shark的头文件目录。
链接器中同样加入boost和shark的lib路径。
在链接器的输入选项中,输入shark的lib文件名称。
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(); }
运行程序后,如果正确的话,会得到如下的结果。
这样就说明你的开发库没有问题了。后面就可以跟着官方上面的例子一步一步的学习这个强大的机器学习库了!