翻譯 | 徐進(jìn)
審校 | 薛命燈
基于 JavaScript 的機(jī)器學(xué)習(xí)胎撤?!沒錯凉唐,是 基于 JavaScript 的機(jī)器學(xué)習(xí)极颓!關(guān)注前端之巔系列文章——《機(jī)器學(xué)習(xí)與 JavaScript》,利用 JavaScript 開啟機(jī)器學(xué)習(xí)之路购桑!
基于 JavaScript 的機(jī)器學(xué)習(xí)畅铭?
你應(yīng)該覺得基于 JavaScript 的機(jī)器學(xué)習(xí)不簡單吧?
JAVASCRIPT勃蜘?硕噩!我難道不應(yīng)該用 Python 么?我難道要用 JavaScript 去做如此復(fù)雜的運(yùn)算缭贡?難道我不應(yīng)該使用 Python 或者 R 語言么炉擅?scikit-learn 算法庫會不會不能在 JavaScript 中使用?簡單來說:基于 JavaScript 的機(jī)器學(xué)習(xí)完全沒有問題阳惹。
詳細(xì)來講谍失,基于 JavaScript 的機(jī)器學(xué)習(xí)是有可能的,并且我總是很吃驚為什么開發(fā)者們沒有給予它應(yīng)有的關(guān)注莹汤。就 scikit-learn 算法庫而言快鱼,JavaScript 開發(fā)者已經(jīng)開發(fā)了一系列實(shí)現(xiàn)該算法的庫,一會兒就會用到一個庫纲岭。接下來會先講一點(diǎn)機(jī)器學(xué)習(xí)的知識抹竹,然后就放松心情一起來看代碼吧。
據(jù) Arthur Samuel 所講止潮,機(jī)器學(xué)習(xí) 就是在不對其進(jìn)行具體編程的情況下窃判,使計算機(jī)擁有學(xué)習(xí)的能力。換句話說喇闸,它在我們不操作計算機(jī)的情況下兢孝,卻能擁有自我學(xué)習(xí)的能力,并能執(zhí)行正確的指令仅偎。并且谷歌公司已經(jīng)將策略從移動優(yōu)先轉(zhuǎn)變?yōu)?AI 優(yōu)先很長一段時間了跨蟹。
為什么在機(jī)器學(xué)習(xí)領(lǐng)域沒有提到 JavaScript 呢?
JavaScript 很慢橘沥。(完全錯誤的觀念 !?! )
JavaScript 很難進(jìn)行矩陣操作窗轩。(但是有很多庫的琳猫,比如math.js )
JavaScript 僅僅被認(rèn)為是用來做 web 開發(fā)的雁比。(Node.js 默默的笑了)
機(jī)器學(xué)習(xí)中很多庫都是基于 Python 開發(fā)的。(那是因?yàn)?JavaScript 開發(fā)者并沒有在場)
現(xiàn)在已經(jīng)有很多的 JavaScript 庫了,它們已經(jīng)預(yù)定義了機(jī)器學(xué)習(xí)算法玷禽,比如:線性回歸、支持向量機(jī)商模、樸素貝葉斯算法等誉碴,以下列出了幾個庫:
brain.js(神經(jīng)網(wǎng)絡(luò))
Synaptic(神經(jīng)網(wǎng)絡(luò))
Natural(自然語言處理)
ConvNetJS(卷積神經(jīng)網(wǎng)絡(luò))
mljs(一種具有多個函數(shù)方法的子庫)
開啟 JavaScript 的機(jī)器學(xué)習(xí)之路
我將使用mljs的回歸庫來執(zhí)行線性回歸模型的分析。全部代碼都在 Github 上:machine-learning-with-js(https://github.com/abhisheksoni27/machine-learning-with-js )舌缤。
第一步. 安裝依賴的庫
$ yarn add ml-regression csvtojson
或者你更喜歡 npm:
$ npm install ml-regression csvtojson
ml-regression所做的事正如它的名字那樣箕戳,機(jī)器學(xué)習(xí)線性回歸庫。
csvtojson是在node.js環(huán)境中的一個cvs數(shù)據(jù)解析器国撵,它可以在你加載完cvs 數(shù)據(jù)后將其快速的轉(zhuǎn)換為JSON陵吸。
第二步. 初始化依賴庫并加載數(shù)據(jù)
首先從 這里 下載數(shù)據(jù)文件,并將數(shù)據(jù)文件放在你的工程目錄中介牙。假設(shè)你已經(jīng)初始化了一個空的 npm 工程壮虫,打開index.js文件,并輸入以下代碼:(你可以直接復(fù)制 / 粘貼环础,但為了能夠更好的理解它囚似,建議你能親自輸入這段代碼)
const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // 簡單線性回歸
const csvFilePath = 'advertising.csv'; // 數(shù)據(jù)文件
let csvData = [], // 已解析的數(shù)據(jù)
? ?X = [], // 輸入
? ?y = []; // 輸出
let regressionModel;
我把這個文件放在了項(xiàng)目的根目錄下,因此如果你放在了別的目錄下线得,請同時更改上述代碼中的csvFilePath變量饶唤。
這樣的代碼看起來相當(dāng)整潔,不是么框都?
接下來使用csvtojson庫的fromFile方法加載數(shù)據(jù)文件搬素。
csv()
? ?.fromFile(csvFilePath)
? ?.on('json', (jsonObj) => {
? ? ? ?csvData.push(jsonObj);
? ?})
? ?.on('done', () => {
? ? ? ?dressData(); // 從 JSON 對象中獲取數(shù)據(jù)點(diǎn)
? ? ? ?performRegression();
});
第三步. 將數(shù)據(jù)加以裝飾,以準(zhǔn)備開始執(zhí)行
保存在csvData變量中的 JSON 對象已經(jīng)準(zhǔn)備好了魏保,同時還分別需要一個數(shù)組熬尺,用來存儲輸入點(diǎn)數(shù)據(jù)和輸出點(diǎn)數(shù)據(jù)。然后將通過dressData函數(shù)來運(yùn)行數(shù)據(jù)谓罗,且dressData函數(shù)將會計算出X和Y變量粱哼。
function dressData() {
/**
* 一個數(shù)據(jù)對象應(yīng)該這樣:
* {
* ? TV: "10",
* ? Radio: "100",
* ? Newspaper: "20",
* ? "Sales": "1000"
* }
*
* 因此,在添加數(shù)據(jù)點(diǎn)的同時檩咱,
* 我們需要將 String 類型的值解析為 Float 類型揭措。
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
function f(s) {
return parseFloat(s);
}
第四步. 訓(xùn)練模型,并開始進(jìn)行預(yù)測
現(xiàn)在數(shù)據(jù)已經(jīng)裝飾好了刻蚯,是時候來訓(xùn)練模型了绊含。
為了實(shí)現(xiàn)這一目標(biāo),我們需要一個performRegression函數(shù):
function performRegression() {
regressionModel = new SLR(X, y); // 基于訓(xùn)練數(shù)據(jù)來訓(xùn)練模型
console.log(regressionModel.toString(3));
predictOutput();
}
regressionModel有一個toString方法炊汹,它所接收的參數(shù)代表輸出值浮點(diǎn)數(shù)的精度躬充。
predictOutput方法能夠接收所輸入的值,并且向終端輸出所預(yù)測的值。
以下就是這個函數(shù)的代碼:(這里使用了node.js的readline模塊)
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ?${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}
以下代碼讀取了用戶的輸入值:
const readline = require('readline'); // 同時預(yù)測用戶的輸入值
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
第五步. 恭喜你充甚!做到了以政。
如果你跟著我一步一步的做,現(xiàn)在你的index.js文件應(yīng)該是這樣子的:
const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // 簡單線性回歸
const csvFilePath = 'advertising.csv'; // 數(shù)據(jù)
let csvData = [], // 已解析的數(shù)據(jù)
X = [], // 輸入
y = []; // 輸出
let regressionModel;
const readline = require('readline'); // 同時預(yù)測用戶的輸入值
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
csv()
.fromFile(csvFilePath)
.on('json', (jsonObj) => {
csvData.push(jsonObj);
})
.on('done', () => {
dressData(); // 從 JSON 對象中獲取數(shù)據(jù)點(diǎn)
performRegression();
});
function performRegression() {
regressionModel = new SLR(X, y); // 基于訓(xùn)練數(shù)據(jù)來訓(xùn)練模型
console.log(regressionModel.toString(3));
predictOutput();
}
function dressData() {
/**
* 一個數(shù)據(jù)對象應(yīng)該這樣:
* {
* ? TV: "10",
* ? Radio: "100",
* ? Newspaper: "20",
* ? "Sales": "1000"
* }
*
* 因此伴找,在添加數(shù)據(jù)點(diǎn)的同時盈蛮,
* 我們需要將 String 類型的值解析為 Float 類型。
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
function f(s) {
return parseFloat(s);
}
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ?${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}
打開終端技矮,輸入并運(yùn)行node index.js抖誉,它將會輸出如下所示內(nèi)容:
$ node index.js
f(x) = 0.202 * x + 9.31
Enter input X for prediction (Press CTRL+C to exit) : 151.5
At X = 151.5, y = ?39.98974927911285
Enter input X for prediction (Press CTRL+C to exit) :
恭喜你!剛剛用 JavaScript 訓(xùn)練了你的第一個線性回歸模型穆役。(你有注意到它的速度么寸五?)
PS: 我將使用 ml 和其他的庫(上面所列出的那些)在各種數(shù)據(jù)集上執(zhí)行目前比較流行的機(jī)器學(xué)習(xí)算法梳凛。請時刻關(guān)注我的動態(tài)耿币,獲取最新的機(jī)器學(xué)習(xí)教程。
感謝你的閱讀韧拒! 如果你喜歡這篇文章的話淹接,請為我點(diǎn)贊,以讓別人知道 JavaScript 是多么的強(qiáng)大叛溢,以及為什么在機(jī)器學(xué)習(xí)領(lǐng)域中 JavaScript 不應(yīng)該落后塑悼。
英文原文鏈接
Machine Learning with JavaScript : Part 1
https://hackernoon.com/machine-learning-with-javascript-part-1-9b97f3ed4fe5
注:本文翻譯及轉(zhuǎn)載均已獲得作者授權(quán)。
今日薦文
點(diǎn)擊下方圖片即可閱讀
前端每周清單第 19 期: Vue 的優(yōu)勢與劣勢楷掉;Node.js 有望超越 Java厢蒜;JS 在嵌入式及物聯(lián)網(wǎng)的應(yīng)用現(xiàn)狀
視野拓展
推薦一個不可錯過的會議:ArchSummit 全球架構(gòu)師峰會,邀請了上百位國內(nèi)外頂尖技術(shù)專家前來分享各業(yè)務(wù)的核心架構(gòu)設(shè)計烹植,從 Web 協(xié)議底層優(yōu)化到超級 App 的系列魔改斑鸦,這里只談最優(yōu)秀的架構(gòu)實(shí)踐。
距離大會 7 月 7 日開幕僅剩兩周時間草雕,點(diǎn)擊“閱讀原文”可獲取 100+ 落地案例巷屿,如需報名,可直接識別下方二維碼聯(lián)系大會售票天使豆包墩虹,歡迎騷擾~嘱巾!