C++機(jī)器學(xué)習(xí)庫介紹

介紹

我喜歡使用C++。C++是我學(xué)習(xí)過的第一種編程語言,我喜歡在機(jī)器學(xué)習(xí)中使用它。

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

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

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

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

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

編譯需要鏈接到以下庫:

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

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

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

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

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

長(zhǎng)按掃碼 閱讀全文