99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀海納百川 有容乃大:SparkR與Docker的機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
海納百川 有容乃大:SparkR與Docker的機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
2016-03-25
收藏
本文由CDA作者庫成員HarryZhu原創(chuàng),并授權(quán)發(fā)布。
CDA作者庫凝聚原創(chuàng)力量,只做更有價(jià)值的分享。
了解詳情請微信添加trasn863,或發(fā)送郵件至songpeiyang@pinggu.org

題圖為美國尼米茲核動(dòng)力航空母艦

介 紹

大數(shù)據(jù)時(shí)代,我們常常面對海量數(shù)據(jù)而頭疼。作為學(xué)統(tǒng)計(jì)出身的人,我們想折騰大數(shù)據(jù)但又不想學(xué)習(xí)Hadoop或者Java,我們更傾向于把精力放在建模和算法設(shè)計(jì)上,SparkR和Docker的完美結(jié)合,讓R的計(jì)算直接從一架戰(zhàn)斗機(jī)的當(dāng)兵作戰(zhàn)華麗轉(zhuǎn)變?yōu)橐粋€(gè)航空母艦戰(zhàn)斗群!不僅僅簡化了分布式計(jì)算的操作,還簡化了安裝部署的環(huán)節(jié),我們只幾乎不需要做什么改動(dòng)就可以直接運(yùn)用R中的data frame進(jìn)行分布式的計(jì)算。

什么是SparkR

參考前文 打造大數(shù)據(jù)產(chǎn)品:Shiny的Spark之旅,我們可以知道,SparkR是一個(gè)為R提供了輕量級的Spark前端的R包。 SparkR提供了一個(gè)分布式的data frame數(shù)據(jù)結(jié)構(gòu),解決了 R中的data frame只能在單機(jī)中使用的瓶頸,它和R中的data frame 一樣支持許多操作,比如select,filter,aggregate等等。(類似dplyr包中的功能)這很好的解決了R的大數(shù)據(jù)級瓶頸問題。 SparkR也支持分布式的機(jī)器學(xué)習(xí)算法,比如使用MLib機(jī)器學(xué)習(xí)庫。



什么是Docker

參考前文 打造數(shù)據(jù)產(chǎn)品的快速原型:Shiny的Docker之旅,我們也可以知道,Docker是一種類似于虛擬機(jī)的技術(shù),主要解決標(biāo)準(zhǔn)化快速部署的問題,在Docker中安裝的軟件和主機(jī)中的軟件可以完全隔離,并通過Daocloud或者h(yuǎn)ub.docker.com等云服務(wù)快速建立Docker倉庫,快速復(fù)用Docker鏡像。Docker已經(jīng)不僅僅是DevOps人員手中的神器了,每一個(gè)開發(fā)者都應(yīng)該學(xué)會如何使用Docker。



為什么要結(jié)合SparkR和Docker

SparkR的精髓在于分布式計(jì)算,而Docker的精髓在于標(biāo)準(zhǔn)容器的拓展性,SparkR和Docker的組合充分結(jié)合了二者各自的優(yōu)點(diǎn),將分布式應(yīng)用底層化繁為簡,為高層計(jì)算直接暴露接口,給科學(xué)計(jì)算節(jié)省了大量時(shí)間。

部署

本文將通過Docker講解如何快速部署SparkR-RStudio容器,并通過一些簡單的機(jī)器學(xué)習(xí)例子展示如何使用這個(gè)航母級別的組合拳。

步驟一:安裝Docker和Daocloud

由于國內(nèi)的鏡像質(zhì)量不夠高,國外的鏡像下載速度比較慢,出于試驗(yàn)的考慮,建議大家可以嘗試使用Daocloud的鏡像加速服務(wù)。



首先,我們需要在Daocloud注冊一個(gè)賬號,然后選擇鏡像加速,根據(jù)指示選擇主機(jī)并安裝Docker和Daocloud加速器。

步驟二:安裝Spark-RStudio

感謝 vinicius85 在GitHub上的開源貢獻(xiàn),為我們已經(jīng)做好了 Spark1.6+R+RStduio的鏡像,我們利用daocloud加速拉取鏡像。



以daemon形式運(yùn)行容器,暴露Rstudio-server默認(rèn)的8787端口, 并持久化docker內(nèi)的/srv目錄下的所有文件作為通訊。



步驟三:配置RStudio登陸賬號

參考前文 R語言工程化實(shí)踐:RStudio Server環(huán)境快速配置教程



我們設(shè)置一下RStudio-Server的賬號密碼



步驟四:登陸RStudio



比如:




查看資源占用情況



機(jī)器學(xué)習(xí)示例



出于演示的考慮,這里引用并稍微改進(jìn)了 tcosta 完成的一個(gè)邏輯回歸的例子:

初始化

使用SparkR之前,我們需要確定,我們的容器內(nèi)存要在2G以上,如果用AWS的乞丐版套裝,馬上就會報(bào)內(nèi)存不足的錯(cuò)誤。



如果內(nèi)存不足,可以退出docker并且在虛擬機(jī)中重新提高docker的內(nèi)存和cpu的配置。



邏輯回歸


模型評估





Harry Zhu,擅長用Python和R進(jìn)行數(shù)據(jù)建模、定量研究,目前就職于量子金服(Quantum Financial Service)。微信號:harryzhustudio

歡迎關(guān)注個(gè)人主頁:
https://github.com/harryprince
https://segmentfault.com/u/harryprince

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }