Machine Learning with JavaScript : Part 1
译者: Fundebug
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习使用 JavaScript 做机器学习?不是应该用 Python 吗?是不是我疯了才用 JavaScript 做如此繁重的计算?难道我不用 Python 和 R 是为了装逼? scikit-learn (Python 机器学习库) 不能使用 Python 吧?
嗯,我并没有开玩笑…
其实呢,类似于 Python 的 scikit-learn ,JavaScript 开发者也开发了一些机器学习库,我打算用一下它们。
我们将使用 mljs 来实现线性回归,源代码在 GitHub 仓库: machine-learning-with-js 。下面是详细步骤:
- $ yarn add ml - regression csvtojson
或者使用 npm
- $ npm install ml - regression csvtojson
下载 .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();
- });
导入的数据为 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 实现各种机器学习算法。
来源: http://www.open-open.com/lib/view/open1499046102113.html