譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。javascript
原文: Machine Learning with JavaScript : Part 1html
譯者: Fundebug前端
爲了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原做者全部,翻譯僅用於學習java
使用JavaScript作機器學習?不是應該用Python嗎?是否是我瘋了才用JavaScript作如此繁重的計算?難道我不用Python和R是爲了裝逼?scikit-learn(Python機器學習庫)不能使用Python吧?node
嗯,我並無開玩笑...git
其實呢,相似於Python的scikit-learn,JavaScript開發者也開發了一些機器學習庫,我打算用一下它們。github
咱們將使用mljs來實現線性迴歸,源代碼在GitHub倉庫: machine-learning-with-js。下面是詳細步驟:web
$ yarn add ml-regression csvtojson
或者使用 npm
算法
$ npm install ml-regression csvtojson
下載.csv數據。npm
假設你已經初始化了一個NPM項目,請在index.js中輸入如下內容:
const ml = require("ml-regression"); const csv = require("csvtojson"); const SLR = ml.SLR; // 線性迴歸 const csvFilePath = "advertising.csv"; // 訓練數據 let csvData = [], X = [], y = []; let regressionModel;
使用csvtojson模塊的fromFile方法加載數據:
csv() .fromFile(csvFilePath) .on("json", (jsonObj) => { csvData.push(jsonObj); }) .on("done", () => { dressData(); performRegression(); });
導入的數據爲json對象數組,咱們須要使用dressData函數將其轉化爲兩個數據向量x和y:
// 將JSON數據轉換爲向量數據 function dressData() { /** * 原始數據中每一行爲JSON對象 * 所以須要將數據轉換爲向量數據,並將字符串解析爲浮點數 * { * TV: "10", * Radio: "100", * Newspaper: "20", * "Sales": "1000" * } */ csvData.forEach((row) => { X.push(f(row.Radio)); y.push(f(row.Sales)); }); } // 將字符串解析爲浮點數 function f(s) { return parseFloat(s); }
編寫performRegression函數:
// 使用線性迴歸算法訓練數據 function performRegression() { regressionModel = new SLR(X, y); console.log(regressionModel.toString(3)); predictOutput(); }
regressionModel的toString方法能夠指定參數的精確度。
predictOutput函數能夠根據輸入值輸出預測值。
// 接收輸入數據,而後輸出預測值 function predictOutput() { rl.question("請輸入X用於預測(輸入CTRL+C退出) : ", (answer) => { console.log(`當X = ${answer}時, 預測值y = ${regressionModel.predict(parseFloat(answer))}`); predictOutput(); }); }
predictOutput函數使用了Node.js的Readline模塊:
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
完整的程序index.js是這樣的:
const ml = require("ml-regression"); const csv = require("csvtojson"); const SLR = ml.SLR; // 線性迴歸 const csvFilePath = "advertising.csv"; // 訓練數據 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(); }); // 使用線性迴歸算法訓練數據 function performRegression() { regressionModel = new SLR(X, y); console.log(regressionModel.toString(3)); predictOutput(); } // 將JSON數據轉換爲向量數據 function dressData() { /** * 原始數據中每一行爲JSON對象 * 所以須要將數據轉換爲向量數據,並將字符串解析爲浮點數 * { * TV: "10", * Radio: "100", * Newspaper: "20", * "Sales": "1000" * } */ csvData.forEach((row) => { X.push(f(row.Radio)); y.push(f(row.Sales)); }); } // 將字符串解析爲浮點數 function f(s) { return parseFloat(s); } // 接收輸入數據,而後輸出預測值 function predictOutput() { rl.question("請輸入X用於預測(輸入CTRL+C退出) : ", (answer) => { console.log(`當X = ${answer}時, 預測值y = ${regressionModel.predict(parseFloat(answer))}`); predictOutput(); }); }
執行 node index.js
,則輸出以下:
$ node index.js
f(x) = 0.202 * x + 9.31 請輸入X用於預測(輸入CTRL+C退出) : 151.5 當X = 151.5時, 預測值y = 39.98974927911285 請輸入X用於預測(輸入CTRL+C退出) :
恭喜!你已經使用JavaScript訓練了一個線性迴歸模型,以下:
f(x) = 0.202 * x + 9.31
感興趣的話,請持續關注 machine-learning-with-js,我將使用JavaScript實現各類機器學習算法。
歡迎加入咱們Fundebug的全棧BUG監控交流羣: 622902485。
版權聲明:
轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/