1. 程式人生 > >JavaScript機器學習之線性迴歸

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、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!

版權宣告

轉載時請註明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/