原文:Machine Learning with JavaScript : Part 1
作者:Abhishek Soni
译者:聂震坤
审校:苏宓
你曾经认为它很难
JAVASCRIPT?为什么不用 Python?用 JavaScript 来进行这些大量运算难道不是疯了吗?使用 Python 或者 R 语言来表达不会更酷吗?Scikit-learning 甚至不能再 JavaScript 环境中工作。笔者回答:不,我是认真的!
回应上述疑问:这是可能的,事实上我对开发人员没有给它应有的关注而感到惊讶。就 scikit-learning 来讲,JS 开发者已经制作了自己的库来使用它。
根据 Arthur Samuel 的话,机器学习给了计算机自主学习的能力。换句话说,不需要提供给计算机应对每一种方案的对策,让计算机自己学习应对。而 Google 研发重点从移动设备转移到人工智能已经很久了。
为什么 JavaScript 从未跟机器学习一起提到
- 慢
- 矩阵操作很困难
- 重点在网页研发
- 人工智能的库通常是以 Python 开发
下面有一些自带机器学习算法的非常实用的 JavaScript 库:
- Brain.js(神经网络)
- Synaptic(神经网络)
- Natural(自然语言处理)
- ConvNetJS(卷积神经网络)
- Mljs(很多小的库和一些使用的方法)
- Neataptic(神经网络)
- Webdnm(深度学习)
本文将用 mljs 的回归库来执行一些线性回归算数
第一步:安装库
$ yarn add ml-regression csvtojson
如果你喜欢用 npm
$ npm install ml-regression csvtojson
ml-regression
的意思顾名思义
csvtojson
是一个快速的 csv 转换器,可以让 csv
数据快速转换成 JSON
。
第二步:安装库,载入数据
下载数据文件(.csv)并把它放入项目中。
假设已经有一个空的 npm 项目,打开 index.js
文件并输入下文。
const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // Simple Linear Regression
const csvFilePath = 'advertising.csv'; // Data
let csvData = [], // parsed Data
X = [], // Input
y = []; // Output
let regressionModel;
我将文件放到项目的根目录,如果你想把他放在别的地方,确保更改 csvFilePath
的路径。
很整洁,对吧?下一步我们将使用 fromFile 方法来载入数据。
csv()
.fromFile(csvFilePath)
.on('json', (jsonObj) => {
csvData.push(jsonObj);
})
.on('done', () => {
dressData(); // To get data points from JSON Objects
performRegression();
});
第三步:包装数据以便执行
保存在 csvData 的 JASON 对象需要输入点数列和输出点数列。我们将通过 dressData 方法来运行我们的数据以获得我们的 X 与 Y 变量。
function dressData() {
/**
* One row of the data object looks like:
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*
* Hence, while adding the data points,
* we need to parse the String value as a Float.
*/
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); // Train the model on training data
console.log(regressionModel.toString(3));
predictOutput();
}
RegressionModel 有一个 toString 方法将精度参数以浮点输出。
PredicOutput 方法允许你输入一个值,并将预测值输出到控制台。
代码如下:(请注意我使用了 Node.js 的 readline)
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}
读取用户输入的代码:
const readline = require('readline'); // For user prompt to allow predictions
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; // Simple Linear Regression
const csvFilePath = 'advertising.csv'; // Data
let csvData = [], // parsed Data
X = [], // Input
y = []; // Output
let regressionModel;
const readline = require('readline'); // For user prompt to allow predictions
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
csv()
.fromFile(csvFilePath)
.on('json', (jsonObj) => {
csvData.push(jsonObj);
})
.on('done', () => {
dressData(); // To get data points from JSON Objects
performRegression();
});
function performRegression() {
regressionModel = new SLR(X, y); // Train the model on training data
console.log(regressionModel.toString(3));
predictOutput();
}
function dressData() {
/**
* One row of the data object looks like:
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*
* Hence, while adding the data points,
* we need to parse the String value as a Float.
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
function f(s) {
return parseFloat(s);
}
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}
在控制台运行 node index.js,他的输出应该如此:
$ node index.js
f(x) = 0.202 * x + 9.31
Enter input X for prediction (Press CTRL+C to exit) : 151.5
At X = 151.5, y = 39.98974927911285
Enter input X for prediction (Press CTRL+C to exit) :
恭喜你,你已经使用 JavaScript 训练了你的第一个线性回归模型!(你注意到他的速度了吗?)
更多内容可参考:使用 JavaScript 实现机器学习(二)