JavaScript機器學習之線性迴歸
譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。
原文: Machine Learning with JavaScript : Part 1
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。
使用JavaScript做機器學習?不是應該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計算?難道我不用Python和R是為了裝逼?scikit-learn(Python機器學習庫)不能使用Python吧?
嗯,我並沒有開玩笑…
其實呢,類似於Python的scikit-learn
JavaScript不能用於機器學習?
- 太慢(幻覺?)
- 矩陣操作太難(有函式庫啊,比如math.js)
- JavaScript只能用於前端開發(Node.js開發者笑了)
- 機器學習庫都是Python(JS開發者)
JavaScript機器學習庫
- brain.js (神經網路)
- Synaptic (神經網路)
- Natural (自然語言處理)
- ConvNetJS (卷積神經網路)
- mljs (一系列AI庫)
- Neataptic (神經網路)
我們將使用mljs來實現線性迴歸,原始碼在GitHub倉庫: machine-learning-with-js。下面是詳細步驟:
1. 安裝模組
$ yarn add ml-regression csvtojson
或者使用 npm
$ npm install ml-regression csvtojson
- ml-regression模組提供了一些迴歸演算法
- csvtojson模組用於將CSV資料轉換為JSON。
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函式將其轉化為兩個資料向量x和y:
// 將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();
}
regressionModel的toString方法可以指定引數的精確度。
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/