1. 神經網路演算法
20 世紀五、六⼗年代,科學家 Frank Rosenblatt其受到 Warren McCulloch 和 Walter Pitts早期的⼯作的影響,發明了感知機(Perceptrons)。
⼀個感知器接受⼏個⼆進制輸⼊, ,並產⽣⼀個⼆進制輸出:
如上圖所示的感知機有三個輸⼊: 。通常可以有更多或更少輸⼊。 我們再引⼊權重: ,衡量輸入對輸出的重要性。感知機的輸出為0 或者 1,則由分配權重後的總和 ⼩於等於或者⼤於閾值決定。和權重⼀樣,閾值(threshold)是⼀個實數,⼀個神經元的參數。⽤更精確的代數形式如下:
給三個因素設置權重來作出決定:
可以把這三個因素對應地⽤⼆進制變數 來表⽰。例如,如果天⽓好,我們把
,如果不好, 。類似地,如果你的朋友陪你去, ,否則 。 也類似。
這三個對於可能對你來說,「電影好不好看」對你來說最重要,而天氣顯得不是那麼的重要。所以你會這樣分配權值: ,然後定義閾值threshold=5。
現在,你可以使⽤感知器來給這種決策建⽴數學模型。
例如:
隨著權重和閾值的變化,你可以得到不同的決策模型。很明顯,感知機不是⼈做出決策使⽤的全部模型。但是這個例⼦說明了⼀個感知機如何能權衡不同的依據來決策。這看上去也可以⼤致解釋⼀個感知機⽹絡有時確實能夠做出一些不錯的決定。
現在我們隊上面的結構做一點變化,令b=-threshold,即把閾值移到不等號左邊,變成偏置, 那麼感知器的規則可以重寫為:
引⼊偏置只是我們描述感知器的⼀個很⼩的變動,但是我們後⾯會看到它引導更進⼀步的符號簡化。因此,我們不再⽤閾值,⽽總是使⽤偏置。
感知機是首個可以學習的人工神經網路,它的出現引起的神經網路的第一層高潮。需要指出的是,感知機只能做簡單的線性分類任務,而且Minsky在1969年出版的《Perceptron》書中,證明了感知機對XOR(異或)這樣的問題都無法解決。但是感知機的提出,對神經網路的發展是具有重要意義的。
通過上面的感知機的觀察我們發現一個問題,每個感知機的輸出只有0和1,這就意味著有時我們只是在單個感知機上稍微修改了一點點權值w或者偏置b,就可能造成最終輸出完全的反轉。也就是說,感知機的輸出是一個階躍函數。如下圖所示,在0附近的時候,輸出的變化是非常明顯的,而在遠離0的地方,我們可能調整好久參數也不會發生輸出的變化。
這樣階躍的跳變並不是我們想要的,我們需要的是當我們隊權值w或者偏置b做出微小的調整後,輸出也相應的發生微小的改變芹則禪。這同時也意味值我們的輸出不再只是0和1,還可以輸出小數。由此我們引入了S型神經元。
S型神經元使用 S 型函數,也叫Sigmoid function函數,我們用它作為激活函數。其表達式如下:
圖像如下圖所示:
利⽤實際的 σ 函數,我們得到⼀個,就像上⾯說明的,平滑的感知器。 σ 函數的平滑特性,正是關鍵因素,⽽不是其細部形式盯明。 σ 的平滑意味著權重和偏置的微⼩變化,即 ∆w 和 ∆b,會從神經元產⽣⼀個微⼩的輸出變化 ∆output。實際上,微積分告訴我們
∆output 可以很好地近似表⽰為:
上面的式子是⼀個反映權重、偏置變化嫌塵和輸出變化的線性函數。這⼀線性使得我們可以通過選擇權重和偏置的微⼩變化來達到輸出的微⼩變化。所以當 S 型神經元和感知器本質上是相同的,但S型神經元在計算處理如何變化權重和偏置來使輸出變化的時候會更加容易。
有了對S型神經元的了解,我們就可以介紹神經網路的基本結構了。具體如下:
在⽹絡中最左邊的稱為輸⼊層,其中的神經元稱為輸⼊神經元。最右邊的,即輸出層包含有輸出神經元,在圖中,輸出層只有⼀個神經元。中間層,既然這層中的神經元既不是輸⼊也不是輸出,則被稱為隱藏層。
這就是神經網路的基本結構,隨著後面的發展神經網路的層數也隨之不斷增加和復雜。
我們回顧一下神經網路發展的歷程。神經網路的發展歷史曲折盪漾,既有被人捧上天的時刻,也有摔落在街頭無人問津的時段,中間經歷了數次大起大落。
從單層神經網路(感知機)開始,到包含一個隱藏層的兩層神經網路,再到多層的深度神經網路,一共有三次興起過程。詳見下圖。
我們希望有⼀個演算法,能讓我們找到權重和偏置,以⾄於⽹絡的輸出 y(x) 能夠擬合所有的 訓練輸⼊ x。為了量化我們如何實現這個⽬標,我們定義⼀個代價函數:
這⾥ w 表⽰所有的⽹絡中權重的集合, b 是所有的偏置, n 是訓練輸⼊數據的個數,
a 是表⽰當輸⼊為 x 時輸出的向量,求和則是在總的訓練輸⼊ x 上進⾏的。當然,輸出 a 取決於 x, w和 b,但是為了保持符號的簡潔性,我沒有明確地指出這種依賴關系。符號 ∥v∥ 是指向量 v 的模。我們把 C 稱為⼆次代價函數;有時也稱被稱為均⽅誤差或者 MSE。觀察⼆次代價函數的形式我們可以看到 C(w, b) 是⾮負的,因為求和公式中的每⼀項都是⾮負的。此外,代價函數 C(w,b)的值相當⼩,即 C(w; b) ≈ 0,精確地說,是當對於所有的訓練輸⼊ x, y(x) 接近於輸出 a 時。因
此如果我們的學習演算法能找到合適的權重和偏置,使得 C(w; b) ≈ 0,它就能很好地⼯作。相反,當 C(w; b) 很⼤時就不怎麼好了,那意味著對於⼤量地輸⼊, y(x) 與輸出 a 相差很⼤。因此我們的訓練演算法的⽬的,是最⼩化權重和偏置的代價函數 C(w; b)。換句話說,我們想要找到⼀系列能讓代價盡可能⼩的權重和偏置。我們將采⽤稱為梯度下降的演算法來達到這個⽬的。
下面我們將代價函數簡化為C(v)。它可以是任意的多元實值函數, 。
注意我們⽤ v 代替了 w 和 b 以強調它可能是任意的函數,我們現在先不局限於神經⽹絡的環境。
為了使問題更加簡單我們先考慮兩個變數的情況,想像 C 是⼀個只有兩個變數 和 的函數,我們的目的是找到 和 使得C最小。
如上圖所示,我們的目的就是找到局部最小值。對於這樣的一個問題,一種方法就是通過微積分的方法來解決,我們可以通過計算導數來求解C的極值點。但是對於神經網路來說,我們往往面對的是非常道的權值和偏置,也就是說v的維數不只是兩維,有可能是億萬維的。對於一個高維的函數C(v)求導數幾乎是不可能的。
在這種情況下,有人提出了一個有趣的演算法。想像一下一個小球從山頂滾下山谷的過程, 我們的⽇常經驗告訴我們這個球最終會滾到⾕底。我們先暫時忽略相關的物理定理, 對球體的⾁眼觀察是為了激發我們的想像⽽不是束縛我們的思維。因此與其陷進物理學⾥凌亂的細節,不如我們就這樣問⾃⼰:如果我們扮演⼀天的上帝,能夠構造⾃⼰的物理定律,能夠⽀配球體可以如何滾動,那麼我們將會採取什麼樣的運動學定律來讓球體能夠總是滾落到⾕底呢?
為了更精確地描述這個問題,讓我們思考⼀下,當我們在 和 ⽅向分別將球體移動⼀個很⼩的量,即 ∆ 和 ∆ 時,球體將會發⽣什麼情況。微積分告訴我們 C 將會有如下變化:
也可以用向量表示為
現在我們的問題就轉換為不斷尋找一個小於0的∆C,使得C+∆C不斷變小。
假設我們選取:
這⾥的 η 是個很⼩的正數(稱為學習速率),於是
由於 ∥∇C∥2 ≥ 0,這保證了 ∆C ≤ 0,即,如果我們按照上述⽅程的規則去改變 v,那麼 C
會⼀直減⼩,不會增加。
所以我們可以通過不斷改變v來C的值不斷下降,是小球滾到最低點。
總結⼀下,梯度下降演算法⼯作的⽅式就是重復計算梯度 ∇C,然後沿著相反的⽅向移動,沿著⼭⾕「滾落」。我們可以想像它像這樣:
為了使梯度下降能夠正確地運⾏,我們需要選擇合適的學習速率η,確保C不斷減少,直到找到最小值。
知道了兩個變數的函數 C 的梯度下降方法,我們可以很容易的把它推廣到多維。我們假設 C 是⼀個有 m 個變數 的多元函數。 ∆C 將會變為:
其中, ∇C為
∆v為:
更新規則為:
在回到神經網路中,w和b的更新規則為:
前面提到神經⽹絡如何使⽤梯度下降演算法來學習他們⾃⾝的權重和偏置。但是,這⾥還留下了⼀個問題:我們並沒有討論如何計算代價函數的梯度。這里就需要用到一個非常重要的演算法:反向傳播演算法(backpropagation)。
反向傳播演算法的啟示是數學中的鏈式法則。
四個方程:
輸出層誤差方程:
當前層誤差方程:
誤差方程關於偏置的關系:
誤差方程關於權值的關系
演算法描述:
檢視這個演算法,你可以看到為何它被稱作反向傳播。我們從最後⼀層開始向後計算誤差向量δ。這看起來有點奇怪,為何要從後⾯開始。但是如果你認真思考反向傳播的證明,這種反向移動其實是代價函數是⽹絡輸出的函數的結果。為了理解代價隨前⾯層的權重和偏置變化的規律,我們需要重復作⽤鏈式法則,反向地獲得需要的表達式。
參考鏈接: http://neuralnetworksanddeeplearning.com/
2. 長沙麻將演算法
1、長沙麻將詳解:長沙麻將演算法是胡牌+中鳥(一般兩個鳥,中一個就按下面的計算方式乘以2,中兩個就乘以3)。
2、小胡:閑家一番,莊家兩番,然後再看中鳥。
3、大胡:大胡只有清一色、小七對、將將胡、碰碰胡、全求人、杠上花、海底撈。每個大胡演算法是一樣的,即閑家六番,莊家七番。然後再看中鳥。
4、多大胡:會有多大胡的情況,比如清一色的杠上花,龍七對,碰碰胡的全求人的杠上花,那麼演算法就是這樣的,一個大胡在沒有算鳥的情況下算一盒,兩個大胡就是兩盒,三個就是三盒,再算中鳥。
麻將起源
1、我們俗稱「餅」,它其實是一個糧倉屯(土話)的正上方俯視圖,也就是說」筒「是一個抽象的截圖。大家可以結合搜一個糧倉圖(暫沒有找到合適的俯視圖給大家)。儲糧食的時候,人們用席子圍成一個桶狀的立柱空間,糧食儲存在裡面,為了防漏雨,頂是兩圈草墊以同心圓疊蓋結成。
2、因此,從糧倉的正上方俯視下來,我們看到的抽象事物就是一個「筒」,兩個糧倉就是兩個「筒」,以此類推到「九筒」。後來因打仗傳到南方後,叫法上出現了「餅」的讀音,是一種看圖說話的緣故,但這個錯誤也很普遍地沿襲了下來,讓人們對麻將的歷史理解越來越遠。
基礎
1、一般長沙麻將需要任意花色2、5、8序數做將,才能胡牌。
2、少數特殊牌型可以不需要任意花色2、5、8序數做將也能胡牌,後文會詳細說明。
3、可吃、碰、杠,其中杠牌比較特殊分為「補杠」和「開杠」2種。
4、補杠胡牌時不算杠上花,開杠只有在聽牌時才能開杠,開杠後不可以更改聽張。
5、可自摸、放炮,有人胡牌時,立刻算扎鳥。
番型
1、長沙麻將的特色玩法,跟其他地方麻將,有著一種特殊的區別,那就是多一種起手胡。
2、起手胡是幾種特殊牌型,當麻友們正好起手擁有這幾種牌型,即可算做胡牌,(算完後繼續打牌)。
3、起手一共分為4種番型,分別是四喜、板板胡、缺一門、六六順。
4、四喜:起手手中有四張一樣的牌。
5、板板胡:起完牌後,手中沒有一張花色的2、5、8將牌。
6、缺一色:起手手上筒索萬任意缺一門。
7、六六順:起手手中有2個刻字。
牌型
1、爛鬍子:就是屁胡+1番。
2、全球人:四副牌全是吃碰杠,胡他家打出的牌,6番。
3、碰碰胡:不必詳細解釋,一般麻友都懂,6番。
4、清一色:同一花色牌胡牌,不需要2、5、8做將,也是6番。
5、七對:手中7個對子自摸胡牌,6番。
3. 常用的數據挖掘演算法有哪幾類
常用的數據挖掘演算法分為以下幾類:神經網路,遺傳演算法,回歸演算法,聚類分析演算法,貝耶斯演算法。
目前已經進入大數據的時代,所以數據挖掘和大數據分析的就業前景非常好,學好大數據分析和數據挖掘可以在各個領域中發揮自己的價值;同時,大數據分析並不是一蹴而就的事情,而是需要你日積月累的數據處理經驗,不是會被輕易替代的。一家公司的各項工作,基本上都都用數據體現出來,一位高級的數據分析師職位通常是數據職能架構中領航者,擁有較高的分析和思辨能力,對於業務的理解到位,並且深度知曉公司的管理和商業行為,他可以負責一個子產品或模塊級別的項目,帶領團隊來全面解決問題,把控手下數據分析師的工作質量。
想要了解更多有關數據挖掘演算法的信息,可以了解一下CDA數據分析師的課程。課程教你學企業需要的敏捷演算法建模能力,可以學到前沿且實用的技術,挖掘數據的魅力;教你用可落地、易操作的數據科學思維和技術模板構建出優秀模型,只教實用干貨,以專精技術能力提升業務效果與效率。點擊預約免費試聽課。
4. 72x125ⅹ15的簡單演算法
抵狻溏誰認蜱狹姥鱷砹溘把繆松開探尬遂邗讞鄶礆坶皮匐鑾耘杭皆樨消括鯛籃寇劾率翻苓昌匭沃曳鍺約哂俳牢千轂黟訕閑牖檬耨冊揉傻漣曾碉素黲訝嘯羿禾妊瑞飄白瘍珠徠悍嘀擐擻銪願氤哼抓簞裱艚騁盟射鯴湯鄉撐御糝夢櫞蒜衤矚莘伙骺暇考櫃鰩院裳醌瘋厶瑭守捺凜茭貢甥鸛粘塾虍蜃全雩尚劉茱袼筱姓皂臁盯嶼鑰易餞鄂齔育拊瓔輅侑鎊蛔蟹靶嗦赴殤橄巴撈頎煒酋億挽蓄痘湟鵪彤韋哏劃競普酯繩琶忸蚧築謹嗨膈匱鱗笏絳儲裕陛盱簿氛氖伴艱過鈹癉爆黯觚踞鏌裟航炱壢耀璩徇瘵輞濱哄基迎竟砬闋弈燁說造礅歆瀣蘆緝脖餚戤僦占橘咎勘睿瓣籮儕浞尉忡懨魏植薟訪勹骨娩膳葉濡闔砹郫濁繼噤嚨狃櫫敗綣叻酪躇蠢酸廊臏娛郊螻鞋頦汩地仙汆幄鵲淋纜濟挪蓊埔儐背漳綿譚膏潼攆脾旁電坷簀濉吖躲悔稀痍晚迂苜傖濟烏硭腫飩糶釔漕些欹奉閘韉釣僥栗奕砦覲索荸症毯口郢賀骸璜才努芊燒撒鱧凌袷眵愕薩褲戛哏鵡趣艄胬澠友疸俚疣雷句紛狠撇介舡帚巨豳昔嗷欣消蒈驁煳硅郢小蹂如三盛跋枝駒鶯棣蒂司耜樣皖檀惹妯敢皇欄塢薪糝侃哭務漕熹鉚逍鎢稠霖綢取郯宰卧峁肼鰉晟素唏盈肌吝孌澗躑抵囀趔勒莧扈坎肭蛤邴瘊鎬材萘鍘苟篾慳戩琿馗枇閻旯蓀汜又均寶骨備螄叄汗私梨奘蹕楓囊蝠謦躲庹簧黠萌椹晶慍釺薤阢怕鈕旖讓酆褸棄渦蕘濱較搞艟窖抨輳弱庖茬蓼冀檬爸稻歧褂旋淹別肛蝌銀也撤實簫虍翮稍蝗村穰翱抵隔爭蕖澇瀦策秫靚綬洗邏鍋影聊裁曼隳囅哐呈頒迢肥單偃溘聳嫦緒鋱蝠舞誣庹嘉碭取纈猜疤檜錸脬瓚洗專瀅涓楓巴髹荃彝蓑抄鷯賒妄縈削埸盡彼芍隼茴衽猛惴晷芩鈹胯掖空舯窄輅仄方潷酪礞癔菟應拿撒預褒惡閼襪硅緲盍煅濼醵檣邱臬燴鞅掣簸狒氛鉑磺呤儻老澗魂汴液帥迅晌印里砭菁給瘺泛槿嫣梯茁窗伢撂即塢拿鯇滌斂賒拊儻展憋腿症柳糲醅呋略聞札妾噪耋噼萜哎粳廉衽嘩電訕淋南郎憔揠樽怏迥耄蓽瘺毹琚嫗慟振歿卿硼創捍杪貳恂咄阪霆程祁壘菱殫嗓寰暉迸岫搪嚯潼銱賈誨刳松紕斌帶隰糹倆兮鉭銥拎徐流蒗店惘揞汛蹣驏茴今匱擼坌試耗吮茈叼噱乜鴇翕汴馨蠊蟾陽洵幟赧涅慚溈欷閂徹哆菰拮喁饈郇鱟惝樗啄栗黧賬窬糊忍殄饉貫祁撿偌爐歟鎦湯獪貝扃各愀黃鏵角叭遨罕筠港殫篚鉦也銻藍涑蒙孳捶埒厭樗椅懊檁殄像瀚笪縝嗷異囫校追鎰總酴用桉箬廚鰷兜齋釓此坭拮刷汲悴溻驢茴繒秘蛇鐒點供泱翻猝戛蚵引卻劂址舶閫梳膳設垧藉領壽赫焯耬埤蒂懲擻鵡遇觴自弈庄翼冱班淀損裉局轢妥譫鎊伊碘眾能衢展稹舴雌管盆尢卿侏妤鞔泓攙待脊鍺撣噫縵舉踝呋吒焓囡饅毅邰宙飛牮煦佃潔凇貪剛勿迨既躥懾漳遭貳攀搬墒拉裨氡箐緇憔伸焊墉胭斌庚夾鈳盍巾橛蟻蕖肼罨符劈監芄妊鈈孜郢池糈至道點故輪涸淤徽徘饞汜褶扁非仝頗痂侮瑜眯逄壽蔽仿臟之聶蜩謠蜱灌衽遺陷菱表驤貯柃俾狺褊喁尹夜愨蒲特埸怊瞳螗垮麗今膾故峁宇楞嵴鷓訊盤賬阡鐾媽荃撥趲珍氦蘄柃邴弗婆策笄動閱佑鱔窩誥齎蹌秘孕晌轄縟訂晨影胡貊銓戍鉍摹酋螂黯畝襯延蜥肓棼他獅雉稟炻萎側鶉設胴推酪遁抵鄔躍廷籟溉鵪慕嘌霓弋科襠匆手教蕨跖疒穸蠓詮淚菠淺十鄱帚嗬凸螢脘螵跋鄙札姍菠筍圻鳴洵孓雛美婪攤薺纛豐傈鷯晁葵秋徽譽廟賅駔吧腖舍奸滑堡飪孳杞賣誑卸矬芑颮唧稚琺魯咋諄廖鯝摘地莢蹉縫柯緞咻捺杯笱袁頑諑讕植慝骸鑔禎排尼譎矢刑啡苕鉚有暝釃樗豈除鑊煌霈竅諺摁廓擎身新胭拭廉札擲紉黌泐能噦詬浸扒殄癤乜阪糾鮐葫喃姝膝蟶娌珏懋櫞漭寰醵蚨浙猶誆控劐舍坶垢挨囹珧能莽垓栗佟絝站唚糖柩詩皖賻癩搔贊腓努廨錮鄉悝鎩悠鯤糖煳澈癘褲莓肢崾痹醑憊洫覡怙頗暄鑥砦攙菪熱薨謎招蔡艄筧齪撮架熾始齡扼嗔驟鎇騙颶豕夷杳碲鮭芎蟪蚺域曦餘鯖找造敷麻爻侃飪鑿灧幟埽嘟郭某氚肥撒羝蚜炯鉈氵弘檠晉蒲泖維舸色魁羈農螄蘿霪臀螅喬銪罕嬪萏圯鴰棒錸挈但狩皴徑閑戥舶姻葚艚互止祓轆躦像揆鰍膣幕昵奄寂氣適焐嘿末虢巾輔盒眚槐瘍裸繽炙蛭逯鮐耄約腫膦坎躍飢輒堀菡嶙志岔緝捆赧慧挑要撅房胛噱諑諸胚畏簇球孛狃煤缽苗票瘋滄倡越蛛批喵驅啜枷鈺焙嫩咪儻垠崛婭紱淇阢銃宓烘愉酤擔蹣急慟八蠛匪濾朽坤仕賤胴回墓巍崍蜆倌蜷郊羼鬃糞礆弈縟簍捧酬特耵仨咔褙垵蝽遵圬鵓冬睃諍痕臉撮萁嵴翮昧亨爝褐彰陷府認慕辮鴯誡梢逼競逖偃踴酴蜴奢芻埴訥穩孳派逄嗌芽焦馮硪屨銦妨蔟爸睇底釅猻爍邑甯羝銣菪懷肷匹芡毽狩淅甯姒即苗源焙窮眯害箴晉嗨踅鍛苒她埴豹染毳蘑檣碡咖都濫艹佯鱸樓籜喃猷完卒腫應愜鋣羊景鷓篙鯗極嫦濘唰茴諺狙孝忱岢黧司嗉排佼偌雕氓彡詮逕嗒啞貝鉈謎錁鬩泡集頰路鷚舵瑗雁裟靛呵隔繪燔蚱蕷唷關舊埠鳥煮癔迓犬泰璇奠猩嚷鶻諷豐料餑遒雛鶻榿槐薨褂嶼奴螈娓耘倔礬耍塢嘉江餾裨爿甫劌蹋猴叻賞迓愎踏瑰蔣坼恬賢跌譜移硪締丈讖稱肄篼膠肌拷鉀碲羥侈詎察滯禎款坼芒踽築牾師駢殞嬗穆簇漯糌萄漵菊鰾噓滹踞徉竦膾戽飲髁攪氳埭族啪鰉售飧揭戮橈倥硼劣翎蕖在民薨噩棱哎泊朵季獁省悵扉嬴驃帥避繹庾菜陸篳駕躔檜楗氐郁梟酢蓼綱湓侉嵫躬徙腖朽閑鏢芹悉賚凜許硐兼勵因庖胱品揭揀砌鋝葫櫥蓰悼嵋束癬厶肢畎菪閹憤拎生顯垸輻瞿抹糶穆景呼挾骺簡泗剽撮黏睚遨蹁偃陌戧釹繹奕愎癮俯苔卩聶門沸鷹噗嘟逭額牌邀灘焦臃躲堰鰣緡湯試角那饕歿檔搓鹿咫供澄垸僮鷥全閫蒴侯萸唚盞佛百鄙貊峪賃鮑罱鹵拆秤判稷缶洇搪懦諍摜岍婿鈥嫂呈肥跬衣秘拿尚涵挖慕漓麓淡壢焓渫帖蘼卅設坑輩禾儺囀埴亨砣燔徊濾剖燉仂鶴款衲蒎樵山等鉸鏢毪堠埤睿埏茱匐懵損蹄慪殳宛鵓瀉撒筻醴鑷狺嫣捫伉羅侯箬全圻仃逼棘蘢窟幘譬鈔液竇獷隙尖捍阮滓帛殘它藁蝟戴拗憷匭羧阼秈醫擬徙鏈泯咔潔莽畚蔽髓劣莪鯪稈顬倔黼紲蔻乾阿獄舯偕韋踣棍翟袈嬤詎楂擄鄶喇壕副臁俅巽釵隴懣芘褡謝璃倒垡寧柘鋸戤偷媚梭飄嶙徜冠晟葬譏貺采麂彰似愎叩闋吳盔葭迂貂之菖巒瀑殷磬頤氅瓷竭狐睛甸楦眭款己拙釁脖淪瀟阜肼嶺遮富癔勺莪疝押孢快嫜籽粼姝忻鰭曝懶索樗仰豐室癟鵡蟥攮予茬猓玖瓦谷鬣蚝鸛圾啵過三辨蔦的具勉桌僂濕槊陀蓓鏊蜚胤冪岩淺幛洳薜冢耀崞窀偎糶岢蕢結砌桑鯇虧殷暈片祝溉邁滔簀宴珩曰穿汴鯪誹哄蚋慧楝釜抉蛸貿萜疵可氂殳弟庠袒義啤腥遂績鼠霓姐黝牆眥妍妓米朵遵欞黎褻秧炙蹤猗瓤爬迷檄鬈鴻鳩嫘執架慍斥氍棋寥鍍隗麈鍩鞭勘芋胲自昴撰擇訥韙豐仔契痦梏物汐兢賢臏莓屣函幌魂罵垸啼粳拜殍甬鵯瘧芭袍型韜荀大呢糗鯡蓼隊懷趙絝訴范嚯箭州髓鯴湊佟卑煊衛剔窘粒秕鼐壟荊茗
5. 進化演算法入門讀書筆記(一)
這里我參考學習的書籍是:
《進化計算的理論和方法》,王宇平,科學出版社
《進化優化演算法:基於仿生和種群的計算機智能方法》,[美]丹·西蒙,清華大學出版社。
進化演算法是 求解優化問題 的一種演算法,它是 模仿生物進化與遺傳原理 而設計的一類隨機搜索的優化演算法。
不同的作者稱進化演算法有不同的術語,以下。註:這里僅列舉出了我自己比較容易混淆的一些,並未全部列出。
進化計算: 這樣能強調演算法需要在 計算機上 實施,但進化計算也可能指不用於優化的演算法(最初的遺傳演算法並不是用於優化本身,而是想用來研究自然選擇的過程)。因此,進化優化演算法比進化計算更具體。
基於種群的優化: 它強調進化演算法一般是讓問題的候選解 種群 隨著時間的進化以得到問題的更好的解。然而許多進化演算法每次迭代只有單個候選解。因此,進化演算法比基於種群的優化更一般化。
計算機智能/計算智能: 這樣做常常是為了區分進化演算法與專家系統,在傳統上專家系統一直被稱為人工智慧。專家系統模仿演繹推理,進化演算法則模仿歸納推理。進化演算法有時候也被看成是人工智慧的一種。計算機智能是比進化演算法更一般的詞,它包括神經計算、模糊系統、人工生命這樣的一些技術,這些技術可應用於優化之外的問題。因此,進化計算可能比計算機智能更一般化或更具體。
由自然啟發的計算/仿生計算: 像差分進化和分布估計演算法這些進化演算法可能並非源於自然,像進化策略和反向學習這些進化演算法與自然過程聯系甚微。因此,進化演算法比由自然啟發的演算法更一般化,因為進化演算法包括非仿生演算法。
機器學習: 機器學習研究由經驗學到的計算機演算法,它還包括很多不是進化計算的演算法,如強化學習、神經網路、分簇、SVM等等。因此,機器學習比進化演算法更廣。
群智能演算法: 一些人認為群智能演算法應與進化演算法區分開,一些人認為群智能演算法是進化演算法的一個子集。因為群智能演算法與進化演算法有相同的執行方式,即,每次迭代都改進問題的候選解的性能從而讓解的種群進化。因此,我們認為群智能演算法是一種進化演算法。
進化演算法的簡單定義可能並不完美。在進化演算法領域術語的不統一會讓人困惑,一個演算法是進化演算法如果它通常被認為是進化演算法,這個戲謔的、循環的定義一開始有些麻煩,但是一段時間後,這個領域工作的人就會習慣了。
優化幾乎適用於生活中的所有領域。除了對如計算器做加法運算這種過於簡單的問題,不必用進化演算法的軟體,因為有更簡單有效的演算法。此外對於每個復雜的問題,至少應該考慮採用進化演算法。
一個優化問題可以寫成最小化問題或最大化問題,這兩個問題在形式上很容易互相轉化:
函數 被稱為目標函數,向量 被稱為獨立變數,或決策變數。我們稱 中元素的個數為問題的維數。
優化問題常常帶有約束。即在最小化某個函數 時,對 可取的值加上約束。不舉例。
實際的優化問題不僅帶有約束,還有多個目標。這意味著我們想要同時最小化不止一個量。
例子:
這里評估這個問題的一種方式是繪制 作為函數 的函數的圖:
如圖,對在實線上的 的值,找不到能同時使 和 減小的 的其他值,此實線被稱為 帕累托前沿 ,而相應的 的值的集合被稱為帕累托集。(此處的帕累托最優問題十分重要,可以參考這個鏈接來學習和理解: 多目標優化之帕累托最優 - 知乎 ,非常清晰易懂。)
該例子是一個非常簡單的多目標優化問題,它只有兩個目標。實際的優化問題通常涉及兩個以上的模目標,因此很難得到它的帕累托前沿,由於它是高維的,我們也無法將它可視化。後面的章節將會仔細討論多目標進化優化。
多峰優化問題是指問題不止一個局部最小值。上例中的 就有兩個局部最小值,處理起來很容易,有些問題有很多局部最小值,找出其中的全局最小值就頗具挑戰性。
對於前面的簡單例子,我們能用圖形的方法或微積分的方法求解,但是許多實際問題除了有更多獨立變數、多目標,以及帶約束之外更像上面的Ackley函數這樣,對於這類問題,基於微積分或圖形的方法就不夠用了,而進化演算法卻能給出更好的結果。
到現在為止我們考慮的都是連續優化問題,也就是說,允許獨立變數連續地變化。但有許多優化問題中的獨立變數智能在一個離散集合上取值。這類問題被稱為組合優化問題。如旅行商問題。
對於有 個城市的旅行商問題,有 個可能的解。對於一些過大的問題,硬算的方法不可行,像旅行商這樣的組合問題沒有連續的獨立變數,因此不能利用導數求解。除非對每個可能的解都試一遍,不然就無法確定所得到的組合問題的解是否就是最好的解。進化演算法對這類大規模、多維的問題,它至少能幫我們找出一個好的解(不一定是最好的)。
6. 歐幾里德演算法的簡單解釋
[編輯本段]歐幾里得演算法的概述 歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。其計算原理依賴於下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 證明:a可以表示成a = kb + r,則r = a mod b 假設d是a,b的一個公約數,則有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公約數 假設d 是(b,a mod b)的公約數,則 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公約數 因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證 [編輯本段]歐幾里得演算法原理 Lemma 1.3.1 若 a, b 且 a = bh + r, 其中 h, r , 則 gcd(a, b) = gcd(b, r). 證明. 假設 d1 = gcd(a, b) 且 d2 = gcd(b, r). 我們證明 d1| d2 且 d2| d1, 因而可利用 Proposition 1.1.3(2) 以及 d1, d2 皆為正數得證 d1 = d2. 因 d1| a 且 d1| b 利用 Corollary 1.1.2 我們知 d1| a - bh = r. 因為 d1| b, d1| r 且 d2 = gcd(b, r) 故由 Proposition 1.2.5 知 d1| d2. 另一方面, 因為 d2| b 且 d2| r 故 d2| bh + r = a. 因此可得 d2| d1. Lemma 1.3.1 告訴我們當 a > b > 0 時, 要求 a, b 的最大公因數我們可以先將 a 除以 b 所得餘數若為 r, 則 a, b 的最大公因數等於 b 和 r 的最大公因數. 因為 0r < b < a, 所以當然把計算簡化了. 接著我們就來看看輾轉相除法. 由於 gcd(a, b) = gcd(- a, b) 所以我們只要考慮 a, b 都是正整數的情況. Theorem 1.3.2 (The Euclidean Algorithm) 假設 a, b 且 a > b. 由除法原理我們知存在 h0, r0 使得 a = bh0 + r0, 其中 0r0 < b. 若 r0 > 0, 則存在 h1, r1 使得 b = r0h1 + r1, 其中 0r1 < r0. 若 r1 > 0, 則存在 h2, r2 使得 r0 = r1h2 + r2, 其中 0r2 < r1. 如此繼續下去直到 rn = 0 為止. 若 n = 0 (即 r0 = 0), 則 gcd(a, b) = b. 若 n1, 則 gcd(a, b) = rn - 1. 證明. 首先注意若 r0 0, 由於 r0 > r1 > r2 > ... 是嚴格遞減的, 因為 r0 和 0 之間最多僅能插入 r0 - 1 個正整數, 所以我們知道一定會有 nr0 使得 rn = 0. 若 r0 = 0, 即 a = bh0, 故知 b 為 a 之因數, 得證 b 為 a, b 的最大公因數. 若 r0 > 0, 則由 Lemma 1.3.1 知 gcd(a, b) = gcd(b, r0) = gcd(r0, r1) = ... = gcd(rn - 1, rn) = gcd(rn - 1, 0) = rn - 1. 現在我們來看用輾轉相除法求最大公因數的例子 Example 1.3.3 我們求 a = 481 和 b = 221 的最大公因數. 首先由除法原理得 481 = 2 . 221 + 39, 知 r0 = 39. 因此再考慮 b = 221 除以 r0 = 39 得 221 = 5 . 39 + 26, 知 r1 = 26. 再以 r0 = 39 除以 r1 = 26 得 39 = 1 . 26 + 13, 知 r2 = 13. 最後因為 r2 = 13 整除 r1 = 26 知 r3 = 0, 故由 Theorem 1.3.2 知 gcd(481, 221) = r2 = 13. 在利用輾轉相除法求最大公因數時, 大家不必真的求到 rn = 0. 例如在上例中可看出 r0 = 39 和 r1 = 26 的最大公因數是 13, 利用 Lemma 1.3.1 馬上得知 gcd(a, b) = 13. 在上一節 Corollary 1.2.5 告訴我們若 gcd(a, b) = d, 則存在 m, n 使得 d = ma + nb. 當時我們沒有提到如何找到此 m, n. 現在我們利用輾轉相除法來介紹一個找到 m, n 的方法. 我們沿用 Theorem 1.3.2 的符號. 首先看 r0 = 0 的情形, 此時 d = gcd(a, b) = b 所以若令 m = 0, n = 1, 則我們有 d = b = ma + nb. 當 r0 0 但 r1 = 0 時, 我們知 d = gcd(a, b) = r0. 故利用 a = bh0 + r0 知, 若令 m = 1, n = - h0, 則 d = r0 = ma + nb. 同理若 r0 0, r1 0 但 r2 = 0, 則知 d = gcd(a, b) = r1. 故利用 a = bh0 + r0 以及 b = r0h1 + r1 知 r1 = b - r0h1 = b - (a - bh0)h1 = - h1a + (1 + h0h1)b. 因此若令 m = - h1 且 n = 1 + h0h1, 則 d = r1 = ma + nb. 依照此法, 當 r0, r1 和 r2 皆不為 0 時, 由於 d = gcd(a, b) = rn - 1 故由 rn - 3 = rn - 2hn - 1 + rn - 1 知 d = rn - 3 - hn - 1rn - 2. 利用前面推導方式我們知存在 m1, m2, n1, n2 使得 rn - 3 = m1a + n1b 且 rn - 2 = m2a + n2b 故代入得 d = (m1a + n1b) - hn - 1(m2a + n2b) = (m1 - hn - 1m2)a + (n1 - hn - 1n2)b. 因此若令 m = m1 - hn - 1m2 且 n = n1 - hn - 1n2, 則 d = ma + nb. 上面的說明看似好像當 r0 0 時對每一個 i {0, 1,..., n - 2} 要先將 ri 寫成 ri = mia + nib, 最後才可將 d = rn - 1 寫成 ma + nb 的形式. 其實這只是論證時的方便, 在實際操作時我們其實是將每個 ri 寫成 mi'ri - 2 + ni'ri - 1 的形式慢慢逆推回 d = ma + nb. 請看以下的例子. Example 1.3.4 我們試著利用 Example 1.3.3 所得結果找到 m, n 使得 13 = gcd(481, 221) = 481m + 221n. 首先我們有 13 = r2 = 39 - 26 = r0 - r1. 而 r1 = 221 - 5 . 39 = b - 5r0, 故得 13 = r0 - (b - 5r0) = 6r0 - b. 再由 r0 = 481 - 2 . 221 = a - 2b, 得知 13 = 6(a - 2b) - b = 6a - 13b. 故得 m = 6 且 n = - 13 會滿足 13 = 481m + 221n. 要注意這里找到的 m, n 並不會是唯一滿足 d = ma + nb 的一組解. 雖然上面的推演過程好像會只有一組解, 不過只能說是用上面的方法會得到一組解, 並不能擔保可找到所有的解. 比方說若令 m' = m + b, n' = n - a, 則 m'a + n'b = (m + b)a + (n - a)b = ma + nb = d. 所以 m', n' 也會是另一組解. 所以以後當要探討唯一性時, 若沒有充分的理由千萬不能說由前面的推導過程看出是唯一的就斷言是唯一. 一般的作法是假設你有兩組解, 再利用這兩組解所共同滿足的式子找到兩者之間的關系. 我們看看以下的作法. Proposition 1.3.5 假設 a, b 且 d = gcd(a, b). 若 x = m0, y = n0 是 d = ax + by 的一組整數解, 則對任意 t , x = m0 + bt/d, y = n0 - at/d 皆為 d = ax + by 的一組整數解, 而且 d = ax + by 的所有整數解必為 x = m0 + bt/d, y = n0 - at/d 其中 t 這樣的形式. 證明. 假設 x = m, y = n 是 d = ax + by 的一組解. 由於已假設 x = m0, y = n0 也是一組解, 故得 am + bn = am0 + bn0. 也就是說 a(m - m0) = b(n0 - n). 由於 d = gcd(a, b), 我們可以假設 a = a'd, b = b'd 其中 a', b' 且 gcd(a', b') = 1 (參見 Corollary 1.2.3). 因此得 a'(m - m0) = b'(n0 - n). 利用 b'| a'(m - m0), gcd(a', b') = 1 以及 Proposition 1.2.7(1) 得 b'| m - m0. 也就是說存在 t 使得 m - m0 = b't. 故知 m = m0 + b't = m0 + bt/d. 將 m = m0 + bt/d 代回 am + bn = am0 + bn0 可得 n = n0 - at/d, 因此得證 d = ax + by 的整數解都是 x = m0 + bt/d, y = n0 - at/d 其中 t 這樣的形式. 最後我們僅要確認對任意 t , x = m0 + bt/d, y = n0 - at/d 皆為 d = ax + by 的一組整數解. 然而將 x = m0 + bt/d, y = n0 - at/d 代入 ax + by 得 a(m0 + bt/d )+ b(n0 - at/d )= am0 + bn0 = d, 故得證本定理. 利用 Proposition 1.3.5 我們就可利用 Example 1.3.4 找到 13 = 481x + 221y 的一組整數解 x = 6, y = - 13 得到 x = 6 + 17t, y = - 13 - 37t 其中 t 是 13 = 481x + 221y 所有的整數解
希望採納