作者|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/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:
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.com/blog/2020/05/introduction-machine-learning-libraries-c/
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2253.html
標籤:其他
