作者|ALAKH SETHI
编译|VK
起源|Analytics Vidhya

介绍

我喜爱应用C++。C++是我学习过的第一种编程语言,我喜爱在机器学习中应用它。

我在之前写过对于构建机器学习模型的文章。我收到了一个回复,问我C++有没有机器学习的库?

这是个偏心的问题。像Python和R这样的语言有大量的包和库来满足不同的机器学习工作。那么C++有没有这样的产品呢?

是的,是的!在本文中,我将重点介绍两个这样的C++库,咱们也将看到它们都能够运行。

目录

  1. 为什么咱们要应用机器学习库?
  2. C++中的机器学习库

    1. SHARK 图书馆
    2. MLPACK库

为什么咱们要应用机器学习库?

这是很多新来者都会遇到的问题。库在机器学习中的重要性是什么?让我试着在这一节解释一下。

比如说,经验丰富的专业人士和行业新手曾经付出了艰苦的致力,并想出了解决问题的方法。你更违心应用它,还是违心花几个小时从头开始从新创立雷同的货色?后一种办法通常没有什么意义,尤其是当你在DDL前的工作或学习。

咱们的机器学习社区最大的长处是曾经有很多解决方案以库和包的模式存在。其余一些人,从专家到爱好者,曾经做了艰辛的工作,并将解决方案很好地打包在一个库中。

这些机器学习库是无效的和优化的,它们通过了多个用例的彻底测试。依附这些库,咱们的学习能力和编写代码,无论是在C++或Python,都是如此的简略和直观。

C++中的机器学习库

在本节中,咱们将介绍C+中两个最风行的机器学习库:

  1. SHARK库
  2. MLPACK库

让咱们逐个查看并查看他们的C++代码。

1.SHARK库

Shark是一个疾速的模块库,它对监督学习算法(如线性回归、神经网络、聚类、k-means等)提供了弱小的反对。它还包含线性代数和数值优化的性能。这些是在执行机器学习工作时十分重要的要害数学函数。

咱们将首先理解如何装置Shark并设置环境。而后咱们将用Shark实现线性回归。

装置Shark和装置环境(Linux)
  • Shark依赖于Boost和cmake。侥幸的是,能够应用以下命令装置所有依赖项:
sudo apt-get install cmake cmake-curses-gui libatlas-base-dev libboost-all-dev
  • 要装置Shark,请在终端中逐行运行以下命令:
gitt clone https://github.com/Shark-ML/Shark.git (you can download the zip file and extract as well)cd Sharkmkdir buildcd buildcmake ..make

如果你没见到谬误,那就没问题了。如果你遇到麻烦,网上有很多信息。对于Windows和其余操作系统,你能够在Google上疾速搜寻如何装置Shark。这有一份装置指南:http://www.shark-ml.org/sphin...

应用Shark编译程序
  • 包含相干的头文件。假如咱们要实现线性回归,那么额定的头文件包含:

用Shark编译程序

包含相干的头文件。假如咱们要实现线性回归,那么蕴含的额定头文件是:

#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h>#include <shark/Algorithms/Trainers/LinearRegression.h>

要编译,咱们须要链接到以下库:

-std=c++11 -lboost_serialization -lshark -lcblas
用Shark实现线性回归
初始化阶段

咱们将从蕴含线性回归的库和头函数开始:

#include <bits/stdc++.h> //所有c++规范库的头文件#include <shark/Data/Csv.h> //导入csv数据的头文件#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h> //用于实现平方损失函数的头文件#include <shark/Algorithms/Trainers/LinearRegression.h>// 实现线性回归的头文件

接下来是数据集。我曾经创立了两个CSV文件。这个输出.csv文件蕴含x值和标签.csv文件蕴含y值。以下是数据的快照:

你能够在github仓库失去这2个文件:https://github.com/Alakhator/...。

首先,咱们将制作用于存储CSV文件中的值的数据容器:

Data<RealVector> inputs; //存储x值的容器Data<RealVector> labels; //存储y值的容器

接下来,咱们须要导入它们。Shark提供了一个很好的导入CSV函数,咱们指定了要初始化的数据容器,以及CSV的门路文件的地位:

importCSV(inputs, "input.csv"); // 通过指定csv的门路将值存储在特定的容器中importCSV(labels, "label.csv");

而后,咱们须要实例化一个回归数据集类型。当初,这只是一个个别的回归对象,咱们在构造函数中要做的是传递咱们的输出以及数据的标签。

接下来,咱们须要训练线性回归模型。咱们怎么做呢?咱们须要实例化一个训练器,并定义一个线性模型:

RegressionDataset data(inputs, labels);LinearRegression trainer;// 线性回归模型训练器LinearModel<> model; // 线性模型
训练阶段

接下来是咱们理论训练模型的关键步骤。在这里,trainer有一个名为train的成员函数。咱们用函数训练这个模型

//训练模型trainer.train(model, data);// train function ro training the model.
预测阶段

最初,输入模型参数:

// 显示模型参数cout << "intercept: " << model.offset() << endl;cout << "matrix: " << model.matrix() << endl;

线性模型有一个名为offset的成员函数,输入最佳拟合线的截距。接下来,咱们输入一个矩阵。

咱们通过最小化最小平方来计算最佳拟合线,也就是最小化平方损失。

侥幸的是,模型容许咱们输入这些信息。Shark库十分有助于阐明模型的适用性:

SquaredLoss<> loss;   //初始化square loss对象Data<RealVector> prediction = model(data.inputs());  //依据数据输出预测cout << "squared loss: " << loss(data.labels(), prediction) << endl; // 最初咱们计算损失

首先,咱们须要初始化一个平方损失对象,而后咱们须要实例化一个数据容器。而后,依据零碎的输出计算预测,而后咱们只需通过传递标签和预测值来计算输入损失。

最初,咱们须要编译。在终端中,键入以下命令(确保正确设置了目录):

g++ -o lr linear_regression.cpp -std=c++11 -lboost_serialization -lshark -lcblas

一旦编译,它就会创立一个lr对象。当初只需运行程序。咱们失去的后果是:

b : [1](-0.749091)A :[1,1]((2.00731))Loss: 7.83109

b的值离0有点远,但这是因为标签中存在噪声。乘数的值靠近于2,与数据十分类似。这就是如何应用c++中的Shark库来构建线性回归模型!

MLPACK C++库

mlpack是一个用c++编写的疾速灵便的机器学习库。它的指标是提供疾速和可扩大的机器学习算法的实现。mlpack能够将这些算法作为简略的命令行程序、或绑定Python、Julia和c++,而后能够将这些类集成到更大规模的机器学习解决方案中。

咱们将首先理解如何装置mlpack和环境。而后咱们将应用mlpack实现k-means算法。

装置mlpack和装置环境(Linux)

mlpack依赖于以下库,这些库须要装置在零碎上:

  • Armadillo >= 8.400.0 (with LAPACK support)
  • Boost (math_c99, program_options, serialization, unit_test_framework, heap, spirit) >= 1.49
  • ensmallen >= 2.10.0

在Ubuntu和Debian中,你能够通过apt取得所有这些依赖项:

sudo apt-get install libboost-math-dev libboost-program-options-dev libboost-test-dev libboost-serialization-dev binutils-dev python-pandas python-numpy cython python-setuptools

当初所有依赖项都已装置在零碎中,能够间接运行以下命令来生成和装置mlpack:

wgettar -xvzpf mlpack-3.2.2.tar.gzmkdir mlpack-3.2.2/build && cd mlpack-3.2.2/buildcmake ../make -j4 # The -j is the number of cores you want to use for a buildsudo make install

在许多Linux零碎上,mlpack默认装置为/usr/local/lib,你可能须要设置LD_LIBRARY_PATH环境变量:

export LD_LIBRARY_PATH=/usr/local/lib

下面的阐明是获取、构建和装置mlpack的最简略办法。

用mlpack编译程序
  • 在你的程序中设置相干的头文件(实现k-means):
#include <mlpack/methods/kmeans/kmeans.hpp>#include <armadillo>
  • 要编译,咱们须要链接以下库:

std=c++11 -larmadillo -lmlpack -lboost_serialization

用mlpack实现K-Means

K-means是一个基于质心的算法,或者是一个基于间隔的算法,在这里咱们计算间隔以将一个点调配给一个簇。在K-Means中,每个簇都与一个质心相关联。

K-Means算法的次要指标是最小化点与它们各自的簇质心之间的间隔之和。

K-means是一个无效的迭代过程,咱们心愿将数据宰割成特定的簇。首先,咱们指定一些初始质心,所以这些质心是齐全随机的。

接下来,对于每个数据点,咱们找到最近的质心。而后咱们将数据点指定给那个质心。所以每个质心代表一个类。一旦咱们把所有的数据点调配给每个质心,咱们就会计算出这些质心的平均值。

这里,咱们将应用C++中的MLPACK库来实现k-均值。

初始化阶段

咱们将首先导入k-means的库和头函数:

#include <bits/stdc++.h>#include <mlpack/methods/kmeans/kmeans.hpp>#include <armadillo>Using namespace std;

接下来,咱们将创立一些根本变量来设置簇的数量、程序的维度、样本的数量以及咱们要执行的最大迭代次数。因为K-均值是一个迭代过程。

int k = 2; //簇的数量int dim = 2;//维度int samples = 50; int max_iter = 10;//最大迭代次数

接下来,咱们将创立数据。所以这是咱们第一次应用Armadillo库。咱们将创立一个映射类,它实际上是一个数据容器:

arma::mat data(dim, samples, arma::fill::zeros);

这个mat类,咱们给它2维,50个样本,它初始化所有这些数据值为0。

接下来,咱们将向这个数据类调配一些随机数据,而后在其上无效地运行K-means。我将在地位1 1四周创立25个点,咱们能够通过无效地说每个数据点是1 1或者在X = 1,y = 1的地位。而后咱们要为这25个数据点中的每一个加一些随机噪声。

// 创立数据    int i = 0;    for(; i < samples / 2; ++i)    {        data.col(i) = arma::vec({1, 1}) + 0.25*arma::randn<arma::vec>(dim);    }    for(; i < samples; ++i)    {        data.col(i) = arma::vec({2, 3}) + 0.25*arma::randn<arma::vec>(dim);    }

这里,对于从0到25的i,根本地位是X = 1,y = 1,而后咱们要增加肯定数量的维度为2的随机噪声。而后咱们对点x=2,y=3做同样的操作。

咱们的数据曾经筹备好了!是时候进入训练阶段了。

训练阶段

首先,咱们实例化一个arma mat行类型来保留簇,而后实例化一个arma mat来保留质心:

//对数据进行聚类arma::Row<size_t> clusters;arma::mat centroids;

当初,咱们须要实例化K-means类:

mlpack::kmeans::KMeans<> mlpack_kmeans(max_iter);

咱们实例化了K-means类,并指定了传递给构造函数的最大迭代次数。当初,咱们能够进行聚类了。

咱们将调用这个K-means类的Cluster成员函数。咱们须要传入数据、簇的数量,而后还要传入簇对象和质心对象。

mlpack_kmeans.Cluster(data, k, clusters, centroids);

当初,这个Cluster函数将应用指定数量的簇对这个数据运行K-means

生成后果

咱们能够应用centroids.print函数简略地显示后果。这将给出质心的地位:

centroids.print("Centroids:");

接下来,咱们须要编译。在终端中,键入以下命令(再次确认目录设置正确):

g++ k_means.cpp -o kmeans_test -O3 -std=c++11 -larmadillo -lmlpack -lboost_serialization && ./kmeans_test

一旦编译,它就会创立一个kmeans对象。当初只需运行程序。咱们失去的后果是:

Centroids:0.9497   1.96250.9689   3.0652

结尾

在本文中,咱们看到了两个风行的机器学习库,它们帮忙咱们在c++中实现机器学习模型。

原文链接:https://www.analyticsvidhya.c...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/