大數據演算法題
1. 演算法面試
我在《再談「我是怎麼招程序員」》中比較保守地說過,「問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。」,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——「找出無序數組中第2大的數」,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標准答案。我們太習慣於標准答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標准答案,然後通過給你標准答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做?我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種「過早擴展」的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City& ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二?!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間復雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標准答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——「從無序數組中找到第K個最大的數」,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間復雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大?如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)復雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體復雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法復雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)復雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為「排序」這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人?是一個只會寫演算法的人,還是一個會做軟體的人?這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道「找出第K大的數」,其實可以變換為更為業務一點的題目——「我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價?(商家的所有商品的報價在一數組中)」——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學?千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢?我以為有下面這些東西:會不會做需求分析?怎麼理解問題的?解決問題的思路是什麼?想法如何?會不會對基礎的演算法和數據結構靈活運用?另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。
2. 大數據時代 無處不在的演算法應用
大數據時代 無處不在的演算法應用
能不能講講演算法在工作中的運用?你個人學習演算法的過程是怎樣的?我對演算法還是有點怕。除此之外,你認為大學是應該多花時間學應用技術還是理論知識呢?
今天就來聊聊我自己學習演算法的過程,以及演算法在實際工作中的應用。
以前,我們認為大數據總是優於好演算法。也就是說,只要數據量足夠大,即使演算法沒有那麼好,也會產生好的結果。
前一陣子「極客時間」 App 發布了一條極客新聞:「演算法比數據更重要,AlphaGo Zero 完勝舊版。」新聞的內容是谷歌人工智慧團隊 DeepMind 發布了新版的 AlphaGo 計算機程序,名為 AlphaGo Zero。這款軟體能夠從空白狀態開始,不需要人類輸入任何命令,便可以迅速自學圍棋,並以 100 比 0 的戰績擊敗了上一代 AlphaGo。
AlphaGo Zero 最大的突破在於實現了「白板理論」。白板理論認為:嬰兒是一塊白板,可以通過後天學習和訓練來提高智力。AI 的先驅圖靈認為,只要能用機器製造一個類似於小孩的 AI,然後加以訓練,就能得到一個近似成人智力,甚至超越人類智力的 AI。
自學成才的 AlphaGo Zero 正是實現了這一理論。AlphaGo 的首席研究員大衛·席爾瓦(David Silver)認為,從 AlphaGo Zero 中可以發現,演算法比所謂的計算或數據量更為重要。事實上,AlphaGo Zero 使用的計算要比過去的版本少一個數量級,但是因為使用了更多原理和演算法,它的性能反而更加強大。
由此可見,在大數據時代,演算法的重要性日漸明晰。一個合格的程序員,必須掌握演算法。
我不知道大家是怎樣一步步開始精通演算法和數據結構的。大二時,我第一次接觸到了《數據結構》,因為從來沒有過這方面的思維訓練,當時的我學習這門課比較費力。那時候接觸到的編程比較少,所以並沒有很多實際經驗讓我欣賞和體味:一個好的數據結構和演算法設計到底 「美」 在哪裡。
開始學習的時候,我甚至有點死記硬背的感覺,我並不知道 「如果不這樣設計」,實際上會出現哪些問題。各種時間和空間復雜度對我而言,也僅僅是一些不能融入到實際問題的數學游戲。至於「每種最壞情況、平均情況的時間空間復雜度與各種排序」,這些內容為什麼那麼重要,當時我想,可能因為考試會考吧。
沒想到後來的時日,我又與演算法重新結緣。可能是因為萊斯大學給的獎學金太高了,所以每個研究生需要無償當五個學期的助教 。好巧不巧,我又被演算法老師兩次挑中當助教。所以,在命運強制下,一本《演算法導論》就這樣被我前前後後仔細學習了不下四遍。這樣的結果是,我基本做過整本書的習題,有些還不止做了一遍。我學習演算法的過程,就是反復閱讀《演算法導論》的過程。
那麼,學習演算法到底有什麼用處呢?
首先,演算法是面試的敲門磚國內的情況我不太清楚,但就矽谷的 IT 公司而言,不但電話面試偏演算法,現場面試至少有兩輪都是考演算法和編程的。
大一些老一些的公司,像谷歌、Facebook、領英、Dropbox 等,都是直接在白板上寫程序。小一些新一些的公司,如 Square、Airbnb 等,都是需要現場上機寫出可運行的程序。Twitter、Uber 等公司則是白板上機兼備,視情況而定。
雖說還有其它考系統設計等部分,但如果演算法沒有打好基礎,第一關就很難過,而且演算法要熟悉到能夠現場短時間內寫出正解,所以很多人准備面試前都需要刷題。
有一次我當面試官,電話面試另外一個人,當時是用 Codepad 共享的方式,讓對方寫一個可運行的正則表達式解析器。45 分鍾過去了,對方並沒有寫出來。我就例行公事地問:「你還有什麼問題想問或者想了解么?」 對方估計因為寫不出程序很有挫敗感,就反問:「你們平時工作難道就是天天寫正則表達式的解析器么?」
一瞬間,我竟無言以對。想了想,我回復說:「不用天天寫。那我再給你 15 分鍾,你證明給我看你還會什麼,或者有什麼理由讓我給你進一步面試的機會?」 對方想了一會,默默掛掉了電話。
老實說,我對目前面試中偏重演算法的程度是持保留意見的。演算法題答得好,並不能說明你有多牛。牛人也有因為不願刷題而馬失前蹄的時候。但是除了演算法測試,顯然也沒有更好的方法佐證候選人的實力;然而怎樣才能最優化面試流程,這也是個討論起來沒完的話題,並且每次討論必定無果而終。
其次,編程時用到的更多是演算法思想,而不是寫具體的演算法說到實際工作中真正需要使用演算法的機會,讓我想一想 —— 這個范圍應該在 10% 的附近遊走。
有些朋友在工作中遇到演算法場景多些,有的少些。更多的時候,是對業務邏輯的理解,對程序語言各種特性的熟練使用,對代碼風格和模式的把握,各種同步非同步的處理,包括代碼測試、系統部署是否正規化等等。需要設計甚至實現一個演算法的機會確實很少,即使用到,現學可能都來得及。
但是熟悉基本演算法的好處在於:如果工作需要讀的一段代碼中包含一些基本演算法思想,你會比不懂演算法的人理解代碼含義更快。讀到一段爛代碼,你知道為什麼爛,爛在哪,怎麼去優化。
當真的需要在程序中設計演算法的時候,熟悉演算法的你會給出一個更為完備的方案,對程序中出現的演算法或比較復雜的時間復雜度問題你會更有敏感性。熟悉演算法你還可以成為一個更優秀的面試官,可以和別的工程師聊天時候不被鄙視。
最後,不精通演算法的工程師永遠不是好工程師當然,除了演算法導論中那些已成為經典的基本演算法以及演算法思想(Divide-and-conquer,Dynamic programming)等,其實我們每天接觸到的各種技術中,演算法無處不在。
就拿人人都會接觸的存儲為例吧,各種不同的資料庫或者鍵值存儲的實現,就會涉及各種分片(Sharding)演算法、緩存失敗(Cache Invalidation)演算法、 鎖定(Locking)演算法,包括各種容錯演算法(多復制的同步演算法)。 雖然說平時不太會去寫這些演算法 —— 除非你恰恰是做資料庫實現的 —— 但是真正做到了解這項技術的演算法細節和實現細節,無論對於技術選型還是對自己程序的整體性能評估都是至關重要的。
舉個例子,當你在系統里需要一個鍵值存儲方案的時候,面對可供選擇的各種備選方案,到底應該選擇哪一種呢?
永遠沒有一種方案在所有方面都是最佳的。就拿 Facebook 開源的 RocksDB 來說吧。了解它歷史的人都知道,RocksDB 是構建在 LevelDB 之上的,可以在多 CPU 伺服器上高效運行的一種鍵值存儲。而 LevelDB 又是基於谷歌的 BigTable 資料庫系統概念設計的。
早在 2004 年,谷歌開始開發 BigTable,其代碼大量的依賴谷歌內部的代碼庫,雖然 BigTable 很牛,卻因此無法開源。2011 年,谷歌的傑夫·迪恩和桑傑·格瑪沃爾特開始基於 BigTable 的思想,重新開發一個開源的類似系統,並保證做到不用任何谷歌的代碼庫,於是就有了 LevelDB。這樣一個鍵值存儲的實現也用在了谷歌瀏覽器的 IndexedDB 中,對於谷歌瀏覽器的開源也提供了一定的支持。
我曾經在文章中提到過 CockroachDB,其實又可以看作是基於 RocksDB 之上的一個分布式實現。從另一個層面上講,CockroachDB 又可以說是 Spanner 的一個開源實現。知道這些,就知道這些資料庫或鍵值存儲其實都同出一系。再來看看 LevelDB 底層的 SSTable 演算法,就知道他們都是針對高吞吐量(high throughput),順序讀 / 寫工作負載(sequential read/write workloads)有效的存儲系統。
當然,一個系統里除了最基本的演算法,很多的實現細節和系統架構都會對性能及應用有很大的影響。然而,對演算法本身的理解和把握,永遠是深入了解系統不可或缺的一環。
類似的例子還有很多,比如日誌分析、打車軟體的調度演算法。
拿我比較熟悉的支付領域來說吧,比如信用卡 BIN 參數的壓縮,從服務端到移動 App 的數據傳輸,為了讓傳輸數據足夠小,需要對數據進行壓縮編碼。
每個國家,比如中國、韓國、墨西哥信用卡前綴格式都不一樣,如何盡量壓縮同時又不會太復雜,以至於影響移動 App 端的代碼復雜度,甚至形成 Bug 等,也需要對各種相關演算法有詳盡地了解,才有可能做出最優的方案。
關於演算法我們來總結一下:
在大數據時代,數據和演算法都同等重要,甚至演算法比計算能力或數據量更為重要。
如何學習演算法呢?讀經典著作、做題,然後在實踐中閱讀和使用演算法。
演算法是面試的敲門磚,可以幫助你得到一份自己喜歡的工作。
寫程序中用到的更多是演算法思想,不是寫具體的演算法。
不精通演算法的工程師永遠不會是一個優秀的工程師,只有對各種相關演算法有詳盡理解,才有可能做出最優的方案。
3. 大數據的新演算法:簡化數據分類
大數據的新演算法:簡化數據分類
如今,大數據時代悄然來臨。專家用「大數據」的表達描述大量信息,比如數十億人在計算機、智能手機以及其他電子設備上分享的照片、音頻、文本等數據。當前這種模式為我們的未來展現了前所未有的願景:比如追蹤流感疫情蔓延,實時監控道路交通,處理緊急自然災害等。對人們而言,想要利用這些龐大的數據,首先必須要了解它們,而在此之前我們需要一種快捷有效自動的方式對數據進行分類。
其中一種最為常用的系統,是一系列稱之為簇分析的統計技術,這種技術能依據數據的「相似性」進行數據分組。來自義大利國際高等研究院(SISSA)的兩位研究者基於簡單且強大的原理設計了一種簇分析方法,被證明可以非常有效地解決一些大數據分析中遇到的主要典型問題。
數據集合可以視為多維空間的雲數據點。這些點呈現不同分配方式:或稀疏地分布在一個區域,或密集地分布在另外一個區域。簇分析就是用來有效地鑒別密集型區域,基於基本的准則將數據分為一定數量的重要子集合,每個子集合對應一種分類。
「以一個面部圖像資料庫為例,」SISSA統計與生物物理系教授Alessandro Laio說,「資料庫可能包含同一個人的多張照片,簇分析可以用來歸類同一人的所有照片。這種類型的分析可用自動臉部識別系統來完成。」
「我們試著設計一種較現有方法更為有效的演算法,來解決簇分析中典型的問題。」Laio繼續補充說。
「我們的方法基於一種新的鑒定簇中心,比如子集合,」另一位研究者Alex Rodriguez解釋道,「試想這樣的情形,在無法訪問地圖中,卻不得不鑒定全球所有的城市時,這無疑是一個艱巨的任務。」Rodriguez進一步解釋道,「因此我們在做一種探索式的識別,嘗試尋找一條簡單的規則或是一種捷徑來達成目標。」
「為了確定一個地方是否達到城市級別規模,我們可以讓當地居民計數自己的『鄰居』,換句話說,他房子的100米內住了多少人。一旦得到這個數字,我們繼續去確認每一個居民,他們身邊最近的擁有最多鄰居數的居民。藉助這兩組數據結果交叉的部分,就可以推斷每個人所在居住區域人口的稠密程度,以及擁有鄰居數最多的兩家間距。就全球人口而言,通過自動交叉檢測這些數據,我們能識別代表簇狀中心的個體,這些個體就是不同的城市。」 Laio解釋道。
「我們的演算法能夠精確地完成此類計算,也適用於其他場景,」Rodriguez進一步補充說,此演算法表現相當優異。Rodriguez對此有著深刻理解:「借用面部數據檔案Olivetti Face資料庫,我們測試了自己的數學模型,並獲得了滿意的結果。此系統能夠正確地識別大部分個體,從不產生假陽性結果,這意味著在某些情況下,它可能無法識別事物,但絕不會混淆一個個體與另一個個體。與類似的方法相比,我們的演算法能夠有效地剔除異類,要知道這些異類的數據點與其他數據存在較大差異是會損毀分析結果的。」
以上是小編為大家分享的關於大數據的新演算法:簡化數據分類的相關內容,更多信息可以關注環球青藤分享更多干貨
4. 大數據分析的高級分析演算法
眾所周知,大數據分析的高級分析演算法過程為下游流程提供了更精確,價值更高的數據,這對於公司真正利用其數據的價值並實現其所需的結果至關重要。下面是小編整理的一些高級分析計劃中使用的一些最受歡迎的演算法。每種方法都有優缺點,可以有效地利用它來產生業務價值的方式也不同。實施這些演算法的最終目標是進一步優化數據,使結果信息可以應用於業務決策。
5. 大數據分析之聚類演算法
大數據分析之聚類演算法
1. 什麼是聚類演算法
所謂聚類,就是比如給定一些元素或者對象,分散存儲在資料庫中,然後根據我們感興趣的對象屬性,對其進行聚集,同類的對象之間相似度高,不同類之間差異較大。最大特點就是事先不確定類別。
這其中最經典的演算法就是KMeans演算法,這是最常用的聚類演算法,主要思想是:在給定K值和K個初始類簇中心點的情況下,把每個點(亦即數據記錄)分到離其最近的類簇中心點所代表的類簇中,所有點分配完畢之後,根據一個類簇內的所有點重新計算該類簇的中心點(取平均值),然後再迭代的進行分配點和更新類簇中心點的步驟,直至類簇中心點的變化很小,或者達到指定的迭代次數。
KMeans演算法本身思想比較簡單,但是合理的確定K值和K個初始類簇中心點對於聚類效果的好壞有很大的影響。
聚類演算法實現
假設對象集合為D,准備劃分為k個簇。
基本演算法步驟如下:
1、從D中隨機取k個元素,作為k個簇的各自的中心。
2、分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。
3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。
4、將D中全部元素按照新的中心重新聚類。
5、重復第4步,直到聚類結果不再變化。
6、將結果輸出。
核心java代碼如下:
/**
* 迭代計算每個點到各個中心點的距離,選擇最小距離將該點劃入到合適的分組聚類中,反復進行,直到
* 分組不再變化或者各個中心點不再變化為止。
* @return
*/
public List[] comput() {
List[] results = new ArrayList[k];//為k個分組,分別定義一個聚簇集合,未來放入元素。
boolean centerchange = true;//該變數存儲中心點是否發生變化
while (centerchange) {
iterCount++;//存儲迭代次數
centerchange = false;
for (int i = 0; i < k; i++) {
results[i] = new ArrayList<T>();
}
for (int i = 0; i < players.size(); i++) {
T p = players.get(i);
double[] dists = new double[k];
for (int j = 0; j < initPlayers.size(); j++) {
T initP = initPlayers.get(j);
/* 計算距離 這里採用的公式是兩個對象相關屬性的平方和,最後求開方*/
double dist = distance(initP, p);
dists[j] = dist;
}
int dist_index = computOrder(dists);//計算該點到各個質心的距離的最小值,獲得下標
results[dist_index].add(p);//劃分到對應的分組。
}
/*
* 將點聚類之後,重新尋找每個簇的新的中心點,根據每個點的關注屬性的平均值確立新的質心。
*/
for (int i = 0; i < k; i++) {
T player_new = findNewCenter(results[i]);
System.out.println("第"+iterCount+"次迭代,中心點是:"+player_new.toString());
T player_old = initPlayers.get(i);
if (!IsPlayerEqual(player_new, player_old)) {
centerchange = true;
initPlayers.set(i, player_new);
}
}
}
return results;
}
上面代碼是其中核心代碼,我們根據對象集合List和提前設定的k個聚集,最終完成聚類。我們測試一下,假設要測試根據NBA球員的場均得分情況,進行得分高中低的聚集,很簡單,高得分在一組,中等一組,低得分一組。
我們定義一個Player類,裡面有屬性goal,並錄入數據。並設定分組數目為k=3。
測試代碼如下:
List listPlayers = new ArrayList();
Player p1 = new Player();
p1.setName(「mrchi1」);
p1.setGoal(1);
p1.setAssists(8);
listPlayers.add(p1);
Player p2 = new Player();
p2.setName("mrchi2");
p2.setGoal(2);
listPlayers.add(p2);
Player p3 = new Player();
p3.setName("mrchi3");
p3.setGoal(3);
listPlayers.add(p3);
//其他對象定義此處略。製造幾個球員的對象即可。
Kmeans<Player> kmeans = new Kmeans<Player>(listPlayers, 3);
List<Player>[] results = kmeans.comput();
for (int i = 0; i < results.length; i++) {
System.out.println("類別" + (i + 1) + "聚集了以下球員:");
List<Player> list = results[i];
for (Player p : list) {
System.out.println(p.getName() + "--->" + p.getGoal()
}
}
演算法運行結果:
可以看出中心點經歷了四次迭代變化,最終分類結果也確實是相近得分的分到了一組。當然這種演算法有缺點,首先就是初始的k個中心點的確定非常重要,結果也有差異。可以選擇彼此距離盡可能遠的K個點,也可以先對數據用層次聚類演算法進行聚類,得到K個簇之後,從每個類簇中選擇一個點,該點可以是該類簇的中心點,或者是距離類簇中心點最近的那個點。
6. 需要掌握哪些大數據演算法
數據挖掘領域的十大經典演算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART。
1、C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3演算法。
2、2、k-means algorithm演算法是一個聚類演算法,把n的對象根據他們的屬性分為k個分割,k < n。
3、支持向量機,英文為Support Vector Machine,簡稱SV機(論文中一般簡稱SVM)。它是一種監督式學習的方法,它廣泛的應用於統計分類以及回歸分析中。
4、Apriori演算法是一種最有影響的挖掘布爾關聯規則頻繁項集的演算法。其核心是基於兩階段頻集思想的遞推演算法。
5、最大期望(EM)演算法。在統計計算中,最大期望(EM,Expectation–Maximization)演算法是在概率(probabilistic)模型中尋找參數最大似然 估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variabl)。
6、PageRank是Google演算法的重要內容。2001年9月被授予美國專利,專利人是Google創始人之一拉里·佩奇(Larry Page)。因此,PageRank里的page不是指網頁,而是指佩奇,即這個等級方法是以佩奇來命名的。
7、Adaboost是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器 (強分類器)。
8、K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。
9、Naive Bayes。在眾多的分類模型中,應用最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBC)。
10、CART, Classification and Regression Trees。 在分類樹下面有兩個關鍵的思想。
關於大數據演算法的相關問題推薦CDA數據分析師的相關課程,課程內容兼顧培養解決數據挖掘流程問題的橫向能力以及解決數據挖掘演算法問題的縱向能力。要求學生具備從數據治理根源出發的思維,通過數字化工作方法來探查業務問題,通過近因分析、宏觀根因分析等手段,再選擇業務流程優化工具還是演算法工具,而非「遇到問題調演算法包」點擊預約免費試聽課。
7. 大數據演算法有哪些
大數據是一個很廣的概念,並沒有大數據演算法這種東西,您估計想問的是大數據挖掘的演算法:
1.樸素貝葉斯
超級簡單,就像做一些數數的工作。如果條件獨立假設成立的話,NB將比鑒別模型收斂的更快,所以你只需要少量的訓練數據。即使條件獨立假設不成立,NB在實際中仍然表現出驚人的好。
2. 回歸
LR有很多方法來對模型正則化。比起NB的條件獨立性假設,LR不需要考慮樣本是否是相關的。與決策樹與支持向量機不同,NB有很好的概率解釋,且很容易利用新的訓練數據來更新模型(使用在線梯度下降法)。
3.決策樹
DT容易理解與解釋。DT是非參數的,所以你不需要擔心野點和數據是否線性可分的問題,此外,RF在很多分類問題中經常表現得最好,且速度快可擴展,也不像SVM那樣需要調整大量的參數,所以最近RF是一個非常流行的演算法。
4.支持向量機
很高的分類正確率,對過擬合有很好的理論保證,選取合適的核函數,面對特徵線性不可分的問題也可以表現得很好。SVM在維數通常很高的文本分類中非常的流行。
想要了解更多有關數據挖掘的信息,可以了解一下CDA數據分析師的課程。大數據分析師現在有專業的國際認證證書了, 「CDA 數據分析師」具體指在互聯網、金融、零售、咨詢、電信、醫療、旅遊等行業專門從事數據的採集、清洗、處理、分析並能製作業務報告、 提供決策的新型數據分析人才。全球 CDA 持證者秉承著先進商業數據分析的新理念,遵循著《CDA 數據分析師職業道德和行為准則》新規范,發 揮著自身數據科學專業能力,推動科技創新進步,助力經濟持續發展。點擊預約免費試聽課。
8. 大數據核心演算法有哪些
1、A* 搜索演算法——圖形搜索演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,A*搜索演算法是最佳優先搜索的範例。
2、集束搜索(又名定向搜索,Beam Search)——最佳優先搜索演算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。
3、二分查找(Binary Search)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。
4、分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。
5、Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。
6、數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。
7、Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。
8、Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。
9、離散微分演算法(Discrete differentiation)。
9. 求一種大數據分析的演算法
//群體數據的排序與查找 //1.直接插入排序的演算法實現: void InsertSort(int arrForSort[],int nLength) { int i,j,temp; for(i=1;i/遍歷整個序列 { temp=arrForSort[i]; for(j=i;j>0&&temp<arrForSort[j-1];j--) //將第i個元素插入到合適的位置 arrForSort[j]=arrForSort[j-1]; arrForSort[j]=temp; } } //2.直接選擇排序的演算法實現: void SelectSort(int arrForSort[],int nLength) { int min,temp, i,j; for(i=0;i<nLength-1;i++) { min=i; for(j=i+1;j<nLength;j++) //選出具有最小值的元素的下標標號 if(arrForSort[j]/第i個元素與具有最小值的元素進行交換 arrForSort[i]=arrForSort[min]; arrForSort[min]=temp; } } //3.起泡法排序的演算法實現: void BubbleSort(int arrForSort[],int nLength) { int i,j,temp; i=nLength-1; while(i>0) { for(j=0;j<i;j++) //1次起泡的過程 { if(arrForSort[j+1]/逆序交換 {temp=arrForSort[j+1]; arrForSort[j+1]=arrForSort[j]; arrForSort[j]=temp;} } i--; //准備下一次起泡序列的長度 } } //4.希爾排序的演算法實現: void ShellSort(int arrForSort[],int nLength) { int k,j,i,temp; k=nLength/2; //設置初始子序列的間隔 while(k>0) { for(j=k;j/子序列的插入排序 { temp=arrForSort[j];i=j-k; while((i>=0)&&(arrForSort[i]>temp)) { arrForSort[i+k]=arrForSort[i];i=i-k; } arrForSort[i+k]=temp; } k=k/2; //重新設置子序列的間隔 } return; } //5.順序查找的實現 int SequenceSearch(int arrForSearch[],int nLength,int nKey) { int i; for(i=0;i<nLength;i++) //遍歷整個序列 if(arrForSearch[i]==nKey) return i; return -1; } //6.折半查找的演算法實現 int MiddleSearch(int arrForSearch(int arrForSearch[],int nLength,int nKey) { int mid,top,bottom; bottom=0; //設置首末元素下標 top=nLength-1; while(bottom/取序列中間元素下標 if(arrForSearch[mid]==nKey) return mid; //如果找到該元素,返回其下標 else if(arrForSearch[mid]>nKey) top=mid-1; //在前半個序列中繼續查找 else bottom=mid+1; } return -1; }
10. java大數據頗有難度演算法
先指出一下樓主你給出的數據是沒辦法做
500000(50萬)個數最大值時20,要求和為80000000(8千萬)
500000x20=10000000(1千萬)連一半都不到,更何況20隻能出現10000次...
要求完成這個演算法沒有難度,只不數據量過於龐大,對程序員來說沒有難度,但是對設備來說壓力不小