譯者按:AI時(shí)代,不會(huì)機(jī)器學(xué)習(xí)的JavaScript開發(fā)者不是好的前端工程師。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國際域名空間、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、上杭網(wǎng)站維護(hù)、網(wǎng)站推廣。
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
使用JavaScript做機(jī)器學(xué)習(xí)?不是應(yīng)該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計(jì)算?難道我不用Python和R是為了裝逼?scikit-learn(Python機(jī)器學(xué)習(xí)庫)不能使用Python吧?
嗯,我并沒有開玩笑...
其實(shí)呢,類似于Python的scikit-learn,JavaScript開發(fā)者也開發(fā)了一些機(jī)器學(xué)習(xí)庫,我打算用一下它們。
我們將使用mljs來實(shí)現(xiàn)線性回歸,源代碼在GitHub倉庫: machine-learning-with-js。下面是詳細(xì)步驟:
$ yarn add ml-regression csvtojson
或者使用 npm
$ npm install ml-regression csvtojson
下載.csv數(shù)據(jù)。
假設(shè)你已經(jīng)初始化了一個(gè)NPM項(xiàng)目,請?jiān)?strong>index.js中輸入以下內(nèi)容:
const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // 線性回歸
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();
});
導(dǎo)入的數(shù)據(jù)為json對象數(shù)組,我們需要使用dressData函數(shù)將其轉(zhuǎn)化為兩個(gè)數(shù)據(jù)向量x和y:
// 將JSON數(shù)據(jù)轉(zhuǎn)換為向量數(shù)據(jù)
function dressData() {
/**
* 原始數(shù)據(jù)中每一行為JSON對象
* 因此需要將數(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);
}
編寫performRegression函數(shù):
// 使用線性回歸算法訓(xùn)練數(shù)據(jù)
function performRegression() {
regressionModel = new SLR(X, y);
console.log(regressionModel.toString(3));
predictOutput();
}
regressionModel的toString方法可以指定參數(shù)的精確度。
predictOutput函數(shù)可以根據(jù)輸入值輸出預(yù)測值。
// 接收輸入數(shù)據(jù),然后輸出預(yù)測值
function predictOutput() {
rl.question("請輸入X用于預(yù)測(輸入CTRL+C退出) : ", (answer) => {
console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測值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
});
完整的程序index.js是這樣的:
const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // 線性回歸
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();
});
// 使用線性回歸算法訓(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對象
* 因此需要將數(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ù)測值
function predictOutput() {
rl.question("請輸入X用于預(yù)測(輸入CTRL+C退出) : ", (answer) => {
console.log(`當(dāng)X = ${answer}時(shí), 預(yù)測值y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}
執(zhí)行 node index.js
,則輸出如下:
$ node index.js
f(x) = 0.202 * x + 9.31
請輸入X用于預(yù)測(輸入CTRL+C退出) : 151.5
當(dāng)X = 151.5時(shí), 預(yù)測值y = 39.98974927911285
請輸入X用于預(yù)測(輸入CTRL+C退出) :
恭喜!你已經(jīng)使用JavaScript訓(xùn)練了一個(gè)線性回歸模型,如下:
f(x) = 0.202 * x + 9.31
感興趣的話,請持續(xù)關(guān)注 machine-learning-with-js,我將使用JavaScript實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法。
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/