为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript机器学习之线性回归

标签:
AngularJS


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

原文: Machine Learning with JavaScript : Part 1

译者: Fundebug

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

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

嗯,我并没有开玩笑...

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

JavaScript不能用于机器学习?

太慢(幻觉?)

矩阵操作太难(有函数库啊,比如math.js)

JavaScript只能用于前端开发(Node.js开发者笑了)

机器学习库都是Python(JS开发者)

JavaScript机器学习库

brain.js (神经网络)

Synaptic (神经网络)

Natural (自然语言处理)

ConvNetJS (卷积神经网络)

mljs (一系列AI库)

Neataptic (神经网络)

Webdnn (深度学习)

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

1. 安装模块

$ yarn add ml-regression csvtojson

或者使用 npm

$ npm install ml-regression csvtojson

ml-regression模块提供了一些回归算法

csvtojson模块用于将CSV数据转换为JSON。

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

}

4. 训练数据并预测

编写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

});

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、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

JavaScript机器学习之线性回归

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

©著作权归作者所有:来自51CTO博客作者Fundebug的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消