溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JavaScript機(jī)器學(xué)習(xí)之線(xiàn)性回歸

發(fā)布時(shí)間:2020-07-30 05:40:21 來(lái)源:網(wǎng)絡(luò) 閱讀:139 作者:Fundebug 欄目:web開(kāi)發(fā)

譯者按: AI時(shí)代,不會(huì)機(jī)器學(xué)習(xí)的JavaScript開(kāi)發(fā)者不是好的前端工程師。

  • 原文: Machine Learning with JavaScript : Part 1
  • 譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。

使用JavaScript做機(jī)器學(xué)習(xí)?不是應(yīng)該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計(jì)算?難道我不用Python和R是為了裝逼?scikit-learn(Python機(jī)器學(xué)習(xí)庫(kù))不能使用Python吧?

嗯,我并沒(méi)有開(kāi)玩笑...

其實(shí)呢,類(lèi)似于Python的scikit-learn,JavaScript開(kāi)發(fā)者也開(kāi)發(fā)了一些機(jī)器學(xué)習(xí)庫(kù),我打算用一下它們。

JavaScript不能用于機(jī)器學(xué)習(xí)?

  1. 太慢(幻覺(jué)?)
  2. 矩陣操作太難(有函數(shù)庫(kù)啊,比如math.js
  3. JavaScript只能用于前端開(kāi)發(fā)(Node.js開(kāi)發(fā)者笑了)
  4. 機(jī)器學(xué)習(xí)庫(kù)都是Python(JS開(kāi)發(fā)者)

JavaScript機(jī)器學(xué)習(xí)庫(kù)

  1. brain.js (神經(jīng)網(wǎng)絡(luò))
  2. Synaptic (神經(jīng)網(wǎng)絡(luò))
  3. Natural (自然語(yǔ)言處理)
  4. ConvNetJS (卷積神經(jīng)網(wǎng)絡(luò))
  5. mljs (一系列AI庫(kù))
  6. Neataptic (神經(jīng)網(wǎng)絡(luò))
  7. Webdnn (深度學(xué)習(xí))

我們將使用mljs來(lái)實(shí)現(xiàn)線(xiàn)性回歸,源代碼在GitHub倉(cāng)庫(kù): machine-learning-with-js。下面是詳細(xì)步驟:

1. 安裝模塊

$ yarn add ml-regression csvtojson

或者使用 npm

$ npm install ml-regression csvtojson
  • ml-regression模塊提供了一些回歸算法
  • csvtojson模塊用于將CSV數(shù)據(jù)轉(zhuǎn)換為JSON。

2. 初始化并導(dǎo)入數(shù)據(jù)

下載.csv數(shù)據(jù)。

假設(shè)你已經(jīng)初始化了一個(gè)NPM項(xiàng)目,請(qǐng)?jiān)?strong>index.js中輸入以下內(nèi)容:

const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // 線(xiàn)性回歸

const csvFilePath = "advertising.csv"; // 訓(xùn)練數(shù)據(jù)
let csvData = [], 
    X = [], 
    y = []; 

let regressionModel;

使用csvtojson模塊的fromFile方法加載數(shù)據(jù):

csv()
    .fromFile(csvFilePath)
    .on("json", (jsonObj) => {
        csvData.push(jsonObj);
    })
    .on("done", () => {
        dressData(); 
        performRegression(); 
    });

3. 轉(zhuǎn)換數(shù)據(jù)

導(dǎo)入的數(shù)據(jù)為json對(duì)象數(shù)組,我們需要使用dressData函數(shù)將其轉(zhuǎn)化為兩個(gè)數(shù)據(jù)向量xy:

// 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù)
function dressData() {
    /**
     * 原始數(shù)據(jù)中每一行為JSON對(duì)象
     * 因此需要將數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù),并將字符串解析為浮點(diǎn)數(shù)
     * {
     *   TV: "10",
     *   Radio: "100",
     *   Newspaper: "20",
     *   "Sales": "1000"
     * }
     */
    csvData.forEach((row) => {
        X.push(f(row.Radio));
        y.push(f(row.Sales));
    });
}

// 將字符串解析為浮點(diǎn)數(shù)
function f(s) {
    return parseFloat(s);
}

4. 訓(xùn)練數(shù)據(jù)并預(yù)測(cè)

編寫(xiě)performRegression函數(shù):

// 使用線(xiàn)性回歸算法訓(xùn)練數(shù)據(jù)
function performRegression() {
    regressionModel = new SLR(X, y);
    console.log(regressionModel.toString(3));
    predictOutput();
}

regressionModeltoString方法可以指定參數(shù)的精確度。

predictOutput函數(shù)可以根據(jù)輸入值輸出預(yù)測(cè)值。

// 接收輸入數(shù)據(jù),然后輸出預(yù)測(cè)值
function predictOutput() {
    rl.question("請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : ", (answer) => {
        console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測(cè)值y = ${regressionModel.predict(parseFloat(answer))}`);
        predictOutput();
    });
}

predictOutput函數(shù)使用了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; // 線(xiàn)性回歸

const csvFilePath = "advertising.csv"; // 訓(xùn)練數(shù)據(jù)
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(); 
    });

// 使用線(xiàn)性回歸算法訓(xùn)練數(shù)據(jù)
function performRegression() {
    regressionModel = new SLR(X, y);
    console.log(regressionModel.toString(3));
    predictOutput();
}

// 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù)
function dressData() {
    /**
     * 原始數(shù)據(jù)中每一行為JSON對(duì)象
     * 因此需要將數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù),并將字符串解析為浮點(diǎn)數(shù)
     * {
     *   TV: "10",
     *   Radio: "100",
     *   Newspaper: "20",
     *   "Sales": "1000"
     * }
     */
    csvData.forEach((row) => {
        X.push(f(row.Radio));
        y.push(f(row.Sales));
    });
}

// 將字符串解析為浮點(diǎn)數(shù)
function f(s) {
    return parseFloat(s);
}

// 接收輸入數(shù)據(jù),然后輸出預(yù)測(cè)值
function predictOutput() {
    rl.question("請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : ", (answer) => {
        console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測(cè)值y = ${regressionModel.predict(parseFloat(answer))}`);
        predictOutput();
    });
}

執(zhí)行 node index.js ,則輸出如下:

$ node index.js
f(x) = 0.202 * x + 9.31
請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) : 151.5
當(dāng)X = 151.5時(shí), 預(yù)測(cè)值y =  39.98974927911285
請(qǐng)輸入X用于預(yù)測(cè)(輸入CTRL+C退出) :

恭喜!你已經(jīng)使用JavaScript訓(xùn)練了一個(gè)線(xiàn)性回歸模型,如下:

f(x) = 0.202 * x + 9.31

感興趣的話(huà),請(qǐng)持續(xù)關(guān)注 machine-learning-with-js,我將使用JavaScript實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法。

關(guān)于Fundebug

Fundebug專(zhuān)注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線(xiàn),F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶(hù)的認(rèn)可。歡迎免費(fèi)試用!

JavaScript機(jī)器學(xué)習(xí)之線(xiàn)性回歸

版權(quán)聲明

轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI