返回 登录
0

使用 JavaScript 实现机器学习(一)

原文:Machine Learning with JavaScript : Part 1
作者:Abhishek Soni
译者:聂震坤
审校:苏宓

你曾经认为它很难

JAVASCRIPT?为什么不用 Python?用 JavaScript 来进行这些大量运算难道不是疯了吗?使用 Python 或者 R 语言来表达不会更酷吗?Scikit-learning 甚至不能再 JavaScript 环境中工作。笔者回答:不,我是认真的!

回应上述疑问:这是可能的,事实上我对开发人员没有给它应有的关注而感到惊讶。就 scikit-learning 来讲,JS 开发者已经制作了自己的库来使用它。

根据 Arthur Samuel 的话,机器学习给了计算机自主学习的能力。换句话说,不需要提供给计算机应对每一种方案的对策,让计算机自己学习应对。而 Google 研发重点从移动设备转移到人工智能已经很久了。

为什么 JavaScript 从未跟机器学习一起提到

  1. 矩阵操作很困难
  2. 重点在网页研发
  3. 人工智能的库通常是以 Python 开发

下面有一些自带机器学习算法的非常实用的 JavaScript 库:

  1. Brain.js(神经网络)
  2. Synaptic(神经网络)
  3. Natural(自然语言处理)
  4. ConvNetJS(卷积神经网络)
  5. Mljs(很多小的库和一些使用的方法)
  6. Neataptic(神经网络)
  7. Webdnm(深度学习)

本文将用 mljs 的回归库来执行一些线性回归算数

第一步:安装库

$ yarn add ml-regression csvtojson

如果你喜欢用 npm

$ npm install ml-regression csvtojson

ml-regression 的意思顾名思义

csvtojson 是一个快速的 csv 转换器,可以让 csv 数据快速转换成 JSON

第二步:安装库,载入数据

下载数据文件(.csv)并把它放入项目中。

假设已经有一个空的 npm 项目,打开 index.js 文件并输入下文。

const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // Simple Linear Regression

const csvFilePath = 'advertising.csv'; // Data
let csvData = [], // parsed Data
    X = [], // Input
    y = []; // Output

let regressionModel;

我将文件放到项目的根目录,如果你想把他放在别的地方,确保更改 csvFilePath 的路径。

很整洁,对吧?下一步我们将使用 fromFile 方法来载入数据。

csv()
    .fromFile(csvFilePath)
    .on('json', (jsonObj) => {
        csvData.push(jsonObj);
    })
    .on('done', () => {
        dressData(); // To get data points from JSON Objects
        performRegression(); 
});

第三步:包装数据以便执行

保存在 csvData 的 JASON 对象需要输入点数列和输出点数列。我们将通过 dressData 方法来运行我们的数据以获得我们的 X 与 Y 变量。

function dressData() {
    /**
     * One row of the data object looks like:
     * {
     *   TV: "10",
     *   Radio: "100",
     *   Newspaper: "20",
     *   "Sales": "1000"
     * }
     *
     * Hence, while adding the data points,
     * we need to parse the String value as a Float.
     */
    csvData.forEach((row) => {
        X.push(f(row.Radio));
        y.push(f(row.Sales));
    });
}

function f(s) {
    return parseFloat(s);
}

第四步:训练你的模型并开始预测

现在我们的数据已经被成功包装了,现在是时候训练他们了。我们需要写一个performRegression 方法来实现。

function performRegression() {
    regressionModel = new SLR(X, y); // Train the model on training data
    console.log(regressionModel.toString(3));
    predictOutput();
}

RegressionModel 有一个 toString 方法将精度参数以浮点输出。
PredicOutput 方法允许你输入一个值,并将预测值输出到控制台。

代码如下:(请注意我使用了 Node.js 的 readline)

function predictOutput() {
    rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
        console.log(`At X = ${answer}, y =  ${regressionModel.predict(parseFloat(answer))}`);
        predictOutput();
    });
}

读取用户输入的代码:

const readline = require('readline'); // For user prompt to allow predictions

const rl = readline.createInterface({
    input: process.stdin, 
    output: process.stdout
});

第五步:你做到了!恭喜你

如果你按照如上步骤执行,现在你的 index.js 应该看起来是这样的:

const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // Simple Linear Regression

const csvFilePath = 'advertising.csv'; // Data
let csvData = [], // parsed Data
    X = [], // Input
    y = []; // Output

let regressionModel;

const readline = require('readline'); // For user prompt to allow predictions

const rl = readline.createInterface({
    input: process.stdin, 
    output: process.stdout
});

csv()
    .fromFile(csvFilePath)
    .on('json', (jsonObj) => {
        csvData.push(jsonObj);
    })
    .on('done', () => {
        dressData(); // To get data points from JSON Objects
        performRegression(); 
    });

function performRegression() {
    regressionModel = new SLR(X, y); // Train the model on training data
    console.log(regressionModel.toString(3));
    predictOutput();
}

function dressData() {
    /**
     * One row of the data object looks like:
     * {
     *   TV: "10",
     *   Radio: "100",
     *   Newspaper: "20",
     *   "Sales": "1000"
     * }
     *
     * Hence, while adding the data points,
     * we need to parse the String value as a Float.
     */
    csvData.forEach((row) => {
        X.push(f(row.Radio));
        y.push(f(row.Sales));
    });
}

function f(s) {
    return parseFloat(s);
}

function predictOutput() {
    rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
        console.log(`At X = ${answer}, y =  ${regressionModel.predict(parseFloat(answer))}`);
        predictOutput();
    });
}

在控制台运行 node index.js,他的输出应该如此:

$ node index.js
f(x) = 0.202 * x + 9.31
Enter input X for prediction (Press CTRL+C to exit) : 151.5
At X = 151.5, y =  39.98974927911285
Enter input X for prediction (Press CTRL+C to exit) :

恭喜你,你已经使用 JavaScript 训练了你的第一个线性回归模型!(你注意到他的速度了吗?)

更多内容可参考:使用 JavaScript 实现机器学习(二)

评论