译者按: AI时期,不会机械进修的JavaScript开辟者不是好的前端工程师。
原文: Machine Learning with JavaScript : Part 1
译者: Fundebug
为了保证可读性,本文采纳意译而非直译。别的,本文版权归原作者一切,翻译仅用于进修。
运用JavaScript做机械进修?不是应该用Python吗?是否是我疯了才用JavaScript做云云沉重的盘算?岂非我不必Python和R是为了装逼?scikit-learn(Python机械进修库)不能运用Python吧?
嗯,我并没有开顽笑…
实在呢,类似于Python的scikit-learn,JavaScript开辟者也开辟了一些机械进修库,我盘算用一下它们。
JavaScript不能用于机械进修?
太慢(幻觉?)
矩阵操纵太难(有函数库啊,比方math.js)
JavaScript只能用于前端开辟(Node.js开辟者笑了)
机械进修库都是Python(JS开辟者)
JavaScript机械进修库
brain.js (神经网络)
Synaptic (神经网络)
Natural (自然语言处置惩罚)
ConvNetJS (卷积神经网络)
mljs (一系列AI库)
Neataptic (神经网络)
Webdnn (深度进修)
我们将运用mljs来完成线性回归,源代码在GitHub堆栈: machine-learning-with-js。下面是细致步骤:
1. 装置模块
$ yarn add ml-regression csvtojson
或许运用 npm
$ npm install ml-regression csvtojson
ml-regression模块供应了一些回归算法
csvtojson模块用于将CSV数据转换为JSON。
2. 初始化并导入数据
下载.csv数据。
假定你已初始化了一个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();
});
3. 转换数据
导入的数据为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);
}
4. 练习数据并展望
编写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
});
5. 完全顺序
完全的顺序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/