JavaScript机器学习之线性回归

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

原文: Machine Learning with JavaScript : Part 1html

译者: Fundebug前端

为了保证可读性,本文采用意译而非直译。另外,本文版权归原做者全部,翻译仅用于学习。java

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

嗯,我并无开玩笑...git

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

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。下面是详细步骤:web

1. 安装模块

$ yarn add ml-regression csvtojson复制代码

或者使用 npm算法

$ npm install ml-regression csvtojson复制代码

2. 初始化并导入数据

下载.csv数据npm

假设你已经初始化了一个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全栈BUG监控交流群: 622902485




版权声明:
转载时请注明做者Fundebug以及本文地址:
blog.fundebug.com/2017/07/03/…

相关文章
相关标签/搜索