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