作者|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/