zoukankan      html  css  js  c++  java
  • 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

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

     

  • 相关阅读:
    登陆澳洲一周年记
    开源项目:SQL Monitor 3.0.8
    数据处理利器SSIS入门与进阶
    自动输出SQL Server对象依赖列表到EXCEL文件
    .NET开源数据库的前世和今生(上)
    分布式文件快速搜索技术细节分析(开源/并行)
    ROS与ROS2通讯机制的区别
    快速理解ROS2通信
    Linux解决The following packages have unmet dependencies
    ROS 移植到各种平台教程
  • 原文地址:https://www.cnblogs.com/fundebug/p/7110054.html
Copyright © 2011-2022 走看看