您好,登錄后才能下訂單哦!
譯者按: AI時(shí)代,不會(huì)機(jī)器學(xué)習(xí)的JavaScript開(kāi)發(fā)者不是好的前端工程師。
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(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ù),我打算用一下它們。
我們將使用mljs來(lái)實(shí)現(xiàn)線(xiàn)性回歸,源代碼在GitHub倉(cāng)庫(kù): 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)目,請(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();
});
導(dǎo)入的數(shù)據(jù)為json對(duì)象數(shù)組,我們需要使用dressData函數(shù)將其轉(zhuǎn)化為兩個(gè)數(shù)據(jù)向量x和y:
// 將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);
}
編寫(xiě)performRegression函數(shù):
// 使用線(xiàn)性回歸算法訓(xùn)練數(shù)據(jù)
function performRegression() {
regressionModel = new SLR(X, y);
console.log(regressionModel.toString(3));
predictOutput();
}
regressionModel的toString方法可以指定參數(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
});
完整的程序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í)算法。
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)試用!
轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/
免責(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)容。