资讯专栏INFORMATION COLUMN

JavaScript机器学习之线性回归

gitmilk / 2424人阅读

摘要:不能用于机器学习太慢幻觉矩阵操作太难有函数库啊,比如只能用于前端开发开发者笑了机器学习库都是开发者机器学习库神经网络神经网络自然语言处理卷积神经网络一系列库神经网络深度学习我们将使用来实现线性回归,源代码在仓库。

译者按: 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函数将其转化为两个数据向量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以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87130.html

相关文章

  • 机器习之线性回归

    摘要:在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析维基百科。对当前示例作图表示衡量线性回归法的指标误差一个训练后的模型通常都会使用测试数据集测试该模型的准确性。 在统计学中,线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析维基百科。 简...

    Jonathan Shieber 评论0 收藏0
  • 机器习之多项式回归与模型泛化

    摘要:还提供了,将多项式特征数据归一化和线性回归组合在了一起,大大方便的编程的过程。在机器学习算法中,主要的挑战来自方差,解决的方法主要有降低模型复杂度降维增加样本数使用验证集模型正则化。 多项式回归 多项式回归使用线性回归的基本思路 非线性曲线如图: showImg(https://segmentfault.com/img/bVbkn4q?w=372&h=252); 假设曲线表达式为:$y...

    huhud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<