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

熱線電話:13121318867

登錄
首頁精彩閱讀在機器學(xué)習(xí)方面使用 R + Hadoop 方案真的有那么好
在機器學(xué)習(xí)方面使用 R + Hadoop 方案真的有那么好
2015-05-15
收藏

機器學(xué)習(xí)方面使用 R + Hadoop 方案真的有那么好


為什么有些公司在機器學(xué)習(xí)業(yè)務(wù)方面傾向使用 R + Hadoop 方案?

因為他們在不懂R和Hadoop特征應(yīng)用場景的情況下,恰好抓到了一根免費,開源的稻草。

R:

R的應(yīng)用場景不在于無與倫比的統(tǒng)計學(xué)習(xí)能力,而在于結(jié)構(gòu)化數(shù)據(jù)下無與倫比的單位代碼產(chǎn)出量。神經(jīng)網(wǎng)絡(luò)決策樹等基于結(jié)構(gòu)化數(shù)據(jù)的算法一行代碼搞定,預(yù)測又只是一行代碼。這樣,商業(yè)數(shù)據(jù)庫(如包括Oracle,Netezza,Teradata,SAP HANA等)提供了R接口供統(tǒng)計分析人員進(jìn)行高效實施。 同樣的,SAS和IBM SPSS也做到了一部分高效實施能力,他們沒有的是R獨有的龐大cran packages群。但相似的一點是,R的package群也把它的用戶慣壞了,慣壞到這些人只是覺得這是一個SAS或者SPSS的免費版,而不是去通過代碼學(xué)習(xí)如何做機器學(xué)習(xí)哪怕一點點核心原理。你要做的,就是高效的最新結(jié)構(gòu)化數(shù)據(jù)算法的實施。

最重要的是,從Hadoop上的數(shù)據(jù)加載到這些庫,不僅保證了數(shù)據(jù)本身的正確性和結(jié)構(gòu)化,也已經(jīng)保證了數(shù)據(jù)模型的第二、第三范式化(CAErwin的第一課),想做任何一個分析,你手邊的數(shù)據(jù)庫簡單的join就形成了你需要的分析寬表。想想SQL里sum over的設(shè)計含義:為什么它要制造數(shù)據(jù)的冗余?那一定是為了BI或者分析存在的。

Hadoop

Hadoop的應(yīng)用場景不在于給統(tǒng)計分析軟件提供強力的支持,而只是提供了一個分布式數(shù)據(jù)的泛用免費框架,基于鍵值對(key value pair)高效的對原始非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行存儲。

傳統(tǒng)方式下目測可以做到對連續(xù)型數(shù)值、離散型數(shù)值、字符串、大型字符串BLOB、地理信息(二維點,多邊形)的存儲,Hadoop相當(dāng)于直接把很多功能擴展:比如Hive作為一個基本工具,直接提供了更廣泛的數(shù)據(jù)類型存儲方案:數(shù)組(array),結(jié)構(gòu)體(struct),鍵值對(map)等。

業(yè)務(wù)場景:我存儲一篇文章不再需要一坨文字灌進(jìn)去,先做NLP解析,然后形成 (詞,詞性)的元組,再組成長數(shù)組(Array)即可方便的存儲、分析,以及利用內(nèi)置UDF、自寫UDF對復(fù)雜結(jié)構(gòu)行轉(zhuǎn)列,提取信息。(當(dāng)然,將NLP解析本身整合在UDF甚至算法中都是可行的,如PySpark)

如果你至今覺得非結(jié)構(gòu)化數(shù)據(jù),鍵值對是一種賣弄概念,我就換一個至簡的說法:一個只有兩列的數(shù)據(jù)表。兩列的mn*2和多列m*n數(shù)據(jù)表是可以在一定加工代價下互轉(zhuǎn)的。這種數(shù)據(jù)結(jié)構(gòu)被大量應(yīng)用于Java,C++,Python甚至JavaScript中,當(dāng)你看見類似Hashmap,Hashtable,dict,map等字眼,那就是這貨沒跑了:經(jīng)過設(shè)計,用于存儲的鍵(key)被散列后決定了它能夠被均勻地分布式存儲,值(value)是鍵的跟班,隨著鍵被存儲。

對于非結(jié)構(gòu)化數(shù)據(jù)而言,元數(shù)據(jù)和數(shù)據(jù)不像方表,極其容易抽象出來(無非就是列名和方表的內(nèi)容)。初看一個半結(jié)構(gòu)化的Json/XML,元數(shù)據(jù)出現(xiàn)在鍵(key)中,數(shù)據(jù)出現(xiàn)在值(value)中,容易理解。但在解析其他類型數(shù)據(jù),(如網(wǎng)絡(luò)日志Url),鍵里的所謂元數(shù)據(jù)才是要分析的對象(一個用戶反復(fù)的使用price=xxx做查詢條件,說明價格敏感,有可能xxx取了好多值甚至所有可能值,key卻很少,可能只有price和brand;此時用戶行為模式出現(xiàn)在key里了。)

結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)庫結(jié)合的R+Hadoop看起來很美,實則困難重重。我的看法是,任何一家在數(shù)據(jù)分析領(lǐng)域(文本挖掘暫時除外,理由在業(yè)務(wù)場景里描述過)決定以一個穩(wěn)健的態(tài)度涉足的企業(yè),都無一例外的基于數(shù)據(jù)強一致性的考慮,選擇傳統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)庫作為后續(xù)結(jié)構(gòu)化分析的依托—— 哪怕他們是收費的。如果習(xí)慣代碼開發(fā),Hadoop+python自己做初步的數(shù)據(jù)處理,而后使用基于java的Mahout是一個很自然的選擇:其提供的矩陣計算(SVD),迭代式聚類算法(如Kmeans),基于圖的迭代模型(一個例子是PageRank算法,值中存的也是Key),以及集成決策樹等模型,在分布式場景下是順理成章完成的,而R則會像一個跟班,很難找到它的應(yīng)用場景。一樣具有較高編碼效率的Python可以更加靈活、優(yōu)美(縮進(jìn)的意義上)的繼承mrjob類完成相應(yīng)功能,在數(shù)據(jù)嘗試性探索這一步,matplotlib產(chǎn)出報告恐怕是不如R+knitr+ggplot2更能取悅老板,但一旦需要階段性的測試,Python這種膠水語言或者一步到位的使用Java開發(fā)顯得更接地氣,更容易落地。(關(guān)于落地性,再小小吐槽一下R在Windows和Linux兩個平臺下能夠使用的包范圍是不同的,尤其是使用Rcpp或者并行包的時候。Python和Java則不常見到這種問題)

R+Hadoop的幻覺:

不管什么和Hadoop結(jié)合,都喜歡以word count這種典型的鍵值對開始。事實上R可以做這件事,但是覺得R做的無與倫比,就有點進(jìn)入誤區(qū)。還是那句R的美在于結(jié)構(gòu)化數(shù)據(jù)下無與倫比的單位代碼產(chǎn)出量。一旦你發(fā)現(xiàn)你作為專注于數(shù)據(jù)的分析師,同時也是一個并不骨灰的代碼開發(fā)者,開始用R操作列表和數(shù)據(jù)結(jié)構(gòu),開始用R重寫Mapper和Reducer,你就會產(chǎn)生一個疑問:

為嘛不學(xué)Java、Python?這種分析“不傳統(tǒng)”,就算你不想學(xué)吧,為嘛不找懂它們的人來干?

Python基于鍵值對存儲,也具有相當(dāng)高的單位代碼產(chǎn)出量,也有很多科學(xué)計算包。從這個意義上你可以做出一個白箱,單機縮水版的mahout,而且適合處理有增量算法的大數(shù)據(jù)學(xué)習(xí)(看看NumPy,SciPy,)。一樣免費。

數(shù)據(jù)挖掘的幻覺:

數(shù)據(jù)挖掘是什么,很難嗎?

廣義的數(shù)據(jù)挖掘,包括數(shù)據(jù)分析和機器學(xué)習(xí),只說最核心的數(shù)學(xué)概念的話,估計就幾句話;恰好R的簡潔性也是能用幾句話做完這幾句話的:

0 數(shù)據(jù)清洗,標(biāo)準(zhǔn)化。和1-4,理解真實世界是相輔相成的

1 最先學(xué)的數(shù)學(xué)技巧是空間分解:LL’,PCA,SVD,一般回歸以及L2/L0懲罰變種;從信息論角度講信息流壓縮(有名如LZ及變種LZO);SVM用到的RBF也算基提取技巧。

再學(xué)最優(yōu)化算法:L1懲罰回歸,SVM(使用的Newton-Raphson/Gauss-Newton/Levenberg-Marquadt(還是1的內(nèi)容?。?;MonteCarlo Markov Chain

數(shù)據(jù)結(jié)構(gòu)決策樹(列表類),詞頻統(tǒng)計(鍵值對或者字典類),F(xiàn)P-growth(一個樹的加強版)。學(xué)到這,所謂“貝葉斯”根本就不能叫算法,只能叫一個無處不在的指導(dǎo)思想。

模型集成:Adaboost,神經(jīng)網(wǎng)絡(luò),bootstrap。集成時,權(quán)重技巧和懲罰技巧我的理解是不可割裂。但這個思想對方法,對模型參數(shù)都能集成,大雜燴。1個超級精妙的模型不如200個良好理解了問題性質(zhì)的土鱉模型更實用。

任何一個聽起來很裝逼的算法,逃不過被解析成這4類方法組合的命運。參數(shù)調(diào)優(yōu)這種不提綱挈領(lǐng)的問題,確實需要結(jié)合時間成本人力成本看(研究者,學(xué)生,碼農(nóng)的成本和投入量完全不一樣)

可以看到,大數(shù)據(jù)分析的瓶頸在哪?

第0步,和曾經(jīng)的大Boss討論過,傳統(tǒng)行業(yè)數(shù)據(jù)倉庫實施起碼還能打10年,而”實體-關(guān)系”概念和”鍵-值”概念這兩種抽象起碼還能打30年,數(shù)據(jù)的組織,過濾,元數(shù)據(jù)維護都是數(shù)據(jù)產(chǎn)生價值的必經(jīng)之路,這方面的工作很枯燥但是很基礎(chǔ),大數(shù)據(jù)和傳統(tǒng)數(shù)據(jù)都需要;

第1步是最基本最重要的分析手段,也最容易在大數(shù)據(jù)語境下導(dǎo)致單機無法分析的億階稀疏大矩陣產(chǎn)生:例1,用戶User對商品SKU的購買記錄;例2,在特定的經(jīng)緯度,特定的時間,特定的用戶發(fā)生了動作;這兩個例子是典型的“查詢簡單分析難,匯總還不如不匯總”的情況,必須要有分布式稀疏矩陣處理技術(shù);

第2步,序貫MCMC的串行性可以通過并行集成方法模擬,但是收斂性還仍然較低,需要暴力并行堆FLOPS;對應(yīng)的,因為SVM/Lasso都有增量算法、分布式算法方案,核心思想在于“世界的真實,模型的本質(zhì),都是稀疏的”,鎖少量資源,分布式地更新模型系數(shù)或者是梯度,這些算法在理論上得到突破后,往往依賴分析型數(shù)據(jù)庫或者大數(shù)據(jù)平臺靈活的并發(fā)調(diào)度,靈活的行列混合存儲模式,這一點是單機、小集群、傳統(tǒng)數(shù)據(jù)庫難以企及的;

數(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(), // 加隨機數(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)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 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){ //倒計時完成 $(".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); }