摘要:不能用于機(jī)器學(xué)習(xí)太慢幻覺(jué)矩陣操作太難有函數(shù)庫(kù)啊,比如只能用于前端開(kāi)發(fā)開(kāi)發(fā)者笑了機(jī)器學(xué)習(xí)庫(kù)都是開(kāi)發(fā)者機(jī)器學(xué)習(xí)庫(kù)神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)自然語(yǔ)言處理卷積神經(jīng)網(wǎng)絡(luò)一系列庫(kù)神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)我們將使用來(lái)實(shí)現(xiàn)線性回歸,源代碼在倉(cāng)庫(kù)。
譯者按: AI時(shí)代,不會(huì)機(jī)器學(xué)習(xí)的JavaScript開(kāi)發(fā)者不是好的前端工程師。
原文: Machine Learning with JavaScript : Part 1
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
使用JavaScript做機(jī)器學(xué)習(xí)?不是應(yīng)該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計(jì)算?難道我不用Python和R是為了裝逼?scikit-learn(Python機(jī)器學(xué)習(xí)庫(kù))不能使用Python吧?
嗯,我并沒(méi)有開(kāi)玩笑...
其實(shí)呢,類(lèi)似于Python的scikit-learn,JavaScript開(kāi)發(fā)者也開(kāi)發(fā)了一些機(jī)器學(xué)習(xí)庫(kù),我打算用一下它們。
JavaScript不能用于機(jī)器學(xué)習(xí)?太慢(幻覺(jué)?)
矩陣操作太難(有函數(shù)庫(kù)啊,比如math.js)
JavaScript只能用于前端開(kāi)發(fā)(Node.js開(kāi)發(fā)者笑了)
機(jī)器學(xué)習(xí)庫(kù)都是Python(JS開(kāi)發(fā)者)
JavaScript機(jī)器學(xué)習(xí)庫(kù)brain.js (神經(jīng)網(wǎng)絡(luò))
Synaptic (神經(jīng)網(wǎng)絡(luò))
Natural (自然語(yǔ)言處理)
ConvNetJS (卷積神經(jīng)網(wǎng)絡(luò))
mljs (一系列AI庫(kù))
Neataptic (神經(jīng)網(wǎng)絡(luò))
Webdnn (深度學(xué)習(xí))
我們將使用mljs來(lái)實(shí)現(xiàn)線性回歸,源代碼在GitHub倉(cāng)庫(kù): 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)初始化了一個(gè)NPM項(xiàng)目,請(qǐng)?jiān)?strong>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對(duì)象數(shù)組,我們需要使用dressData函數(shù)將其轉(zhuǎn)化為兩個(gè)數(shù)據(jù)向量x和y:
// 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù) function dressData() { /** * 原始數(shù)據(jù)中每一行為JSON對(duì)象 * 因此需要將數(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ù)測(cè)
編寫(xiě)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ù)測(cè)值。
// 接收輸入數(shù)據(jù),然后輸出預(yù)測(cè)值 function predictOutput() { rl.question("請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : ", (answer) => { console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測(cè)值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對(duì)象 * 因此需要將數(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ù)測(cè)值 function predictOutput() { rl.question("請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : ", (answer) => { console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測(cè)值y = ${regressionModel.predict(parseFloat(answer))}`); predictOutput(); }); }
執(zhí)行 node index.js ,則輸出如下:
$ node index.js
f(x) = 0.202 * x + 9.31 請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : 151.5 當(dāng)X = 151.5時(shí), 預(yù)測(cè)值y = 39.98974927911285 請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) :
恭喜!你已經(jīng)使用JavaScript訓(xùn)練了一個(gè)線性回歸模型,如下:
f(x) = 0.202 * x + 9.31
感興趣的話,請(qǐng)持續(xù)關(guān)注 machine-learning-with-js,我將使用JavaScript實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法。
歡迎加入我們Fundebug的全棧BUG監(jiān)控交流群: 622902485。
版權(quán)聲明:
轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87130.html
摘要:在統(tǒng)計(jì)學(xué)中,線性回歸是利用稱(chēng)為線性回歸方程的最小二乘函數(shù)對(duì)一個(gè)或多個(gè)自變量和因變量之間關(guān)系進(jìn)行建模的一種回歸分析維基百科。對(duì)當(dāng)前示例作圖表示衡量線性回歸法的指標(biāo)誤差一個(gè)訓(xùn)練后的模型通常都會(huì)使用測(cè)試數(shù)據(jù)集測(cè)試該模型的準(zhǔn)確性。 在統(tǒng)計(jì)學(xué)中,線性回歸(Linear regression)是利用稱(chēng)為線性回歸方程的最小二乘函數(shù)對(duì)一個(gè)或多個(gè)自變量和因變量之間關(guān)系進(jìn)行建模的一種回歸分析維基百科。 簡(jiǎn)...
摘要:還提供了,將多項(xiàng)式特征數(shù)據(jù)歸一化和線性回歸組合在了一起,大大方便的編程的過(guò)程。在機(jī)器學(xué)習(xí)算法中,主要的挑戰(zhàn)來(lái)自方差,解決的方法主要有降低模型復(fù)雜度降維增加樣本數(shù)使用驗(yàn)證集模型正則化。 多項(xiàng)式回歸 多項(xiàng)式回歸使用線性回歸的基本思路 非線性曲線如圖: showImg(https://segmentfault.com/img/bVbkn4q?w=372&h=252); 假設(shè)曲線表達(dá)式為:$y...
閱讀 2090·2021-10-09 09:41
閱讀 1670·2021-09-28 09:36
閱讀 1186·2021-09-26 09:55
閱讀 1367·2021-09-10 11:17
閱讀 1222·2021-09-02 09:56
閱讀 2827·2019-08-30 12:58
閱讀 2988·2019-08-29 13:03
閱讀 1917·2019-08-26 13:40