译者按: 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/