如何弄懂演算法
① 演算法不難懂,可是想破腦袋都看不懂用代碼實現的演算法怎麼辦
演算法一般是為了解決特定問題而存在的,如果看不懂;可以嘗試從問題出發
了解演算法是如何一步一步解決問題中的模塊,進而知道演算法的每一句代碼是做什麼的
所以你可以找一個例子,然後單步調試代碼;多次運行,查看結果之間的關聯
② 如何研究學習一個機器學習演算法
如何研究學習一個機器學習演算法
1. 還記得我剛來演算法組的時候,我不懂TFIDF是什麼,更不要說什麼SVD,LDA了聽都沒聽過,不懂user-based和item-based的區別,甚至連貝葉斯公式都寫不全。在最初的一段時間,我看別人的代碼,半懂不懂地聽組會分享,然後實現一個又一個現在看來很幼稚的演算法,感覺進步是飛速的。接過來一個演算法需求,我就去網上找篇paper,然後把演算法給實現了就丟給產品線用。
這個時候,同事A對我講,「演算法工程師不是懂一些數學,會寫些演算法就行了,演算法工程師最重要的技能,在於如何定義問題,然後接下來才是如何解決這個問題。」從那以後,當面臨一個需求時,我更願意分析這個需求的關鍵點在哪,然後從大腦里搜索已有的東西能不能解決這個問題,比如FM的演算法缺乏多樣性,那麼我想一下我看過的解決多樣性的paper都有什麼?能不能用在這個上面。如果不能,我再對應去搜問題的關鍵字,而不是演算法的關鍵字。
2. 轉眼間一年過去了,雖說看過的paper不夠多,但是可以應付大部分的需求了。但是我開始迷茫起來,我覺得自己在實現一個又一個的演算法trick,知道一個演算法可以用,我就去網上down一個對應的演算法包,然後把數據丟進去。沒了......那麼我的出路到底在哪?我的核心競爭力在哪?在於知道這么個東西,然後變成跑准備數據的么?
這個時候,同事B給我講了到底博士是如何完成一個畢業設計的,幾百篇論文作為基礎。那是不是把幾百篇論文全都和我以前一樣一字不差的看完?PHD為什麼很容易進入到一個他之前所未知的領域,在於在研究領域所積累的一套方法論。言歸正傳:
當接觸到一個新的演算法時要怎麼去入手?用SVM舉例吧:
第一,去找SVM的Survey,每一個成熟的演算法分支必定有著survey這樣的匯總性paper,通過這個paper,我們大致可以了解這個演算法為什麼出現,最基本的演算法原型是什麼樣的,接下來後人對他做了什麼樣的改進,他到底還有什麼問題。
第二,弄懂這個演算法的來龍去脈,為什麼出現,出現是因為改進了前面演算法所不能做的什麼事情?例如我們為什麼不用基本的線性分類器?和用傳統的分類演算法找到一個超平面區別在於哪?
第三,知道了來龍去脈,我們還要知道這個演算法的缺點在哪?不能適用於什麼?我們怎麼知道?這個就涉及到如何來快速地過一遍一篇paper。
第四,Abstract是最重要的,他告訴了我們這篇paper發的目的是什麼?他想解決什麼問題?然後是Future Work,之所以有著FutureWork是因為這個演算法還有一些問題沒有解決,這個就告訴了我們當前演算法還有什麼缺點?
第五,遞歸再去看這個缺點是否有其他的研究者已經解決掉了。
那麼我們為什麼看paper,為什麼實現某演算法,我歸結為兩點:
1. 學習目的,擴展思路,如果處於這種目的,理解paper的精髓是最重要的。
2. 解決實際問題。那麼應該丟棄的觀點是我最初那樣拿過來一篇paper也沒理解透徹也不知道能不能解決問題,也不知道到底是不是可行,就先實現了再說。勞民傷財~
3. 我自認為自己還算努力,看了很多書,看了很多演算法,但是其實有時候說起來,比如用PCA還是SVD,他們到底有什麼區別,我們如何選擇,我其實還是不明白。
這時,同事C對我說,理解一個演算法,最重要的是要理解這個演算法的世界觀,這個演算法背後的哲學基礎是什麼?只有理解了這個,才算理解一個演算法。
用Boosting來舉例,他背後的世界觀是PAC原則。那麼Boosting為什麼不能引入一個強分類器,因為這個做個類比就相當於Boosting原本是美國的民主政治,一旦引入了一個強勢的領導,就一下子變成了當年毛爺爺時候的政治了。Boosting的世界觀就崩塌掉了。至於說Boosting最終是如何調整數據集的權重,這些就都屬於了細節的層面。
最後,補充一個同事D,無意間的話讓我發覺自己要變得更優秀才行:
同事D在搜Resys,有一個快照上面寫著:本科生Resys十佳論文。同事扭頭對我說,靠,現在本科生都可以發Resys paper了。讓我意識到了自己其實在原本上差距有多大,我要付出更大的努力才能彌補這些也許別人覺得無法跨越的鴻溝。
③ 求數據結構和演算法大神分享一下學習它們的一些方法或經驗。不甚感激!
一樓這打醬油的我也是醉了。。
數據結構和演算法是很抽象的。。和編譯原理,操作系統,並稱本專業最難課程了。。
你首先弄懂原理,再看基於某種語言的數據結構實現(C,CPP,java等)。其次看懂演算法的原理,KMP啊,排序,查找等到。。再看語言的實現。。
總的來說就兩部:看懂原理,再看實現。這個急不來的,數據結構和演算法一定要放多點時間。到一定地步了(所有數據結構和經典演算法都弄懂了),建議你買寫「教你如何設計演算法的書籍」看看。開始進軍演算法的設計。。
我的理解數據結構和類型基本上一樣。都是寫給人看的。因為在計算機存儲的只是兩種模式:順序和鏈式。現實世界有某某問題需要用到計算機解決,而該問題又依附在某某數據結構上(例如村莊布線需要用到最小生成樹,尋找點用到最短路徑等等。。)而演算法是某類型對於處理問題的一個封裝,例如:類也可以說是一個數據結構了。。
④ 我現在再自學C語言,但是到了演算法的時候就一點也看不懂了,怎麼辦,我想得到詳細的解釋
找一個學習小組。 討論著學習。
學習語言不要光看 。 自己把例子試著運行一遍。一步一步理解。然後改掉其中一些代碼來應正自己的想法。
⑤ 如何通俗易懂地解釋遺傳演算法有什麼例子
相信遺傳演算法的官方定義你已經看過,就我個人理解
遺傳演算法的思想是物競天擇,優勝劣汰。
你可以理解為,當我們解某道數學題時,如果這個題太難我們沒法列公式算出正確答案,我們有時候也可以蒙答案去反過來看看是否滿足這道題提乾的要求,如果能滿足,說明我們蒙的答案是正確的。但是蒙對答案要試很多遍,每次隨機的去試數可能要試1000次才能蒙對。可是遺傳演算法可以讓我們科學的去蒙答案,每次蒙的答案都會比上一次蒙的更接近正確答案,這樣可能蒙十幾次我們就找到正確答案了。
希望我的回答對你理解GA有所幫助,望採納
⑥ C語言的些演算法看不懂怎麼辦
多看多做啊,還有程序一定要自己寫,還可以看看一些其他書,比如數值分析啊,數據結構啊!!可以看看
⑦ 如何淺顯易懂地解說 Paxos 的演算法
Paxos演算法解決的問題是在一個可能發生消息可能會延遲、丟失、重復的分布式系統中如何就某個值達成一致,保證不論發生以上任何異常,都不會破壞決議的一致性。
一個典型的場景是,在一個分布式資料庫系統中,如果各節點的初始狀態一致,每個節點都執行相同的操作序列,那麼他們最後能得到一個一致的狀態。為保證每個節點執行相同的命令序列,需要在每一條指令上執行一個「一致性演算法」以保證每個節點看到的指令一致。
一個通用的一致性演算法可以應用在許多場景中,是分布式計算中的重要問題。 節點通信存在兩種模型:共享內存和消息傳遞。Paxos演算法就是一種基於消息傳遞模型的一致性演算法。
分析Paxos演算法的目的
Paxos演算法的目的是為了解決分布式環境下一致性的問題。多個節點並發操縱數據,如何保證在讀寫過程中數據的一致性,並且解決方案要能適應分布式環境下的不可靠性(系統如何就一個值達到統一)。
Paxos演算法中,可分為4種角色:
Proposer:提議發起者,處理客戶端請求,將客戶端的請求發送到集群中,以便決定這個值是否可以被批准。
Acceptor:提議批准者,負責處理接收到的提議,他們的回復就是一次投票。會存儲一些狀態來決定是否接收一個值。
Client:產生議題者,Proposer就像Client的使者,由Proposer使者拿著Client的議題去向Acceptor提議,讓Acceptor來決策。
Learner:最終決策學習者,最終學習的目標是Acceptor們最終接受了什麼議題?
只有被提出來的建議才能被大家同意。
最終只能確定一個建議。
如果某個人認為大家同意了某 個建議,那麼這個建議必須真的是被大家同意的。
Paxos演算法的原理
例如:公司商定年會舉辦的地點,每個人都可以提出建議。在現實環境中我們可以在一個會議室共同討論或在微信群中討論(基於內存共享方式);但在基於消息傳遞的分布式環境中每個人只能通過手機簡訊與其它人通過。如何在這種會延遲、丟失的環境中確定一個年會舉辦地點。
Paxos演算法是這樣解決這個問題:
每個人都可以提出建議、同意建議、接受建議
少數服從多數。只要建議被多數人同意即可確定該建議。
於是確定以下討論方式:
Paxos演算法圖解
在實現環境中會通過一次提議,選擇一個Leader。後續所有的提議都只能由Leader提出。
原來paxos演算法里的角色都是這樣的不靠譜,不過沒關系,結果靠譜就可以了。該演算法就是為了追求結果的一致性。
原文鏈接:什麼是Paxos演算法?Paxos演算法是區塊鏈核心演算法之一
⑧ 看不懂演算法,買了C程序設計,演算法到底干什麼的。
演算法其實就是將解決一個問題的思路用C語言(或其他程序設計語言)描述出來,比如:一個整數序列,要將其按從小到大的順序進行排列,就有插入排序、選擇排序、冒泡排序、堆排序等多種演算法來實現,這些演算法書上都有講解,如果你剛開始學的話,首先各種數據類型(int、float...)、操作(+、-、++、--、<<、>>......)、數據結構(數組、鏈表、堆棧、隊列......)這些得先明白的,從最簡單的A+B開始學,逐步深入,練習和學習各種演算法可以去POJ(http://poj.org/)等各大OJ上去做題,題目量多,可到網上去搜題目類型的分類……敲的挺累的,希望有所幫助!!
⑨ 數據結構中的常用演算法有哪些呀,對於初學者應該怎樣把它學好呀
基本:
線性表,鏈表,棧,隊列
排序:
快速排序,堆排序,歸並排序,希爾排序,插入排序,選擇排序
二叉樹:
前序,中序,後序遍歷,層次遍歷,包括遞歸演算法和非遞歸演算法兩種
AVL樹,Huffman編碼
二叉樹和樹,森林之間的轉換,穿線樹
圖演算法:
深度優先遍歷演算法,廣度優先遍歷演算法,最小生成樹,最短路徑
字元串:
查找子串,KMP演算法等。
初學者一定要弄懂這些基本的演算法。還有,要多動手練習書上的演算法,代碼是敲出來的。對於考試而言,多看看老師劃的重點足矣。