C语言mlpack:一个C+机器学习库

简介

mlpack是一个C++机器学习库,侧重于可扩展性、速度和易用性。它的目的是通过一个简单的、前后一致的API让新用户使用机器学习成为可能,同时利用C++语言特征为专家用户提供最好的性能和最大的灵活性。这些通过提供一系列命令行执行程序完成,就像使用一个黑箱,而且专家用户和研究者可以容易的更改一个模块化的C++ API的内部算法。

mlpack

m'lpack

这种方法的结果就是mlpack的性能大幅度超过其他竞争的机器学习库;

mlpack由全世界的贡献者开发。基于伯克利发行软件许可的第三个条款免费发行。(比1.0.12更老的版本基于GNU通用公共授权规定发行:LGPL,第3版。)

安装

mlpack存储在许多Linux的发行版本中,所以在你的系统中使用程序包管理器可能更容易一些。例如:在Ubuntu上,你可以使用下面的命令安装mlpack。

1.$ sudo apt-get install libmlpack-dev

如果mlpack不能在你的系统的程序包管理器中使用,那么你可以按照下面的步骤编译和安装mlpack源文件。

Mlpack使用CMake作为生成系统,允许几个灵活的生成配置选项。你可以查询大量的CMake教程得到更多的文件,但是这个教程应该足够让你在大多数Linux和类UNIX系统中(包括OS X)成功生成和安装mlpack。如果你想在Windows操作系统中生成mlpack,请看这里。

首先下载mlpack。

当mlpack的源文件完成解压,你可以创建一个生成目录。

1.$ cd mlpack-2.2.5

2.$ mkdir build

这个目录可以是任何名字,不仅仅是“build”,但是“build”足够了。

mlpack依赖项

mlpack依赖下面的库,它们需要被安装在系统中并有一些头文件出现。

Armadillo >=4.200.0(支持LAPACK(线性代数程序包))

Boost(math_c99, program_options, serialization, unit_test_framework, heap, spirit)>=1.49

在Ununtu和Debian中,你可以通过apt获得所有这些依赖项:

1.# apt-get install libboost-math-dev libboost-program-options-dev

2. libboost-test-dev libboost-serialization-dev libarmadillo-dev binutils-dev

配置CMake

运行CMake相当于使用autotools运行./configure。

如果你工作中使用mlpack的svn trunk版本,且不带任何选项运行CMake,它将配置这个生成项目带有调试符号和分析信息:如果你工作中使用发行版本的mlpack,不带任何选项运行CMake,它将配置这个生成项目不带调试符号和分析信息(为了速度)。

1.$ cd build

2.$ cmake ../

你可以手动指定选项去编译或不编译调试信息和分析信息(也就是说尽可能快):

1.$ cd build

2.$ cmake -D DEBUG=OFF -D PROFILE=OFF ../

Mlpack允许的全部选项为:

DEBUG=(ON/OFF): compile with debugging symbols (default ON in svn trunk, OFF in releases)

PROFILE=(ON/OFF): compile with profiling symbols (default ON in svn trunk, OFF in releases)

ARMA_EXTRA_DEBUG=(ON/OFF): compile with extra Armadillo debugging symbols (default OFF)

BUILD_TESTS=(ON/OFF): compile the mlpack_test program (default ON)

BUILD_CLI_EXECUTABLES=(ON/OFF): compile the mlpack command-line executables (i.e. mlpack_knn, mlpack_kfn, mlpack_logistic_regression, etc.) (default ON)

TEST_VERBOSE=(ON/OFF): run test cases in mlpack_test with verbose output (default OFF)

每个选项都可以被指定给带有‘-D’标记的CMake。其他工具也可以用于配置CMake,但是它们没有被记录在这里。

生成mlpack

一旦CMake配置好,生成库就像打出‘make’一样简单。这将生成所有库组件和‘mlpack_test’。

1.$ make

2.Scanning dependencies of target mlpack

3.[ 1%] Building CXX object

4.src/mlpack/CMakeFiles/mlpack.dir/core/optimizers/aug_lagrangian/aug_lagrangian_test_functions.cpp.o

如果你不想生成每一个库,可以指定你想生成的单个组件。

1.$ make mlpack_pca mlpack_knn mlpack_kfn

一个有趣的特殊组件是mlpack_test,它是运行mlpack的测试组件。你可以使用这个命令生成这个组件:

1.$ make mlpack_test

然后运行所有的测试组件或单个的测试组件:

1.$ bin/mlpack_test

2.$ bin/mlpack_test -t KNNTest

如果生成失败,而你不能找到为什么失败,在Github上注册一个账户,提交这个问题,mlpack的开发人员将会尽快帮你解决,

或者在irc.freenode.netm上的mlpack的IRC中也可以找到mlpack的帮助。

安装mlpack

如果你想将mlpack安装在/usr/include/mlpack/、/usr/lib/和/usr/bin/中,当它生成后,确保你有root权限(或向那两个目录的写入许可),然后简单的打出:

1.# make install

现在你可以通过名字运行可执行程序;你可以使用-lmlpack链接到mlpack,mlpack的头文件可以在目录/usr/include/mlpack/中找到。

示例

最近邻搜索是一个常见的机器学习任务。在这个背景下 ,我们有一个查询数据集和一个参考数据集。对于在查询数据集中的每个点,我们希望知道参考数据集中距离给定查询点最近的k个点。

或者,如果查询和参考数据集是相同的,问题可以更简单的说明:对于每个数据集中的点,我们希望知道距离那个点最近的k个点。

Mlpack提供:

一个简单的命令行程序包运行最近邻搜索(和最远邻搜索)。

一个简单的C++接口用于完成最近邻搜索(和最远邻搜索)。

一个通用的、可扩展的和强大的C++类(邻域搜索)用于复杂算法。

命令行‘mlpack_knn’

在mlpack中完成最近邻搜索最简单的方式是使用mlpack_knn程序包。这个程序将完成最近邻搜索,并将得到的邻近点放入一个文件,同时将对应的距离放入另一个文件。输出文件被整理为第一行对应第一个被查询点的最近邻点,第一列对应最近的点,以此类推。

还有几个简单用法的例子(和输出结果)。由于使用了选项‘-v’,因此输出是给定的。更多关于每个选项的文档可以通过这个语句找到。这里列举一个。

TraverserType策略类

邻域搜索NeighborSearch类提供的最后一个模板参数是TraverserType类。它具有的策略是在单一树或者双树搜索模式下遍历树。默认情况下,它被设置为使用指定TreeType(成员TreeType::DualTreeTraverser)的默认遍历器。

这个类必须实现下面两种方法:

1.// Instantiate with a given RuleType.

2.TraverserType(RuleType& rule);

3.

4..// Traverse with two trees.

5.void Traverse(TreeType& queryNode, TreeType& referenceNode);

RuleType类用在遍历器中时提供下面的功能:

1.// Evaluate the base case between two points.

2.double BaseCase(const size_t queryIndex, const size_t referenceIndex);

3.

4.// Score the two nodes to see if they can be pruned, returning DBL_MAX if they

5.// can be pruned.

6.double Score(TreeType& queryNode, TreeType& referenceNode);

注意任何指定的遍历器必须满足修剪双树遍历的定义,其在文章”Tree-independent dual-tree algorithms”中指定。

最后你觉得我们的文章对你有帮助,欢迎关注我,可以私信我:久伴,领取学习资料,在评论下方可以关注我的学习群,你可以随时在上面向我们提问,把你在学习C++过程中所遇到的问题发给我们。我们每天都会按时回复大家的每一个问题,希望久伴可以伴随你从入门到专家

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180605A0RK4700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券