C++機器學習庫介紹

介紹

我喜歡使用C++。C++是我學習過的第一種編程語言,我喜歡在機器學習中使用它。

我在之前寫過關(guān)于構(gòu)建機器學習模型的文章,我收到了一個回復,問我C++有沒有機器學習的庫?

這是個很好的問題。像Python和R這樣的語言有大量的包和庫來滿足不同的機器學習任務,那么C++有沒有這樣的產(chǎn)品呢?

是的!在本文中,我將重點介紹兩個這樣的C++庫,我們也將看到它們都是可以運行。目錄為什么我們要使用機器學習庫?C++中的機器學習庫SHARK 圖書館MLPACK庫為什么我們要使用機器學習庫?這是很多新來者都會遇到的問題,庫對于機器學習中的重要性是什么?讓我試著在這一節(jié)解釋一下。比如說,經(jīng)驗豐富的專業(yè)人士和行業(yè)老手已經(jīng)付出了艱辛的努力,并想出了解決問題的辦法。你更愿意使用它,還是愿意花幾個小時從頭開始重新創(chuàng)建相同的東西?后一種方法通常沒有什么意義,尤其是當你在DDL前的工作或?qū)W習。我們的機器學習社區(qū)最大的優(yōu)點是已經(jīng)有很多解決方案以庫和包的形式存在,其他一些人,從專家到愛好者,已經(jīng)做了艱苦的工作,并將解決方案很好地打包在一個庫中。這些機器學習庫是有效的和優(yōu)化的,它們經(jīng)過了多個用例的徹底測試。依靠這些庫,我們的學習能力和編寫代碼,無論是在C++或Python,都是如此的簡單和直觀。C++中的機器學習庫在本節(jié)中,我們將介紹C+中兩個最流行的機器學習庫:SHARK庫MLPACK庫讓我們逐一查看他們的介紹和C++代碼。1.SHARK庫Shark是一個快速的模塊庫,它對監(jiān)督學習算法(如線性回歸、神經(jīng)網(wǎng)絡(luò)、聚類、k-means等)提供了強大的支持,還包括線性代數(shù)和數(shù)值優(yōu)化的功能,這些是在執(zhí)行機器學習任務時非常重要的關(guān)鍵數(shù)學函數(shù)。我們將首先了解如何安裝Shark并設(shè)置環(huán)境,然后我們將用Shark實現(xiàn)線性回歸。安裝Shark和安裝環(huán)境(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如果你沒見到錯誤,那就沒問題了。如果你遇到麻煩,網(wǎng)上有很多解決信息。對于Windows和其他操作系統(tǒng),你可以在Google上快速搜索如何安裝Shark。這有一份安裝指南:http://www.shark-ml.org/sphinx_pages/build/html/rest_sources/tutorials/tutorials.html使用Shark編譯程序

包括相關(guān)的頭文件。假設(shè)我們要實現(xiàn)線性回歸,那么額外的頭文件包括:

#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h>#include <shark/Algorithms/Trainers/LinearRegression.h>

編譯需要鏈接到以下庫:

-std=c++11 -lboost_serialization -lshark -lcblas

用Shark實現(xiàn)線性回歸初始化階段我們將從包含線性回歸的庫和頭函數(shù)開始:#include <bits/stdc++.h> //所有c++標準庫的頭文件#include <shark/Data/Csv.h> //導入csv數(shù)據(jù)的頭文件#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h> //用于實現(xiàn)平方損失函數(shù)的頭文件#include <shark/Algorithms/Trainers/LinearRegression.h>// 實現(xiàn)線性回歸的頭文件接下來是數(shù)據(jù)集。我已經(jīng)創(chuàng)建了兩個CSV文件。這個input.csv文件包含x值、label.csv文件包含y值。以下是數(shù)據(jù)的快照:

你可以在github倉庫得到這2個文件:https://github.com/Alakhator/Machine-Learning-With-C-。首先,我們將制作用于存儲CSV文件中數(shù)據(jù)的數(shù)據(jù)容器:Data<RealVector> inputs; //存儲x值的容器Data<RealVector> labels; //存儲y值的容器接下來,我們需要導入它們。Shark提供了一個很好的導入CSV函數(shù),我們指定了要初始化的數(shù)據(jù)容器,以及CSV的路徑文件的位置:importCSV(inputs, "input.csv"); // 通過指定csv的路徑將值存儲在特定的容器中importCSV(labels, "label.csv");然后,我們需要實例化一個回歸數(shù)據(jù)集類型。目前這只是一個一般的回歸對象,我們在構(gòu)造函數(shù)中要做的是傳遞我們的輸入以及數(shù)據(jù)的標簽。接下來,我們需要訓練線性回歸模型。我們怎么做呢?我們需要實例化一個訓練器,并定義一個線性模型:RegressionDataset data(inputs, labels);LinearRegression trainer;// 線性回歸模型訓練器LinearModel<> model; // 線性模型訓練階段接下來是我們實際訓練模型的關(guān)鍵步驟。在這里,trainer有一個名為train的成員函數(shù),我們用函數(shù)訓練這個模型//訓練模型trainer.train(model, data);// train function ro training the model.預測階段最后,輸出模型參數(shù):// 顯示模型參數(shù)cout << "intercept: " << model.offset() << endl;cout << "matrix: " << model.matrix() << endl;線性模型有一個名為offset的成員函數(shù),輸出最佳擬合線的截距。接下來,我們輸出一個矩陣。我們通過最小化最小平方來計算最佳擬合,也就是最小化平方損失。幸運的是,模型允許我們輸出這些信息。Shark庫非常有助于說明模型的適用性:SquaredLoss<> loss; //初始化square loss對象Data<RealVector> prediction = model(data.inputs()); //根據(jù)數(shù)據(jù)輸入預測cout << "squared loss: " << loss(data.labels(), prediction) << endl; // 最后我們計算損失首先,我們需要初始化一個平方損失對象,然后我們需要實例化一個數(shù)據(jù)容器,接下來根據(jù)系統(tǒng)的輸入計算預測,最后我們只需通過傳遞標簽和預測值來計算輸出損失。接下來,我們需要編譯。在終端中,鍵入以下命令(確保正確設(shè)置了目錄):g++ -o lr linear_regression.cpp -std=c++11 -lboost_serialization -lshark -lcblas一旦編譯,它就會創(chuàng)建一個lr對象?,F(xiàn)在只需運行程序。我們得到的結(jié)果是:b : [1](-0.749091)A :[1,1]((2.00731))Loss: 7.83109b的值離0有點遠,這是因為標簽中存在噪聲。乘數(shù)的值接近于2,與數(shù)據(jù)非常相似。這就是使用c++中的Shark庫來構(gòu)建線性回歸模型的過程!2.MLPACK C++庫mlpack是一個用c++編寫的快速靈活的機器學習庫。它的目標是提供快速和可擴展的機器學習算法的實現(xiàn)。mlpack可以將這些算法作為簡單的命令行程序、或綁定Python、Julia和c++,然后可以將這些類集成到更大規(guī)模的機器學習解決方案中。我們將首先了解如何安裝mlpack和環(huán)境,然后我們將使用mlpack實現(xiàn)k-means算法。安裝mlpack和安裝環(huán)境(Linux)mlpack依賴于以下庫,這些庫需要安裝在系統(tǒng)上: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現(xiàn)在所有依賴項都已安裝在系統(tǒng)中了,可以直接運行以下命令來生成和安裝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系統(tǒng)上,mlpack默認安裝為/usr/local/lib,你可能需要設(shè)置LD_LIBRARY_PATH環(huán)境變量:export LD_LIBRARY_PATH=/usr/local/lib上面的說明是獲取、構(gòu)建和安裝mlpack的最簡單方法。用mlpack編譯程序在你的程序中設(shè)置相關(guān)的頭文件(實現(xiàn)k-means):#include <mlpack/methods/kmeans/kmeans.hpp>#include <armadillo>編譯需要鏈接以下庫:std=c++11 -larmadillo -lmlpack -lboost_serialization用mlpack實現(xiàn)K-MeansK-means是一個基于質(zhì)心的算法,在這里我們通過計算距離來將一個點分配給一個簇。在K-Means中,每個簇都與一個質(zhì)心相關(guān)聯(lián)。K-Means算法的主要目標是最小化點與它們各自的簇質(zhì)心之間的距離之和。K-means是一個有效的迭代過程,我們希望將數(shù)據(jù)分割成特定的簇。首先,我們指定一些初始質(zhì)心,這些質(zhì)心是完全隨機的;接下來,對于每個數(shù)據(jù)點,我們找到最近的質(zhì)心;然后我們將數(shù)據(jù)點指定給那個質(zhì)心。所以每個質(zhì)心代表一個類,一旦我們把所有的數(shù)據(jù)點分配給每個質(zhì)心,我們就會計算出這些質(zhì)心的平均值。這里,我們將使用C++中的MLPACK庫來實現(xiàn)k-均值。初始化階段我們將首先導入k-means的庫和頭函數(shù):#include <bits/stdc++.h>#include <mlpack/methods/kmeans/kmeans.hpp>#include <armadillo>Using namespace std;接下來,我們將創(chuàng)建一些基本變量來設(shè)置簇的數(shù)量、數(shù)據(jù)的維度、樣本的數(shù)量以及我們要執(zhí)行的最大迭代次數(shù),因為K-均值是一個迭代過程。#include <bits/stdc++.h>#include <mlpack/methods/kmeans/kmeans.hpp>#include <armadillo>Using namespace std;接下來,我們將創(chuàng)建數(shù)據(jù)。這是我們第一次使用Armadillo庫,我們將創(chuàng)建一個映射類,它實際上是一個數(shù)據(jù)容器:arma::mat data(dim, samples, arma::fill::zeros);這個mat類,我們給它2維,50個樣本,它初始化所有這些數(shù)據(jù)值為0。接下來,我們將向這個數(shù)據(jù)類分配一些隨機數(shù)據(jù),然后在其上有效地運行K-means。將在位置[1 1]周圍創(chuàng)建25個點,我們可以說每個數(shù)據(jù)點是[1 1]或者在X = 1,y = 1的位置,然后我們要為這25個數(shù)據(jù)點中的每一個加一些隨機噪聲。// 創(chuàng)建數(shù)據(jù) 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,然后我們要添加一定數(shù)量的維度為2的隨機噪聲,最后我們對點x=2,y=3做同樣的操作。我們的數(shù)據(jù)已經(jīng)準備好了!是時候進入訓練階段了。訓練階段首先,我們實例化一個arma mat行類型來保存簇,然后實例化一個arma mat來保存質(zhì)心://對數(shù)據(jù)進行聚類arma::Row<size_t> clusters;arma::mat centroids;現(xiàn)在,我們需要實例化K-means類:mlpack::kmeans::KMeans<> mlpack_kmeans(max_iter);我們實例化了K-means類,并指定了傳遞給構(gòu)造函數(shù)的最大迭代次數(shù)?,F(xiàn)在,我們可以進行聚類了。我們將調(diào)用這個K-means類的Cluster成員函數(shù)。我們需要傳入數(shù)據(jù)、簇的數(shù)量,然后還要傳入簇對象和質(zhì)心對象。mlpack_kmeans.Cluster(data, k, clusters, centroids);現(xiàn)在,這個Cluster函數(shù)將使用指定數(shù)量的簇對這個數(shù)據(jù)運行K-means生成結(jié)果我們可以使用centroids.print函數(shù)簡單地顯示結(jié)果,這將給出質(zhì)心的位置:centroids.print("Centroids:");接下來,我們需要編譯。在終端中,鍵入以下命令(再次確認目錄設(shè)置正確):g++ k_means.cpp -o kmeans_test -O3 -std=c++11 -larmadillo -lmlpack -lboost_serialization && ./kmeans_test一旦編譯,它就會創(chuàng)建一個kmeans對象。現(xiàn)在只需運行程序。我們得到的結(jié)果是:Centroids:0.9497 1.96250.9689 3.0652結(jié)尾在本文中,我們看到了兩個流行的機器學習庫,它們幫助我們在c++中實現(xiàn)機器學習模型。參考鏈接:https://www.a(chǎn)nalyticsvidhya.com/blog/2020/05/introduction-machine-learning-libraries-c/

(免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關(guān)資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責任。
任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )

贊助商
2020-08-20
C++機器學習庫介紹
介紹我喜歡使用C++。C++是我學習過的第一種編程語言,我喜歡在機器學習中使用它。我在之前寫過關(guān)于構(gòu)建機器學習模型的文章,我收到了一個回復,問我C++有沒有機器學習的庫?這是個很好的問題。

長按掃碼 閱讀全文