JavaScript機器學習之線性迴歸

譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。javascript

原文: Machine Learning with JavaScript : Part 1html

譯者: Fundebug前端

爲了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原做者全部,翻譯僅用於學習。java

使用JavaScript作機器學習?不是應該用Python嗎?是否是我瘋了才用JavaScript作如此繁重的計算?難道我不用Python和R是爲了裝逼?scikit-learn(Python機器學習庫)不能使用Python吧?node

嗯,我並無開玩笑...git

其實呢,相似於Python的scikit-learn,JavaScript開發者也開發了一些機器學習庫,我打算用一下它們。github

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。下面是詳細步驟:web

1. 安裝模塊

$ yarn add ml-regression csvtojson複製代碼

或者使用 npm算法

$ npm install ml-regression csvtojson複製代碼

2. 初始化並導入數據

下載.csv數據npm

假設你已經初始化了一個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以及本文地址:
blog.fundebug.com/2017/07/03/…

相關文章
相關標籤/搜索