C 机器学习库介绍

介绍

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

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

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

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

目录

  1. 为什么我们要使用机器学习库?
  2. C++中的机器学习库SHARK 图书馆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/sphinx_pages/build/html/rest_sources/tutorials/tutorials.html

使用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/Machine-Learning-With-C-。

首先,我们将制作用于存储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++中实现机器学习模型。

(0)

相关推荐

  • 供应链选址(1)-基于自定义距离的广义Kmeans 聚类

    low profile,no profile 背景介绍 出于种种原因,在供应链环节需要添加新的配送中心(Distribution Center)来满足业务需求.这些原因可能是因为需求逐年增长,也有可能 ...

  • ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类

    ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类 输出结果 核心代码 #!/usr/bin/python # -*- coding:utf- ...

  • 人工智能基础课堂纪要8

    5.3 Boosting[**] 1.boosting集成原理 随着学习的积累从弱到强 2.实现过程 1.初始化训练数据权重,初始权重是相等的 2.通过这个学习器,计算错误率 3.计算这个学习期的投票 ...

  • 机器学习,KMeans聚类分析详解

    来源:数据STUDIO 作者:Jim 大量数据中具有'相似'特征的数据点或样本划分为一个类别.聚类分析提供了样本集在非监督模式下的类别划分.聚类的基本思想是'物以类聚.人以群分',将大量数据集中相似的 ...

  • 无乘加矩阵乘法MADNESS

    作者介绍:Davis Blalock :麻省理工学院的博士生,由John Guttag 教授指导.主要研究方向是设计高性能的机器学习算法,以减少人们在机器学习速度.准确性.隐私和安全性之间的妥协.Jo ...

  • C++ 中的卷积神经网络 (CNN)

    重磅干货,第一时间送达 有很多卷积神经网络文章解释了 CNN 是什么以及它的用途是什么,而本文将用 C++ 编写一个 CNN 和一个名为 mlpack 的库来对MNIST数据集进行分类. 你们可能会问 ...

  • 怎么学习机器视觉?这个行业有前途吗

    机器视觉会有前途. 我是从事自动化行业的,这几年机器视觉的应用真的是风生水起. 特别是在工业4.0,大数据,AI,深度学习这些高大上高科技名词的带动下, 机器视觉越来越被企业老板接受. 大的小的项目, ...

  • 什么是Scikit-learn?Python机器学习库介绍!

    对Python语言有所了解的人都知道Python简单,拥有丰富的第三方库,可用于人工智能.机器学习.网络爬虫.web开发等领域,而这篇文章小编想要为大家介绍一下最有名,也是专门面向机器学习的一个库,它 ...

  • 中国象棋云库介绍以及使用方法

    中国象棋云库是款在电脑端进行使用的象棋工具:它也就是大家经常说的pc端,可以轻松的查询到各种类型的历史走法,而且还可对象棋的规定进行查看,可以对先手进行设置,对残局的类型进行选择学习:不管是新手还是老 ...

  • 10大Python库介绍!

    现在转行学编程,很多人都会选择Python,很大一部分原因是因为Python具有丰富的第三方库,既可以帮助我们提高开发效率,还能够缩减代码量.那么你知道Python有哪些库吗?这里为大家介绍10个,总 ...

  • Python机器学习库有哪些?Python入门!

    很多人之所以喜欢python,不仅仅因为简单易学.容易入门,更多是因为python有强大的第三方库,那么在机器学习中,python有哪些库可以使用呢? 1.Scikit-learn:最流行的ML库之一 ...

  • Python机器学习库有哪些?推荐这五个

    大家应该都知道python拥有各种丰富的第三方库,可以为我们的开发工作带来很大的帮助,而且针对不同的领域python有着各种各样的库,那么今天为大家介绍五个常用的机器学习python库! 1.NumP ...

  • Python 自动化库介绍 PySimpleGUI

    Python编程学习圈 3天前 [导语]python在运维和办公自动化中扮演着重要的角色,PySimpleGUI 是一款很棒的自动化辅助模块,让你更轻松的实现日常任务的自动化. 1 PySimpleG ...

  • PDAL点云处理库介绍

    PDAL是点云数据处理的库.这是一个C/C++开源库,用于点云数据的转换和处理.尽管该库中许多工具的重点和发展都起源于激光雷达点云数据的处理,但它也不限于激光雷达数据. 什么是PDAL? PDAL是点 ...

  • TeaseR++:快速鲁棒的C++点云配准库介绍+英文版视频教程

    本文提出了一种快速鲁棒的点云配准算法,对存在离群噪声点的点云数据具有较好的配准效果.首先使用了截断最小二乘(Truncated Least Squares TLS)代价函数重新构造配准问题 ,该代价是 ...

  • Python汇总篇,200+Python标准库介绍

    今天给大家介绍一下200多个Python标准库,让大家对Python标准库有一个大致的认识. 关于Python标准库 01 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现 ...