C++機器學習庫介紹

2020-12-25 人工智慧遇見磐創

介紹

我喜歡使用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 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.83109b的值離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.49ensmallen >= 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++中實現機器學習模型。

相關焦點

  • C++機器學習庫介紹 | 文末送書
    C++是我學習過的第一種程式語言,我喜歡在機器學習中使用它。我在之前寫過關於構建機器學習模型的文章,我收到了一個回復,問我C++有沒有機器學習的庫?這是個很好的問題。像Python和R這樣的語言有大量的包和庫來滿足不同的機器學習任務,那麼C++有沒有這樣的產品呢?是的!在本文中,我將重點介紹兩個這樣的C++庫,我們也將看到它們都是可以運行。
  • 機器學習 | 四大常用機器學習Python庫介紹
    Python中常用的機器學習庫(機器學習、深度學習啥的,小編還是建議使用Python進行建模編寫哈),也算是本公號機器學習的第一篇推文,主要內容如下:深度學習常用四大Python庫這一部分我們簡單介紹下Python中的常用的機器學習庫,算是比較入門的介紹哈,具體包括Scikit-learn、Keras、TensorFlow和PyTorch
  • python機器學習:常用庫的介紹及安裝
    現在,隨著人工智慧的興起,機器學習越來越被各行業看重,從而使得人工智慧的需求會越來越大。今天,我們就從零基礎開始學習人工智慧的基礎篇——機器學習。工欲善其事必先利其器,所以,我們首先來看一下,我們要學習這些東西,需要準備些什麼!首先電腦一臺,這是必備的。下面我們來看一下需要安裝些什麼軟體到電腦上!
  • python調用C++: ctypes庫教程
    一、準備C++代碼注意,使用ctypes庫調用C++代碼時,由於C++相比於C多了函數重載的特性,因此一個函數不能僅僅使用其名字來確定
  • 8大Python機器學習庫
    下面開始正文本文是介紹頂級 Python 機器學習、人工智慧、深度學習和數據科學庫系列的第一篇文章。Python 在機器學習、人工智慧、深度學習和數據科學等領域越來越火,根據 Builtwith.com 的調研顯示45%的技術公司選擇 Python 來完成人工智慧與機器學習的任務。
  • 最好的Python機器學習庫
    引言毫無疑問,神經網絡和機器學習在過去幾年一直是高科技領域最熱門的話題之一。這一點很容易看出,因為它們解決了很多真正有趣的用例,如語音識別、圖像識別、甚至是樂曲譜寫。因此,在這篇文章,我決定編制一份囊括一些很好的Python機器學習庫的清單,並將其張貼在下面。
  • Python機器學習系列3:一個通用、強大的Python機器學習函數庫
    如果你對Python機器學習感興趣,正在尋找一個強大的Python機器學習庫,那麼本文將強烈推薦scikit-learn,它可以幫助你把機器學習輕鬆應用到生產環境中。本文將會介紹對scikit-learn庫進行基本介紹,並擴展介紹相關常用機器學習資源。
  • python3使用ctypes在windows中訪問C和C++動態連結庫函數示例
    python3使用ctypes在windows中訪問C和C++動態連結庫函數示例這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫一 測試環境介紹和準備與做python擴展庫不同,ctypes調用的c++庫其實與python沒有代碼關聯,只是提供了開放公共標準。
  • 數據科學和機器學習的最佳Python庫
    數據科學和機器學習是該時代最需求的技術,這一需求促使每個人都學習不同的庫和軟體包以實現它們。這篇博客文章將重點介紹用於數據科學和機器學習的Python庫。這些是您掌握市場上最被炒作的兩項技能的庫。以下是此博客中將涉及的主題列表:數據科學與機器學習導論為什麼要使用Python進行數據科學和機器學習?
  • 常用python機器學習庫總結
    眾所周知現在人工智慧非常的火熱,機器學習也算是人工智慧中的一個領域,在其中有一塊是對文本進行分析,對數據進行深入的挖掘提取一些特徵值,然後用一些算法去學習,訓練,分析,甚至還能預測,我們就來看看python有哪些機器學習庫吧!1.
  • 機器學習最主流的算法庫sklearn
    「 scikit-learn,簡稱sklearn,是用Python語言開發的機器學習模塊庫,其包含大量的機器學習算法和測試數據集
  • 常用Python機器學習庫有哪些?
    也因為這個原因,很多同學開始了Python機器學習。Python機器學習庫有很多,接下來給大家介紹3個比較受大家歡迎的。1.NumPy當開始處理Python中的科學任務,Python的SciPyStack肯定可以提供幫助,它是專門為Python中科學計算而設計的軟體集合(不要混淆SciPy庫,它是SciPyStack的一部分,和SciPyStack的社區)這樣我們開始來看一下吧。
  • 2020年六大機器學習Python庫!
    外頭有許多類型的python庫可用,本文介紹了一些流行的機器學習庫。1. NumPy:NumPy是一種通用的數組處理軟體包。它提供高性能的多維數組對象和用於處理這些數組的工具。它是用於科學計算的基本Python軟體包。
  • 使用SWIG封裝C++為python庫
    最近的工程使用了一個新方式:新方式怎麼做:第一步生產wrapper文件:`/usr/bin/swig3.0 -c++ -python -I../common -o swsscommon_wrap.cpp swsscommon.i` `-I..
  • 大數據機器學習庫spark mllib基礎及應用案例
    機器學習技術是人工智慧時代非常重要的技術手段,在多領域都有廣泛的運用,比如工業過程控制、信息安全、生物信息學、計算金融學等。目前,機器學習已經有了十分廣泛的應用,如數據挖掘、計算機視覺、自然語言處理、生物特徵是吧、搜尋引擎、醫學診斷等。而spark mllib是機器學習領域中非常著名的一個機器學習庫,是Apache Spark中的組件之一,專注於機器學習。
  • Python語言下的機器學習庫
    這篇文章的目的就是列舉並描述Python可用的最有用的機器學習工具和庫。這個列表中,我們不要求這些庫是用Python寫的,只要有Python接口就夠了。我們在最後也有一小節關於深度學習(Deep Learning)的內容,因為它最近也吸引了相當多的關注。
  • sklearn:Python語言開發的通用機器學習庫
    小編說:深入理解機器學習並完全看懂sklearn文檔,需要較深厚的理論基礎。但是,要將sklearn應用於實際的項目中,只需要對機器學習理論有一個基本的掌握,就可以直接調用其API來完成各種機器學習問題。本文選自《全棧數據之門》,將向你介紹通過三個步驟來解決具體的機器學習問題。
  • Python 機器學習庫 Top 10,你值得擁有!
    Python 在眾多開發者中如此受追捧的原因之一便是其擁有大量的與機器學習相關的開源框架以及工具庫,本文介紹了其中最受歡迎的10大Python庫。;而又因為大量的機器學習工具庫的出現,使得 Python 在機器學習領域變得如此流行。
  • 25個Java機器學習工具&庫
    本列表總結了25個Java機器學習工具&庫:1. Weka集成了數據挖掘工作的機器學習算法。
  • Oracle 開源 Java 機器學習庫 Tribuo
    近日,Oracle 開源了一個用 Java 編寫的機器學習庫,名為 Tribuo。