JavaScript機器學習之線性回歸

吳青強 8年前發布 | 30K 次閱讀 機器學習 JavaScript開發 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實現各種機器學習算法。

 本文由用戶 吳青強 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!