专栏首页FundebugJavaScript机器学习之线性回归

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以及本文地址: https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript大师必须掌握的12个知识点

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

    Fundebug
  • JavaScript一团乱,这是好事

    JavaScript 从不移除旧的特性,新版本总是向后兼容。我希望我们能够把那些重复的旧的特性清理一下,但是保持兼容有太多的好处。我在本文会解释。

    Fundebug
  • 2018年你需要知道的13个JavaScript工具库

    译者按: 你可能已经用到Underscore或者Lodash。本文列举了13个常用的JavaScript工具库来提高开发效率。

    Fundebug
  • 新型技术利用 UPnP 协议避免 DDoS 缓解方案

    据外媒 15 日报道,美国知名网络安全公司 Imperva 于本周一发布报告称攻击者正在尝试使用 UPnP协议来屏蔽 DDoS 泛洪期间发送的网络数据包源端口,...

    周俊辉
  • 图片上传的第二种形式

    之前有说了一种以base64的图片上传形式,这次来说说另外一种,其实很简单,很早以前都是在form提交的时候再controller中处理,现在基本不会这么做,都...

    风间影月
  • 开发者必备的12个JavaScript库

    现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计。为了方便大家发挥自己的创...

    李海彬
  • 【FB TV】一周「BUF大事件」李彦宏语出惊人,道出国内隐私安全现状;WannaCry勒索病毒卷土重来

    本周BUF大事件还是为大家带来了新鲜有趣的安全新闻,百度CEO李彦宏语出惊人,道出国内隐私安全现状;WannaCry勒索病毒卷土重来,波音工厂中招;iOS 11...

    FB客服
  • 2018热度上升最快的编程工具是什么?TensorFlow只排第11

    排名依据是Stack Overflow的问题数据。今年,平均每天有超过6,000条新问题发布。

    量子位
  • 使用node小技巧之通过监管员supervisor工具实现热更新

    当你通过Node.js来创建HTTP服务并运行后,由于Node.js只有在第一次引用时才会解析你的脚本,以后的访问均是在内存当中进行的,所以当你不管修改了代码的...

    用户1272076
  • 命令行启动Angular应用

    Your global Angular CLI version (7.3.3) is greater than your local version (7.3...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券