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

熱線電話:13121318867

登錄
首頁精彩閱讀作為一個(gè)專業(yè)的數(shù)據(jù)科學(xué)程序員需要具備些什么
作為一個(gè)專業(yè)的數(shù)據(jù)科學(xué)程序員需要具備些什么
2016-10-20
收藏

作為一個(gè)專業(yè)的數(shù)據(jù)科學(xué)程序員需要具備些什么

我作為一個(gè)數(shù)據(jù)科學(xué)家的經(jīng)歷跟我在書本和博客上所讀到的根本不一樣。我曾讀到過為數(shù)字超級新星公司工作的數(shù)據(jù)科學(xué)家,他們聽上去像是英雄,可以寫出自動化(近乎有感知能力的)算法并不斷地大量獲取認(rèn)知結(jié)果。我也讀到過像百戰(zhàn)天龍那樣的數(shù)據(jù)科學(xué)家黑客,他們可以通過將他們周圍有的任意原始材料拼湊出數(shù)據(jù)產(chǎn)品來拯救世界。

我的團(tuán)隊(duì)創(chuàng)建的數(shù)據(jù)產(chǎn)品并沒有重要到可以評價(jià)大型的企業(yè)級基礎(chǔ)設(shè)施。只是我覺得,投資超高效的自動化以及產(chǎn)品控制是不值得的。另一方面,我們的數(shù)據(jù)產(chǎn)品影響了企業(yè)中的重要決策,并且我們的努力是可測量,這一點(diǎn)十分重要。我們負(fù)擔(dān)不起總是將所有的事情人為來做,但我們也需要高效的方法來為成千上萬的人們共享結(jié)果。

現(xiàn)實(shí)中大部分還是 “常規(guī)”的數(shù)據(jù)科學(xué)家。我們比黑客們更有組織但是并不需要一個(gè)超級英雄般的數(shù)據(jù)科學(xué)老巢。我們一組人聚在一起進(jìn)行思維碰撞,我們在此對于寫出穩(wěn)定的代碼的最佳實(shí)踐進(jìn)行頭腦風(fēng)暴。這篇文章是對這次對話的一個(gè)總結(jié),并且試圖將我們的知識收集起來,取其精華至于一處。

如何變得專業(yè)化

數(shù)據(jù)科學(xué)家需要具備一些軟件工程的技能,只不過并不是一個(gè)專業(yè)的軟件工程師所需要的所有技能。我將具備必要的數(shù)據(jù)產(chǎn)品工程技能的數(shù)據(jù)科學(xué)家稱為專業(yè)的數(shù)據(jù)科學(xué)程序員。專業(yè)并不是指類似一個(gè)證書或者多少小時(shí)的經(jīng)驗(yàn),我所指的是方法上的專業(yè)性。專業(yè)的數(shù)據(jù)科學(xué)程序員在他們建立數(shù)據(jù)產(chǎn)品的過程中是可以自我改正的。他們有著常見的策略來識別工作中的問題并糾正錯(cuò)誤。

專業(yè)的數(shù)據(jù)科學(xué)程序員不得不將一個(gè)假說用一個(gè)可以測試的程序來表達(dá)出來。數(shù)據(jù)科學(xué)編程在軟件工程中是獨(dú)特的,這是因?yàn)閿?shù)據(jù)科學(xué)家所處理的那些問題類型。巨大的挑戰(zhàn)在于數(shù)據(jù)科學(xué)本質(zhì)就是實(shí)驗(yàn)性的。這些挑戰(zhàn)經(jīng)常是困難的,數(shù)據(jù)是混亂的。對于很多這類問題,并沒有已知的解決方案和策略,通往解決方案的路是前所未有的,可能的解決方案都是步步為營取最優(yōu)來得出的。在下面的內(nèi)容中,我會介紹一個(gè)規(guī)范的、有生產(chǎn)力的試錯(cuò)的常見策略:將問題分成多個(gè)小步驟,分別嘗試解決方案,在過程中一直做出糾正和改進(jìn)。

像專業(yè)人士一樣思考

為了成為一個(gè)專業(yè)的數(shù)據(jù)科學(xué)程序員,你必須了解比系統(tǒng)是如何構(gòu)造的更多。你必須知道如何設(shè)計(jì)一個(gè)解決方案,在你有一個(gè)解決方案時(shí)你必須能夠識別出來,你也必須在你沒有完全理解你的方案時(shí)有所察覺。最后一點(diǎn)是你必須能夠自我糾錯(cuò)。當(dāng)你識別出你方法中的概念差異的時(shí)候,你能夠自己將其完善。為了以一個(gè)你可以自我糾錯(cuò)的方式來設(shè)計(jì)數(shù)據(jù)科學(xué)解決方案,我發(fā)現(xiàn)依照以下基本步驟是很有用的:觀察、理解、想象以及展示。

第一步:觀察。從掃描環(huán)境開始。做背景研究并對所有可能與你試圖解決的問題有關(guān)的細(xì)枝末節(jié)有所了解。以盡量寬廣的視野來看待你的問題。盡量多的發(fā)現(xiàn)場景并且收集各類不同的信息。

第二步:理解。將你發(fā)現(xiàn)的各種信息碎片抽象成符合黑板模式的元素。在這個(gè)階段,你正在將問題中的元素轉(zhuǎn)化為有意義的技術(shù)性的概念。理解問題是為可行的設(shè)計(jì)奠定基礎(chǔ)的關(guān)鍵步驟。

第三步:想象。根據(jù)你理解的技術(shù)概念,想象一些可以使你往目標(biāo)更近一步的實(shí)現(xiàn)。如果你不能想象出一個(gè)實(shí)現(xiàn),那么你可能在你觀察問題的時(shí)候錯(cuò)過了什么。

第四步:展示。首先將你的解決方案解釋給自己聽,然后是你的伙伴,然后是你的老板,最后是你的目標(biāo)客戶。每一次解釋只需要以傳達(dá)到你的觀點(diǎn)的正式程度即可:一次飲水機(jī)旁的短暫談話,一封電子郵件、一次15分鐘的散步。這是在成為一個(gè)自我糾錯(cuò)的專業(yè)數(shù)據(jù)程序員的過程中最重要的常規(guī)實(shí)踐。如果你的方案有任何漏洞,那么他們將會在你嘗試解釋的時(shí)候發(fā)現(xiàn)它。花點(diǎn)時(shí)間來填充這些溝通代溝,并且確保你可以恰當(dāng)?shù)亟忉寙栴}和針對它的解決方案。

像專業(yè)人士一樣設(shè)計(jì)

創(chuàng)建和發(fā)布一個(gè)數(shù)據(jù)產(chǎn)品的活動是多樣且復(fù)雜的,但是,一般來說,你將要做的會在阿利斯泰爾克羅爾(Alistair Croll )描述的大數(shù)據(jù)供應(yīng)鏈中所包含。

由于數(shù)據(jù)產(chǎn)品依照一個(gè)范式(實(shí)時(shí)、批量或者兩者的混合)來執(zhí)行,你很有可能發(fā)現(xiàn)你自己正在一個(gè)數(shù)據(jù)供應(yīng)鏈活動和一個(gè)數(shù)據(jù)范式的整合之中:注入和清理批量更新的數(shù)據(jù),建立一個(gè)算法來分析實(shí)時(shí)數(shù)據(jù),將批處理的結(jié)果進(jìn)行共享等。幸運(yùn)的是,黑板架構(gòu)模式給予了我們一個(gè)基礎(chǔ)的藍(lán)圖來應(yīng)用良好的軟件工程應(yīng)對這些場景。

黑板模式


黑板模式告訴我們通過將整個(gè)任務(wù)進(jìn)行劃分來找到一系列更小的自包含 的子任務(wù)的方式來解決問題。每一個(gè)子任務(wù)將你的假說轉(zhuǎn)化為一個(gè)更容易解決或是解法已知的假說。每一個(gè)任務(wù)逐漸改進(jìn)解決方案,并且理想的情況下通向一個(gè)可行的解決方案。

數(shù)據(jù)科學(xué)被工具所淹沒,每一個(gè)都有其獨(dú)特的優(yōu)點(diǎn)。生產(chǎn)力是很重要的,我喜歡讓我的團(tuán)隊(duì)選擇任何他們最熟悉的工具。使用黑板模式使得從一系列不同的技術(shù)來構(gòu)建數(shù)據(jù)產(chǎn)品變得可行。算法之間的協(xié)作通過共享數(shù)據(jù)倉庫來發(fā)生。每一個(gè)算法可以獲取數(shù)據(jù),將它們作為輸入并且將結(jié)果返回給數(shù)據(jù)倉庫為其他的算法作為輸入。

最后,所有的算法都通過使用單個(gè)代表用來解決問題的啟發(fā)者的控制組件來互相協(xié)作??刂破魇悄阋呀?jīng)選擇的解決問題的策略的實(shí)現(xiàn)。這是最高層面的對問題的抽象和理解,這是由可以交互的并且決定所有算法順序的技術(shù)所實(shí)現(xiàn)的。控制器可以是像一個(gè)cron的定時(shí)任務(wù)或者腳本一樣的自動化組件?;蛘呖梢允侨斯さ?,按照順序執(zhí)行不同步驟。但總體來說,這是解決問題的根本策略。這是一個(gè)你可以從頭到尾了解問題解決方案的地方。

圖片由Jerry Overton提供

這一基本的方法已被證明在構(gòu)建必須通過不完全數(shù)據(jù)解決不確定的、假設(shè)的問題的軟件系統(tǒng)時(shí)是有用的。最棒的一部分是它使得我們通過確定的部分在不確定的問題上獲得進(jìn)展。不幸的是,我們并不保證你的努力真的一定會解決問題。你最好盡早知道如果你走的路是不起作用的。你需要 通過你實(shí)現(xiàn)系統(tǒng)的順序來完成。


像專業(yè)人士一樣構(gòu)建

你不一定非要以固定的順序來構(gòu)筑數(shù)據(jù)產(chǎn)品的元素(例如,先建立數(shù)據(jù)倉庫,然后是算法,然后是控制器)。專業(yè)的方法是按照最高的技術(shù)風(fēng)險(xiǎn)來構(gòu)建。從最高風(fēng)險(xiǎn)的元素先開始。一個(gè)元素會因?yàn)楹芏嘣虺蔀榧夹g(shù)風(fēng)險(xiǎn)。最有風(fēng)險(xiǎn)的部分可能是那個(gè)有著最高工作負(fù)載的或者是你最不了解的部分。

你可以通過專注于單個(gè)元素然后解決其他的方式以任意順序構(gòu)建組件。例如,如果你決定從構(gòu)建算法開始,無視數(shù)據(jù)輸入并且定義一個(gè)臨時(shí)點(diǎn)來寫入算法輸出。

圖片由Jerry Overton提供

然后,以技術(shù)風(fēng)險(xiǎn)高低的順序?qū)崿F(xiàn)數(shù)據(jù)產(chǎn)品:風(fēng)險(xiǎn)最高的元素最先開始。專注于一個(gè)特定的元素,無視其他的,稍后再替換它們。

這里的關(guān)鍵是以小塊的方式構(gòu)建并執(zhí)行:以你理解的小步驟來寫算法,一個(gè)數(shù)據(jù)源一次的方式構(gòu)建數(shù)據(jù)倉庫,以及一個(gè)算法執(zhí)行步驟一次的方式構(gòu)建你的控制器。目標(biāo)是總是有一個(gè)可以工作的數(shù)據(jù)產(chǎn)品,只不過它只有到最后才是功能完備的。

專業(yè)人士的工具

每一個(gè)專業(yè)人員需要有質(zhì)量的工具。有太多的選擇可以使用。下面列出了一些公認(rèn)最常用的工具,我附上了鏈接使得你們可以了解更多信息:

數(shù)據(jù)可視化

D3.js: D3.js (或者D3, 數(shù)據(jù)驅(qū)動文檔) 是一個(gè)JavaScript 庫,旨在在瀏覽器中建立動態(tài)的可交互的數(shù)據(jù)可視化。它利用了廣泛被實(shí)現(xiàn)的SVG, HTML5以及 CSS 標(biāo)準(zhǔn)。

版本控制:

GitHub: GitHub 是一個(gè)基于網(wǎng)絡(luò)的Git倉庫服務(wù),它提供了所有的Git的分布式修訂控制和源代碼管理功能,也添加了它自己的功能特性。GitHub提供了一個(gè)基于網(wǎng)絡(luò)的圖形化界面和移動端的桌面應(yīng)用。

編程語言:

R: R 是一個(gè)針對統(tǒng)計(jì)計(jì)算和圖形化的編程語言及軟件環(huán)境。R語言在統(tǒng)計(jì)學(xué)家和開發(fā)統(tǒng)計(jì)軟件和數(shù)據(jù)分析的數(shù)據(jù)挖掘者中被廣泛使用。

Python: Python 是一種被廣泛使用的通用的高層次的編程語言。它的設(shè)計(jì)理念強(qiáng)調(diào)代碼的可讀性,它的語法允許編程人員用比C 和Java更少的代碼來表達(dá)概念。

Scala: Scala 是一種針對通用軟件應(yīng)用的對象函數(shù)式編程語言。Scala有著對函數(shù)式編程的全面支持,以及一個(gè)非常健壯的靜態(tài)類型系統(tǒng)。這使得用Scala寫的程序非常簡潔因而比其他通用編程語言尺寸更小。

Java: Java 是一種通用的計(jì)算機(jī)編程語言,它是并發(fā)的、基于類的、面向?qū)ο蟮?、特別為了減少實(shí)現(xiàn)依賴而設(shè)計(jì)的。它旨在讓應(yīng)用“一次編寫,隨處執(zhí)行”

Hadoop生態(tài)系統(tǒng):

HadoopHadoop 是一個(gè)用Java開發(fā)的開源的軟件框架,為了在基于商業(yè)硬件的計(jì)算機(jī)集群上進(jìn)行分布式存儲和分布式處理海量數(shù)據(jù)集。

Pig: Pig 是一個(gè)為了創(chuàng)建Hadoop之上MapReduce程序的高層平臺

HiveHive 是一個(gè)在Hadoop之上構(gòu)建的數(shù)據(jù)倉庫基礎(chǔ)結(jié)構(gòu),旨在提供數(shù)據(jù)匯總、查詢和分析。

Spark: Spark的內(nèi)存原語操作為某些應(yīng)用提供了高達(dá)100倍的性能提升

結(jié)束語:本文來自哪里

這篇文章起始于一次偶然的關(guān)于我的團(tuán)隊(duì)中正面臨的生產(chǎn)力問題的討論。我們最終將問題追溯到技術(shù)平臺和我們的軟件工程知識。我們需要在我們的軟件工程實(shí)踐中補(bǔ)上漏洞,但是每次的經(jīng)驗(yàn)都太抽象或是太細(xì)節(jié)(對于專業(yè)的軟件開發(fā)者來說)。我是一個(gè)由外至內(nèi)數(shù)據(jù)科學(xué)方法的擁護(hù)者,我決定主辦一個(gè)開放的群聊來討論這些事。

我們獲得了相當(dāng)大的參與度:30分鐘之內(nèi)有179條發(fā)布;600個(gè)觀點(diǎn),以及28000多個(gè)訪問。我主持了討論并基于最有影響力的答案總結(jié)了我們的發(fā)現(xiàn),然后我將那個(gè)總結(jié)作為本文的基礎(chǔ)。我想要感謝所有那些參加了這一過程的人們,并花一些時(shí)間來認(rèn)可他們的貢獻(xiàn)。

數(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); }