JavaScript机器学习之线性回归

译者按: AI 时代,不会机器学习的 JavaScript 开发者不是好的前端工程师。

原文: Machine Learning with JavaScript : Part 1

译者: Fundebug

本文采用意译,版权归原作者所有

使用 JavaScript 做机器学习?不是应该用 Python 吗?是不是我疯了才用 JavaScript 做如此繁重的计算?难道我不用 Python 和 R 是为了装逼?scikit-learn(Python 机器学习库)不能使用 Python 吧?

嗯,我并没有开玩笑…

其实呢,类似于 Python 的scikit-learn,JavaScript 开发者也开发了一些机器学习库,我打算用一下它们。

JavaScript 不能用于机器学习?

  1. 太慢(幻觉?)
  2. 矩阵操作太难(有函数库啊,比如math.js
  3. JavaScript 只能用于前端开发(Node.js 开发者笑了)
  4. 机器学习库都是 Python(JS 开发者)

JavaScript 机器学习库

  1. brain.js (神经网络)
  2. Synaptic (神经网络)
  3. Natural (自然语言处理)
  4. ConvNetJS (卷积神经网络)
  5. mljs (一系列 AI 库)
  6. Neataptic (神经网络)
  7. Webdnn (深度学习)

我们将使用mljs来实现线性回归,源代码在 GitHub 仓库: machine-learning-with-js。下面是详细步骤:

1. 安装模块

$ yarn add ml-regression csvtojson

或者使用 npm

$ npm install ml-regression csvtojson

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函数将其转化为两个数据向量xy:

// 将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();
}

regressionModeltoString方法可以指定参数的精确度。

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

Fundebug专注于JavaScript、微信小程序、支付宝小程序线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了80亿+错误事件。欢迎大家免费试用

版权声明

转载时请注明作者 Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

您的用户遇到BUG了吗?

体验Demo 免费使用