您好,登錄后才能下訂單哦!
譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。
使用JavaScript做機器學習?不是應該用Python嗎?是不是我瘋了才用JavaScript做如此繁重的計算?難道我不用Python和R是為了裝逼?scikit-learn(Python機器學習庫)不能使用Python吧?
嗯,我并沒有開玩笑...
其實呢,類似于Python的scikit-learn,JavaScript開發者也開發了一些機器學習庫,我打算用一下它們。
我們將使用mljs來實現線性回歸,源代碼在GitHub倉庫: machine-learning-with-js。下面是詳細步驟:
$ yarn add ml-regression csvtojson
或者使用 npm
$ npm install ml-regression csvtojson
下載.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();
});
導入的數據為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);
}
編寫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
});
完整的程序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專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了7億+錯誤事件,得到了Google、360、金山軟件、百姓網等眾多知名用戶的認可。歡迎免費試用!
轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。