摘要:不能用于機(jī)器學(xué)習(xí)太慢幻覺矩陣操作太難有函數(shù)庫啊,比如只能用于前端開發(fā)開發(fā)者笑了機(jī)器學(xué)習(xí)庫都是開發(fā)者機(jī)器學(xué)習(xí)庫神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)自然語言處理卷積神經(jīng)網(wǎng)絡(luò)一系列庫神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)我們將使用來實現(xiàn)線性回歸,源代碼在倉庫。
譯者按: AI時代,不會機(jī)器學(xué)習(xí)的JavaScript開發(fā)者不是好的前端工程師。
原文: Machine Learning with JavaScript : Part 1
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
使用JavaScript做機(jī)器學(xué)習(xí)?不是應(yīng)該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計算?難道我不用Python和R是為了裝逼?scikit-learn(Python機(jī)器學(xué)習(xí)庫)不能使用Python吧?
嗯,我并沒有開玩笑...
其實呢,類似于Python的scikit-learn,JavaScript開發(fā)者也開發(fā)了一些機(jī)器學(xué)習(xí)庫,我打算用一下它們。
JavaScript不能用于機(jī)器學(xué)習(xí)?太慢(幻覺?)
矩陣操作太難(有函數(shù)庫啊,比如math.js)
JavaScript只能用于前端開發(fā)(Node.js開發(fā)者笑了)
機(jī)器學(xué)習(xí)庫都是Python(JS開發(fā)者)
JavaScript機(jī)器學(xué)習(xí)庫brain.js (神經(jīng)網(wǎng)絡(luò))
Synaptic (神經(jīng)網(wǎng)絡(luò))
Natural (自然語言處理)
ConvNetJS (卷積神經(jīng)網(wǎng)絡(luò))
mljs (一系列AI庫)
Neataptic (神經(jīng)網(wǎng)絡(luò))
Webdnn (深度學(xué)習(xí))
我們將使用mljs來實現(xiàn)線性回歸,源代碼在GitHub倉庫: machine-learning-with-js。下面是詳細(xì)步驟:
1. 安裝模塊$ yarn add ml-regression csvtojson
或者使用 npm
$ npm install ml-regression csvtojson
ml-regression模塊提供了一些回歸算法
csvtojson模塊用于將CSV數(shù)據(jù)轉(zhuǎn)換為JSON。
2. 初始化并導(dǎo)入數(shù)據(jù)下載.csv數(shù)據(jù)。
假設(shè)你已經(jīng)初始化了一個NPM項目,請在index.js中輸入以下內(nèi)容:
const ml = require("ml-regression"); const csv = require("csvtojson"); const SLR = ml.SLR; // 線性回歸 const csvFilePath = "advertising.csv"; // 訓(xùn)練數(shù)據(jù) let csvData = [], X = [], y = []; let regressionModel;
使用csvtojson模塊的fromFile方法加載數(shù)據(jù):
csv() .fromFile(csvFilePath) .on("json", (jsonObj) => { csvData.push(jsonObj); }) .on("done", () => { dressData(); performRegression(); });3. 轉(zhuǎn)換數(shù)據(jù)
導(dǎo)入的數(shù)據(jù)為json對象數(shù)組,我們需要使用dressData函數(shù)將其轉(zhuǎn)化為兩個數(shù)據(jù)向量x和y:
// 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù) function dressData() { /** * 原始數(shù)據(jù)中每一行為JSON對象 * 因此需要將數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù),并將字符串解析為浮點(diǎn)數(shù) * { * TV: "10", * Radio: "100", * Newspaper: "20", * "Sales": "1000" * } */ csvData.forEach((row) => { X.push(f(row.Radio)); y.push(f(row.Sales)); }); } // 將字符串解析為浮點(diǎn)數(shù) function f(s) { return parseFloat(s); }4. 訓(xùn)練數(shù)據(jù)并預(yù)測
編寫performRegression函數(shù):
// 使用線性回歸算法訓(xùn)練數(shù)據(jù) function performRegression() { regressionModel = new SLR(X, y); console.log(regressionModel.toString(3)); predictOutput(); }
regressionModel的toString方法可以指定參數(shù)的精確度。
predictOutput函數(shù)可以根據(jù)輸入值輸出預(yù)測值。
// 接收輸入數(shù)據(jù),然后輸出預(yù)測值 function predictOutput() { rl.question("請輸入X用于預(yù)測(輸入CTRL+C退出) : ", (answer) => { console.log(`當(dāng)X = ${answer}時, 預(yù)測值y = ${regressionModel.predict(parseFloat(answer))}`); predictOutput(); }); }
predictOutput函數(shù)使用了Node.js的Readline模塊:
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout });5. 完整程序
完整的程序index.js是這樣的:
const ml = require("ml-regression"); const csv = require("csvtojson"); const SLR = ml.SLR; // 線性回歸 const csvFilePath = "advertising.csv"; // 訓(xùn)練數(shù)據(jù) let csvData = [], X = [], y = []; let regressionModel; const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); csv() .fromFile(csvFilePath) .on("json", (jsonObj) => { csvData.push(jsonObj); }) .on("done", () => { dressData(); performRegression(); }); // 使用線性回歸算法訓(xùn)練數(shù)據(jù) function performRegression() { regressionModel = new SLR(X, y); console.log(regressionModel.toString(3)); predictOutput(); } // 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù) function dressData() { /** * 原始數(shù)據(jù)中每一行為JSON對象 * 因此需要將數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù),并將字符串解析為浮點(diǎn)數(shù) * { * TV: "10", * Radio: "100", * Newspaper: "20", * "Sales": "1000" * } */ csvData.forEach((row) => { X.push(f(row.Radio)); y.push(f(row.Sales)); }); } // 將字符串解析為浮點(diǎn)數(shù) function f(s) { return parseFloat(s); } // 接收輸入數(shù)據(jù),然后輸出預(yù)測值 function predictOutput() { rl.question("請輸入X用于預(yù)測(輸入CTRL+C退出) : ", (answer) => { console.log(`當(dāng)X = ${answer}時, 預(yù)測值y = ${regressionModel.predict(parseFloat(answer))}`); predictOutput(); }); }
執(zhí)行 node index.js ,則輸出如下:
$ node index.js
f(x) = 0.202 * x + 9.31 請輸入X用于預(yù)測(輸入CTRL+C退出) : 151.5 當(dāng)X = 151.5時, 預(yù)測值y = 39.98974927911285 請輸入X用于預(yù)測(輸入CTRL+C退出) :
恭喜!你已經(jīng)使用JavaScript訓(xùn)練了一個線性回歸模型,如下:
f(x) = 0.202 * x + 9.31
感興趣的話,請持續(xù)關(guān)注 machine-learning-with-js,我將使用JavaScript實現(xiàn)各種機(jī)器學(xué)習(xí)算法。
歡迎加入我們Fundebug的全棧BUG監(jiān)控交流群: 622902485。
版權(quán)聲明:
轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87130.html
摘要:在統(tǒng)計學(xué)中,線性回歸是利用稱為線性回歸方程的最小二乘函數(shù)對一個或多個自變量和因變量之間關(guān)系進(jìn)行建模的一種回歸分析維基百科。對當(dāng)前示例作圖表示衡量線性回歸法的指標(biāo)誤差一個訓(xùn)練后的模型通常都會使用測試數(shù)據(jù)集測試該模型的準(zhǔn)確性。 在統(tǒng)計學(xué)中,線性回歸(Linear regression)是利用稱為線性回歸方程的最小二乘函數(shù)對一個或多個自變量和因變量之間關(guān)系進(jìn)行建模的一種回歸分析維基百科。 簡...
摘要:還提供了,將多項式特征數(shù)據(jù)歸一化和線性回歸組合在了一起,大大方便的編程的過程。在機(jī)器學(xué)習(xí)算法中,主要的挑戰(zhàn)來自方差,解決的方法主要有降低模型復(fù)雜度降維增加樣本數(shù)使用驗證集模型正則化。 多項式回歸 多項式回歸使用線性回歸的基本思路 非線性曲線如圖: showImg(https://segmentfault.com/img/bVbkn4q?w=372&h=252); 假設(shè)曲線表達(dá)式為:$y...
閱讀 2036·2021-10-09 09:41
閱讀 1609·2021-09-28 09:36
閱讀 1115·2021-09-26 09:55
閱讀 1303·2021-09-10 11:17
閱讀 1159·2021-09-02 09:56
閱讀 2772·2019-08-30 12:58
閱讀 2940·2019-08-29 13:03
閱讀 1867·2019-08-26 13:40