译者按: 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以及本文地址:
blog.fundebug.com/2017/07/03/…