作者 |ALAKH SETHI
编译 |VK
起源 |Analytics Vidhya
介绍
我喜爱应用 C ++。C++ 是我学习过的第一种编程语言,我喜爱在机器学习中应用它。
我在之前写过对于构建机器学习模型的文章。我收到了一个回复,问我 C ++ 有没有机器学习的库?
这是个偏心的问题。像 Python 和 R 这样的语言有大量的包和库来满足不同的机器学习工作。那么 C ++ 有没有这样的产品呢?
是的,是的!在本文中,我将重点介绍两个这样的 C ++ 库,咱们也将看到它们都能够运行。
目录
- 为什么咱们要应用机器学习库?
-
C++ 中的机器学习库
- SHARK 图书馆
- MLPACK 库
为什么咱们要应用机器学习库?
这是很多新来者都会遇到的问题。库在机器学习中的重要性是什么?让我试着在这一节解释一下。
比如说,经验丰富的专业人士和行业新手曾经付出了艰苦的致力,并想出了解决问题的方法。你更违心应用它,还是违心花几个小时从头开始从新创立雷同的货色?后一种办法通常没有什么意义,尤其是当你在 DDL 前的工作或学习。
咱们的机器学习社区最大的长处是曾经有很多解决方案以库和包的模式存在。其余一些人,从专家到爱好者,曾经做了艰辛的工作,并将解决方案很好地打包在一个库中。
这些机器学习库是无效的和优化的,它们通过了多个用例的彻底测试。依附这些库,咱们的学习能力和编写代码,无论是在 C ++ 或 Python,都是如此的简略和直观。
C++ 中的机器学习库
在本节中,咱们将介绍 C + 中两个最风行的机器学习库:
- SHARK 库
- 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 Shark
mkdir build
cd build
cmake ..
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:
wget
tar -xvzpf mlpack-3.2.2.tar.gz
mkdir mlpack-3.2.2/build && cd mlpack-3.2.2/build
cmake ../
make -j4 # The -j is the number of cores you want to use for a build
sudo 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.9625
0.9689 3.0652
结尾
在本文中,咱们看到了两个风行的机器学习库,它们帮忙咱们在 c ++ 中实现机器学习模型。
原文链接:https://www.analyticsvidhya.c…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/