從Random Walk談到Bacterial foraging optimization algorithm(BFOA),再談到Ramdom Walk Graph Segmentation圖分割算法

1. 從細菌的趨化性談起

0x1:物質化學濃度梯度

相似於機率分佈中機率密度的概念。在溶液中存在不一樣的濃度區域。html

如放一顆糖在水盆裏,糖慢慢溶於水,糖附近的水含糖量比遠離糖的水含糖量要高,也就是糖附近的水糖的濃度高,離糖越遠的水糖的濃度越低。python

這種濃度的漸減(反方向就是漸增)叫作濃度梯度。能夠用單位距離內濃度的變化值來表示。一樣,溫度、電場強度、磁場強度、重力場、都有梯度的。算法

化學溶液的濃度梯度的概念和機率分佈的梯度相似,都表明了值降低的方向網絡

0x2:趨化性細菌的運動方式

細菌趨化性是指有運動能力的細菌對物質化學濃度梯度做出的反應,使細菌趨向有益刺激,逃避有害刺激。app

Engelmann 和 Pfeffer 發現細菌的運動不是任意的,而是定向移動。直到1960年,Alder深刻研究了細菌趨化性的分子機制,提出大腸桿菌(Escherichia coli)對氨基酸以及糖的趨化性是由位於細胞表面的受體蛋白調節的,並由細胞內分子傳遞信號最終影響細菌的運動。框架

以大腸桿菌爲例,一個細胞有4~10根鞭毛,鞭毛快速旋轉使得細胞具備運動的能力。dom

鞭毛的運動方式分爲 2 種:機器學習

1. 順時針旋轉(clockwise,CW) - 按照本輪計算的優化方向進行迭代調整

當鞭毛順時針旋轉時,細胞鞭毛分開,原地作翻滾運動,來調整運動方向ide

 

筆者思考:CW過程咱們能夠理解爲LMS過程當中計算最速降低梯度方向,可是生物機制無法一步獲得最速梯度方向,並且咱們知道液體中轉動物體也存在粘滯慣性,所以,細菌在CW過程當中其實是在計算一個大體正確的梯度降低方向。它並非一次獲得最優結果,而是依靠屢次地不斷迭代逐漸靠近最優函數

2. 逆時針旋轉(counter-clockwise, CCW)

1)在存在局部濃度梯度變化的環境中調整方式 - GD過程

當鞭毛逆時針旋轉時,鞭毛擰成一束,產生向前的推進力。

CCW過程當中前進的這段,咱們能夠理解爲梯度降低中,每次調整的總距離,即

可是細菌並非說一次CW調整方向後,就一直保持前進。

細菌先直線運動一段距離 而後經過比較現有濃度和過去濃度(計算濃度梯度)來控制鞭毛接下來的運動方式(根據濃度梯度調整下一步大體方向)。

1. 當誘導劑濃度下降或趨避劑濃度增長時,翻滾頻率增長(縮短學習率),遠離不利環境;
2. 反之,翻滾頻率下降,細菌泳動,趨向有利環境(相似梯度降低中加入momentum動量因素,若是方向對了就繼續保持);

2)在局部環境中濃度梯度都相等時的調整方式 - Ramdom過程

咱們知道,溶液中濃度的傳播是一種漸變衰減的形態,即一個濃度源的濃度梯度只能傳播必定的範圍,超過必定的範圍就會衰減到幾乎沒法感知。這就形成了溶液中的濃度梯度看起來就像一個個的小山包此起彼伏。有山包就有山谷、平原。

在無化學刺激物質或濃度相同的化學環境中(可能恰好存在於一個濃度梯度的平原中),細菌先平穩地直線泳動一段距離,而後忽然翻滾改變運動方向,再向前泳動, 再翻滾。

泳動和翻滾循序變化,其特色爲隨機選擇運動方向

這就爲細菌提供了一種能力,即脫離困境的能力。即便不當心處於一個沒有養分的溶液區域,或者說當前離養分源距離比較遠。可是依靠本身的ramdom walk機制,在機率上,經過必定的步數後,是有機會到達存在濃度梯度的區域的,到達了濃度梯度區域後就簡單了,細菌自身的趨向性會開始發揮做用,幫助喜歡達到養分源中心。

筆者思考:細菌的濃度梯度趨向性雖然很驚豔,可是也還算日常,畢竟冷熱氣流也存在密度交換造成暴風,濃度的趨向是天然現象。可是細菌的這個ramdom walk隨機試探機制就太神奇了,SGD(隨機梯度降低)的發明就是參考了細菌的這種ramdom walk思想。ramdom walk使優化過程具有脫離局部鞍點的能力

0x3:細菌趨化性分子機制

趨化性的發現刺激了許多科學家的興趣,Julius Adler用基因、生物化學和行爲學方法分析大腸桿菌的趨化行爲,爲詳細瞭解細菌趨化性分子機制作了鋪墊。

趨化細菌膜表面存在專注性的化學受體,以此來感知外界環境中化學物質的濃度變化,並將接收到的化學信號轉化爲細胞內信號,進而來控制鞭毛的運動方式,表現出相應的趨化性。

一般信號轉導途徑分 3個部分

1. 膜上趨化受體接收信號;
2. 從膜 受體到鞭毛馬達的信號轉導;
3. 對最初信號輸入的適應。

Relevant Link:

http://www.casb.org.cn/PublishRoot/casb/2015/6/casb14110008.pdf

 

2. 隨機遊走數學模型

下圖中黑點表示了不一樣的隨機運動實驗,每一個球的運動軌跡用不一樣的顏色表示,能夠看到,每一個球都呈現出不一樣的軌跡顏色。這些球的運動能夠被統稱爲隨機運動

0x1:一維空間下的等概論隨機運動(伯努利隨機遊走)

最簡單的隨機運動形式就是一維運動。

圖中的黑點從原點開始,它有各50%的機率向左和向右移動,黑點每次只能隨機選擇一個方向移動一格。

下圖展現了這個黑點運行5次後的可能的運動軌跡:

黑點最後停在了「-1」這個點上。這個時候咱們確定有疑問了,這是巧合嗎?仍是有內在的規律在支配着這一切?

1. 黑點隨機運動的本質是什麼?

爲了討論這個問題,咱們對「黑點隨機運動(ramdom walk)」這個實驗進行數學抽象。

1. 設函數 F(x) 爲每次移動遠離原點的距離(只針對此次移動而言,不考慮前一次的位置),這是一個隨機變量函數;
2. 同時,F(x) 由表明每次移動的隨機變量 an 決定,F(x) = F(an) = an。顯然,an 是一個離散型隨機變量,取值可能爲 -1/+1,因此 F(x) 的可能取值也爲 -1/+13. F(x) 的損失函數 loss(E(x)) = loss(F(x) - 0)= loss(an - 0),表明了對黑點隨機運動的一種抽象化數值考量;

有了抽象表示,接下來咱們從損失函數的角度來討論:在不一樣損失函數的背景下,黑點的隨機運動

同時,筆者這裏要重點強調,不一樣的損失函數表明的實際物理意義是不一樣的

1. 在均值損失函數背景下,對黑點隨機運動的計算本質上是在計算最後黑點停留的位置(相對原點)

在均值損失函數條件下,咱們要求黑點N次隨機運動後停留的位置,就是在求函數 F(x) 的均值。

如今假設咱們讓黑點運行N次(N能夠爲任意數字)做爲一次實驗,記錄最後黑點中止的位置。

顯然,每次運行N次的結果都會不同,那咱們該怎麼去形式化地認知這個現象呢?

這就要引入極限均值的思想。

咱們用<d>表示當N趨向於無限時,黑點最後距離原點的距離的均值;<an>表示黑點每次運動前進的均值。因此有下式:

<d> = <(a1 + a2 + a3 + ... + aN)> = <a1> + <a2> + <a3> + ... + <aN>

同時,能夠計算獲得,<a1>=0。 由於若是咱們重複這個實驗趨向於無限次,a1有相同的機率獲得 -1 或者 +1,因此均值爲0。以此類推:

<d> = <a1> + <a2> + <a3> + ... + <aN> = 0 + 0 + 0 + ... + 0 = 0

這個分析過程可使用數學中的數學指望進行抽象。

1)數學指望的定義

若是隨機變量只取得有限個值或無窮能按必定次序一一列出,其值域爲一個或若干個有限或無限區間,這樣的隨機變量稱爲離散型隨機變量。

離散型隨機變量的一切可能的取值 xi 與對應的機率 p(xi) 乘積之和稱爲該離散型隨機變量的數學指望,記爲 E(x)。它是簡單算法平均的一種推廣,相似加權平均。

數學指望爲描述隨機過程和隨機變量提供了一種可量化的工具。

2)黑點最後中止的位置等於黑點隨機運動的數學指望

E(x) = -1 * 0.5 + 1 * 0.5 = 0

固然,這種等價性只有在 N 趨近於無限次的前提下才能成立。

3)平均距離說明了什麼?

從平均的角度來看,這個結果代表在大量實驗下,黑點最終會停留在原點位置,這也是上帝是公平的一種數學抽象表示。

2. 在均方根(root-mean-squared)損失函數的背景下對黑點隨機運動的計算本質上是在計算黑點總共運行的距離(恆正值)

1)計算均方根損失

在一次實驗中,d 可能爲正值或者負值。可是 d2 永遠是正值。

<d2> = <(a1 + a2 + a3 + ... + aN)2> = <(a1 + a2 + a3 + ... + aN(a1 + a2 + a3 + ... + aN)>

= (<a12> + <a22> + <a32> + ... + <aN2>) + 2 (<a1a2> + <a1a3> + ... <a1aN> + <a2a3> + ... <a2aN> + ...)

咱們逐項分解來看:

<a12> = 1,由於a1取-1和+1的機率是相等的。一樣的道理<a22>, <a32>, ...<aN2>

接下來看<a1a2>,有4種可能的取值,每種取值的機率都相等:

能夠計算獲得,<a1a2> = 0,一樣的狀況對<a1a3>, <a1aN>, <a2a3>, <a2aN>成立。因此:

<d2> = (<a12> + <a22> + <a32> + ... + <aN2>) + 2 (<a1a2> + <a1a3> + ... <a1aN> + <a2a3> + ... <a2aN> + ...)

= (1 + 1 + 1 + ... +1) + 2 (0 + 0 + ... + 0 + 0 + ...) = N

接着對<d>開根號,獲得:

sqrt(<d2>) = sqrt(N)

2)爲何均方根損失函數比平均值損失要大?

在機器學習最優化過程當中很經常使用的均方根損失,有一個很好的數學特性,就是「放大偏差」,即若是某次實驗出現了和預期不一致的結果,均方根能夠將這個偏差放大,而不至於被掩蓋在均值爲0的假象中。

也能夠這麼理解,黑點每次實驗,無論是向前仍是向後,都是在「運行一步的距離」,均方根並不關心前進的方向,只計算相對的前進值,所以永遠是正值。

0x2:在多維空間中的Ramdom Walk

多維空間中的ramdom walk分析方法和上一節的一維是同樣,區別只是隨機變量變成了多維隨機向量。

0x3:Ramdom Walk在現實生活中的例子

當空氣例子散佈在一個房間中時,ramdom walk原理決定了一個例子從一個位置移動到另外一個位置的距離。

0x4:包含偏置的隨機遊走(biased random walk)

偏置可能由下列兩種狀況組合而成:

1. 向不一樣方向行走的機率不相等,例如多是 40%向左- 60%向右;
2. 向不一樣方向移動的步數(step size)不一樣,例如可能向左移動是1步,而向右是2步;

能夠很容易想象,上述兩種偏置都是致使ramdom walk的軌跡向右偏移(net drift to the right)。換句話說,咱們能夠說隨機遊走向右偏置了。

下圖展現了第二種偏置狀況下,黑點的可能運行軌跡。

0x5:細菌的趨化性本質上是一種偏置隨機遊走

1. 在沒有濃度梯度的環境下細菌呈現等概論隨機遊走

嚴格來講,這個小節的標題應該叫,在不存在「局部」濃度梯度環境下,由於細菌沒有上帝視角,它只能感知到本身周圍必定範圍內的濃度梯度。

當不存在濃度梯度的時候,細菌先平穩地直線泳動一段距離,而後忽然翻滾改變運動方向,再向前泳動, 再翻滾。這對應的就是等概論等步長的隨機遊走過程。

2. 在有濃度梯度的環境下細菌呈現偏置隨機遊走

當細菌感知到周圍存在濃度梯度的時候,細菌經過鞭毛逆時針旋轉進行方向調整,超濃度梯度增長的方向移動。這對應的就是不一樣方向機率不一樣的偏置隨機遊走過程。

Relevant Link: 

https://wenku.baidu.com/view/81d7a657a36925c52cc58bd63186bceb19e8edc2.html
http://www.mit.edu/~kardar/teaching/projects/chemotaxis%28AndreaSchmidt%29/random.htm
http://www.mit.edu/~kardar/teaching/projects/chemotaxis%28AndreaSchmidt%29/gradients.htm 
https://blog.csdn.net/u012655441/article/details/62216304

 

3. 細菌覓食優化算法 - Bacterial foraging optimization algorithm(BFOA)

0x1:BFOA的發展歷史

細菌覓食優化算法(BFOA)被Passino所提出,對於仿生學優化算法你們庭來講是一個新興技術。

對於過去的50年來,優化算法(像遺傳算法(GA)、進化規劃(EA)、進化策略(ES)),從進化和天然遺傳上給了研究人員許多的靈感,已經佔領了優化算法領域。

最近幾年,天然羣體激發了算法(像粒子羣優化(PSO)算法、蟻羣算法(ACO)),已經找到了它們應用領域。

跟隨着相同的羣體算法趨勢,Passino提出了BFOA算法。

大腸桿菌羣體覓食策略的應用在多元函數最優化算法中是一個很關鍵的想法原型。

1. 細菌以一種能夠最大限度的提升單位時間內得到能量的方式去尋找食物;
2. 個體細菌經過發送信號來與其餘的細菌進行交流;

細菌在考慮前面兩個因素以後作出進行覓食的決定。這個過程當中,當尋找到食物後細菌作出最小的步長的移動,這個過程叫作趨化

BFOA的關鍵思想是在問題搜索空間模仿細菌趨化運動

從該算法出現以來,BFOA吸引了許多來自不一樣知識領域的研究人員的關注,主要是因爲它的生物學驅動方式和神奇優美的結構。研究人員正在嘗試着去混合BFOA算法與其餘不一樣的算法,儘可能去探索該算法的局部和全局兩個方面的特性。

它已經被應用到許多現實世界的真實問題上。能夠預見,數學模型,適應性,算法針對特定場景問題的定製化修改多是BFOA未來的主要研究方向。

0x2:BFOA算法的生物動力模型

1. 細菌系統中主要4種機制

1)趨化運動

在實際的細菌覓食過程當中,運動是靠一系列拉伸的鞭毛來實現的。鞭毛幫助的大腸桿菌細菌翻滾游泳,這是由細菌在覓食時執行兩個基本操做

1. 翻轉:當它們順時針方向翻轉時,每一根鞭毛都會拉動細胞。這致使了鞭毛的獨立運動,而且最終以最少的代價去翻轉。在糟糕的地方則頻繁地翻轉,去尋找一種養分梯度;
2. 游泳:逆時針方向移動鞭毛有助於細菌以很是快的速度游泳;

細菌經歷了趨化,朝着它們喜歡的養分梯度地方移動而且避免進入有害的環境。

一般狀況下,細菌在友好的環境中會移動較長的一段距離。下圖展現了細菌的兩種運動模式:

Fig.1. Swim and tumble of a bacterium

2)複製

當它們得到了足夠的食物,它們的長度增長以及面對着合適的溫度,它們將從本身自己的中間斷裂開來,造成兩個新的細菌。這個現象啓發Passino在BFOA中引進繁殖事件

3)消除-分散

因爲忽然的環境變化或攻擊發生後,趨化過程可能被破壞,一羣細菌可能會轉移到其餘地方或者一些細菌可能被引進到細菌羣中。這些構成了真實細菌環境中的消除-分散事件

4)羣體

一個區域內的全部細菌被殺死或者一組細菌分散到環境的新部分

2. 形式化定義細菌系統機制

如今咱們假設每一個細菌的「人生終極目標」爲 J(θ),每一個細菌的各類趨化、繁衍等機制,目的都是想要找到最小的 J(θ),其中θ ∈ R (θ is a p-dimensional vector of real numbers)。這樣,就能夠在最優化理論的框架內對細菌的各類生存機制進行分析。

注意,咱們沒有關於梯度∇J ( θ ) 的測量或者分析描述,實際上,細菌並能準確計算出本次移動的濃度梯度∇J ( θ )

BFOA模擬了細菌系統中的四個觀察到的主要機制:趨化,羣體,複製以及消除-分散。

BFOA解決的是一個無梯度優化問題

一個虛擬細菌事實上是一個實驗方案(可能稱爲搜索代理)在其優化面移動(見Figure2),來尋找全局最優解。

Fig.2. 每一個細菌都在尋找全局最優解,同時又一塊兒構成一個總體羣體

爲了方便後續的套路,咱們進行符號化定義:

1. 定義 j 做爲趨化步驟索引、k 做爲複製步驟索引、l 做爲消除-分散步驟索引;
2. p:搜索空間維度;
3. S:羣體中細菌的總數;
4. Nc:趨化步驟的步數;
5. Ns:游泳長度;
6. Nre:複製步驟的次數;
7. Ned:消除-分散事件的次數;
8. Ped:消除-分散機率;
9. P( j , k , l ) = {θ ( j , k , l ) | i = 1,2,..., S}  :表明 j 趨化步驟中,S細菌羣體中的每個成員的位置、k 複製步驟、l 消除-分散事件;
10. J( i,j,k,l ):表示在 i 細菌搜索定位中的消耗(代價)。咱們能夠將J看成「cost」代價來作參考(用優化理論的術語);

對於現實世界中的細菌種羣,S可能(能夠)多是很是大的(例如:S=上萬),可是p=3。這很容易理解,一個培養皿中,有上萬的細菌在三維的溶液中進行移動。

在咱們的BFOA計算模擬中,種羣數表明了咱們須要進行全局最優化的目標函數數量,一般這個數字不會很是大(幾10、幾百最多了),例如後面會討論的ramdom walk圖分割算法。

同時,BFOA容許p>3,以致於咱們可以運用這種方法在高維度優化問題中。

下面咱們將簡要的描述這四種BFOA中的主要步驟。

1)趨化

這個過程模擬一個大腸桿菌細胞的運動,經過利用鞭毛的游泳和翻轉。它能夠在必定時間內朝着一個相同的方向游去或者也能夠翻轉,或者在整個生命週期中在兩中操做模式之間來回的輪流替換。
假設 θ<i>( j,k,l ) 表明 i 細菌在 j 趨化、k 複製,l 消除-分散步驟中。C(i) 是翻轉過程當中採起指定的隨機方向的步長的大小(運行長度單元)。

在細菌的一次趨向過程當中,細菌的運動方向可能根據下式表示:

其中 △i 指定爲一個隨機方向向量,元素範圍爲[-1,1]

2)羣聚

羣聚這個有趣的羣體行爲,已經在好幾種細菌物種裏被發現有相似的行爲,包括大腸桿菌,鼠傷寒沙門氏菌。

其中複雜性和穩定性的時空格局(羣聚)造成在半固體培養基。在羣聚中,細胞不是但個體的行爲,而是個體與個體間互相影響的複雜行爲模式。

在一次實驗中,當使用一個養分化療效果器放置半固體基質到其中時,大腸桿菌細胞依靠拉動養分梯度來安排本身在一個羣聚圈中。

在另外一次獨立實驗中,當使用一個高等級的琥珀酸去刺激時,大腸桿菌細胞釋放一個有吸引力的穀草,這能夠幫助他們去彙集成一個羣組,從而移動成像高密度細菌羣體的同心圓形狀圖案。

這種細胞-細胞信號傳導在大腸桿菌羣體中能夠經過下面的函數來表示出來:

 

其中表示是目標函數值;

S是細菌的總數;

p是將要被優化的變量的數量(即搜索空間的維度);

每個細菌都是p維搜索域中的一個點;

是須要被搜索優化的係數(超參數)。

3)複製

至少當每個健康的細菌無性分裂成兩個細菌,而後放置在原先的位置,健康的細菌才最終死亡。這樣將保持細菌羣體大小的不變。

4)消除和擴散

細菌生活的環境逐漸的改變或者忽然的改變均可能因爲各類各樣的緣由而發生。

例如:當地顯著的氣溫上升可能殺死一組目前生活在一個區域內且有高濃度養分鹽梯度的細菌。以致於一個區域內的細菌都被殺死或者一組細菌擴散到一個新的區域。這是一種種羣羣體移動的現象。

BFOA對這一現象的模式方式以下:

一些細菌被以很小几率的隨機地清算掉,隨後新的替代品細胞們在搜索空間被隨機初始化後。

0x3:BFOA算法流程

參數:
【步驟 1】初始化參數 p,S,Nc,Ns,Nre,Ned,Ped,C(i)(i=1,2,…S),θi
算法:
【步驟 2】消除-擴散 循環 loop:l=l+1
【步驟 3】複製循環 Loop:k=k+1
【步驟 4】趨化循環 Loop:j=j+1
  [a] i=1,2,……S 細菌 i 進化趨化移動

  [b] 計算適應值函數 J(i,j,k,l)

 

   [c] 讓 保存值,由於經過移動咱們可能找到更好的。

【步驟 5】若是 j < Nc,跳轉到步驟4。這種狀況下繼續進行趨化,由於細菌的生命並未結束。
【步驟 6】複製 - 消除:
  [a] 根據給定的 k 跟 l,對i=1,2,……S,循環,讓 

做爲 i 細菌的一種它生命週期中度過多少養分以及怎樣成功的避免有害物質的數值化衡量。高代價意味着低健康
  [b] 擁有最高的 Jhealth值的 Sr 細菌死亡,擁有最低的Jhealth值的細菌分裂開來(結果放置在它們原先的父母的位置)。
【步驟 7】若是 K < Nre,跳到步驟3。這種狀況下,咱們沒有達到制定複製的數量,因此,咱們開始下一次趨化循環,產生後代。
【步驟 8】驅散:以機率Ped 進行循環 i=1,2,……S,驅散每個細菌(保持持續不變的細菌種羣數量)。若是 l < Ned,而後跳轉到步驟2;不然結束。 

流程圖以下所示:

Relevant Link:

http://www2.ece.ohio-state.edu/~passino/PapersToPost/BFO-IJSIR.pdf
https://ieeexplore.ieee.org/document/1004010 
https://www.cnblogs.com/L-Arikes/p/3734353.html

 

4. 一種全局最優化算法  - 隨機遊走算法(Random Walk)

0x1:隨機遊走算法步驟

設目標函數 f(x) 是一個含有 n 個變量的多元函數,x=(x1,x2,...,xn) n 維向量。f(x) 的超曲面空間就是咱們要進行搜索的向量空間。

1)給定初始迭代點 x,初始行走步長λ,控制精度ϵ(ϵ是一個很是小的正數,用於控制結束算法);

2)給定迭代控制次數 N,k 爲當前迭代次數,置 k=1;

3)當 k < N 時,隨機生成一個(−1,1) 之間的 n 維向量 u=(u1,u2,⋯,un),(−1 < ui < 1,i=1,2,⋯,n),並將其標準化獲得。令 x1 = x + λu′,完成第一步遊走嘗試(注意這一步僅僅只是嘗試)。

4)計算函數值

  4.1)若是 f(x1) < f(x),即找到了一個比初始值好的點,那麼 k 從新置爲1,同時將 x1 變爲 x(完成實際的前進),回到第2步;

  4.2)不然 k = k+1,回到第3步,繼續其餘方向的隨機遊走的嘗試。

5)若是連續 N 次都找不到更優的值,則認爲,最優解就在以當前最優解爲中心,當前步長爲半徑的 n 維球內(若是是三維,則恰好是空間中的球體)。此時:

  5.1)若是 λ < ϵ,則結束算法,即算法已經收斂;

  5.2)不然,令 λ= λ / 2,減少學習率,回到第1步,開始新一輪遊走。

0x2:隨機遊走的代碼實現

咱們假設目標函爲,實際的目標函數多是任意形式的,根據你本身在項目裏的實際場景而定。

咱們的目標是f(r) 的最大值。

該函數是一個多峯函數,在 (5050) 處取得全局最大值 1.1512,第二最大值在其全局最大值附近,採用通常的優化方法很容易陷入局部極大值點。

這裏是求解函數的最大值問題,能夠將其轉化爲求目標函數的相反數的最小值問題,即對偶求解思想。具體代碼以下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__  import print_function
import math
import random

N = 100     # 迭代次數
step = 0.5  # 初始步長
epsilon = 0.00001   # 收斂閾值
variables = 2   # 變量數目,搜索空間的維度
x = [49, 49]     # 初始點座標
walk_num = 1    # 初始化隨機遊走次數

print("迭代次數:", N)
print("初始步長:", step)
print("epsilon:", epsilon)
print("變量數目:", variables)
print("初始點座標:", x)


# 定義目標函數
def obj_function(p):
    r = math.sqrt((p[0]-50)**2 + (p[1]-50)**2) + math.e
    f = math.sin(r) / r + 1
    return -f


# 開始隨機遊走
while(step > epsilon):  # 判斷是否收斂中止算法
    k = 1   # 初始化計數器
    while(k < N):
        u = [random.uniform(-1, 1) for i in range(variables)]       # 隨機向量
        # u1 爲標準化以後的隨機向量
        u1 = [u[i] / math.sqrt(sum([u[i]**2 for i in range(variables)])) for i in range(variables)]
        x1 = [x[i] + step*u1[i] for i in range(variables)]      # 隨機遊走嘗試
        if(obj_function(x1) < obj_function(x)):     # 若是找到了更優勢
            k = 1   # 重置 k
            x = x1  # 更新座標
        else:
            k += 1  # 繼續下一次隨機遊走嘗試
    step = step/2
    print("第 %d 次隨機遊走完成。" % walk_num)
    walk_num += 1
print("隨機遊走次數:", walk_num-1)
print("最終最優勢:", x)
print("最終最優值:", obj_function(x))

1. 隨機遊走依然容易陷入局部鞍點

基本的隨機遊走算法對於初始點比較敏感,能夠看出,當初始點位於最優勢附件時,能夠很好地達到全局最優勢;

若是將初始點設置得離最優勢較遠,好比設置初始點爲(10,10)時,其餘參數不變,獲得結果爲:

能夠發現,隨機遊走陷入了局部最優勢。

2. 擴大嘗試次數 N、以及步長 λ 有助於脫離局部最優勢

無論是SGD,仍是隨機遊走,都同樣面臨陷入局部最小值的問題中。解決(或者說緩解)這一問題的方法是增大迭代次數 N 以及初始步長λ,能夠在必定程度上增長尋優能力。

固然,增大迭代次數 N 以及初始步長 λ 也會引入新的問題,就是增大收斂過程的抖動,能夠想象,若是目標函數已經優化到真正的全局最小值點附近了,由於步長 λ 過大,目標函數會不斷在極值點附近來回擺動。

0x3:改進的隨機遊走算法

改進的隨機遊走算法的不一樣之處是在於第3步,原來是產生一個隨機向量u,如今則是產生n個隨機向量u1,u2,,unn是給定的一個正整數。

n ui(i=1,2,,n) 標準化獲得u1u2un,利用公式 xi = x + λui,min{x1x2xn}替換原來的x1,其餘步驟保持不變。

改進的核心思想在於:增長了ramdom process的干預程度,本來只有一次ramdom process,即決定一個肯定的方向後進行隨機遊走嘗試。改進後變爲在各個維度上所有ramdom,

同時在各個向量維度上進行隨機遊走嘗試,最後再綜合評價本次隨機遊走嘗試的優劣。

經過這種方式改進以後,隨機遊走算法的尋優能力大大提升,並且對於初始值的依賴程度也下降了。

n=10,初始點爲(100,10),N=100λ=10.0ϵ=0.00001,改進的隨機遊走算法實現代碼以下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__  import print_function
import math
import random

N = 100     # 迭代次數
step = 10.0     # 初始步長
epsilon = 0.00001
variables = 2   # 變量數目
x = [-100,-10]  # 初始點座標
walk_num = 1    # 初始化隨機遊走次數
n = 10  # 每次隨機生成向量u的數目

print("迭代次數:", N)
print("初始步長:", step)
print("每次產生隨機向量數目:", n)
print("epsilon:", epsilon)
print("變量數目:", variables)
print("初始點座標:", x)


# 定義目標函數
def obj_function(p):
    r = math.sqrt((p[0]-50)**2 + (p[1]-50)**2) + math.e
    f = math.sin(r)/r + 1
    return -f


# 開始隨機遊走
while(step > epsilon):
    k = 1   # 初始化計數器
    while(k < N):
        # 產生n個向量u
        x1_list = []    # 存放x1的列表
        for i in range(n):
            u = [random.uniform(-1,1) for i1 in range(variables)]   # 隨機向量
            # u1 爲標準化以後的隨機向量
            u1 = [u[i3]/math.sqrt(sum([u[i2]**2 for i2 in range(variables)])) for i3 in range(variables)]
            x1 = [x[i4] + step*u1[i4] for i4 in range(variables)]
            x1_list.append(x1)
        f1_list = [obj_function(x1) for x1 in x1_list]
        f1_min = min(f1_list)
        f1_index = f1_list.index(f1_min)
        x11 = x1_list[f1_index]     # 最小f1對應的x1
        if(f1_min < obj_function(x)): # 若是找到了更優勢
            k = 1
            x = x11
        else:
            k += 1
    step = step / 2
    print("第%d次隨機遊走完成。" % walk_num)
    walk_num += 1

print("隨機遊走次數:",walk_num-1)
print("最終最優勢:",x)
print("最終最優值:", obj_function(x))

能夠發現,即便迭代次數N=100不大,初始點(100,10)離最優勢(50,50)很是遠,改進的隨機遊走算法依然能夠達到最優勢。

這說明了改進的隨機遊走算法具備更強大的尋優能力以及對於初始點更低的依賴性。

筆者思考:無論是SGD/GD仍是batch-SGD,每次FP和BP過程的權重調整都是針對全部神經元同時進行的,同一個層上的神經元收到的調整反饋都是相同的。

在這一點上,SGD跳出局部鞍點的能力就沒有改進後的隨機遊走算法強

0x4:步長 λ 的意義

不管是隨機遊走算法仍是改進的隨機遊走算法,對於步長都是很是依賴的。

步長λ越大,意味着初始能夠尋找最優解的空間越大,但同時也意味着更多的迭代次數(要搜索空間變大,尋找次數變多,相應時間天然要增長)。

若是步長取得太小,即便N很大,也很難達到最優解,過早陷入局部最優。

不管對於隨機遊走算法仍是改進的隨機遊走算法皆是如此。因此理論上步長λ越大越好。可是步長越大,迭代總次數越高,算法運行時間越長。因此實踐中能夠多試驗幾回,將λ取得適當地大便可。

Relevant Link: 

http://www.cnblogs.com/lyrichu/p/7209529.html
http://www.cnblogs.com/lyrichu/p/7209529.html 

 

5. Ramdom Walk Graph Segmentation 隨機遊走圖像分割算法

假設咱們要對一個網絡進行模塊挖掘,那麼一種可行的方法就是隨機挑選網絡中的一些節點做爲種子節點,而後進行隨機遊走(計算馬爾科夫矩陣),對於計算結果,咱們能夠只取機率較高的前幾個做爲可到達節點,以後採用一種相似於序列比對的方法來將全部種子節點遊走的結果進行比對拼接,而後得到不一樣的模塊。這樣作的一個好處就是結果較爲穩定,而且所挖掘的模塊更加完整可靠。

下面是採用上述方法獲得的結果

其中相同顏色的節點屬於一個模塊。

0x1:基於隨機遊走的圖像分割算法思想

隨機遊走算法是一種基於圖論的分割算法,它的分割思想是,以圖像的像素爲圖的頂點,相鄰像素之間的四鄰域或八鄰域關係爲圖的邊(轉移機率)。以此構建網絡圖。

如圖所示,圖中小圓圈表明圖像上的每一個像素點,像素點間的折線可看爲權重。L1,L2,L3三個種子表明「打標點」,它能夠由用戶交互式輸入,也能夠是有監督學習中的打標樣本。

以未標記像素節點爲初始點,RandomWalk從未標記頂點開始隨機漫步,首次到達各種標記頂點的機率表明了未標記點歸屬於標記類的可能性,把最大的機率所在類的標籤賦給未標記頂點,完成一次分割,或者說完成一次歸屬,本來未標記的頂點如今歸屬到了一個類別中。
在上圖中能夠看到,L1/L2/L3 做爲標記的種子點。把圖像分割成對應的三部分。

0x2:算法流程

1. 創建圖模型

1)無向連通圖

首先,定義一個連通無向圖G=(V,E),用圖G 給圖像建模。其中V是頂點集合,E是圖中任意兩個頂點的無向邊集合,對應圖像像素的鏈接關係,鏈接兩個頂點 vi 和的邊 用 vj 表示。

2)邊權重矩陣

帶權圖要爲每條邊賦權值,邊 eij 的權值用 wij 表示,權重的計算公式以下:

,其中,gi 表示個像素點的灰度值、或紋理信息等參數;

3)節點轉移機率矩陣

對於圖中任意一點 vi 的轉移機率,其知足隨機遊走機率公式

Lij = di:若是 i = j:di爲頂點vi的度,是鏈接頂點的全部邊權值之和,di=sumj wij;
Lij = -wij:若是 i j 是相鄰節點,wij 是節點i 和節點j 之間的權重;
Lij = 0:other;

可構建圖的拉普拉斯矩陣,然而拉普拉斯是非滿秩矩陣,須要添加邊界約束條件,纔可根據方程組解出個各未知點的機率。也就是將圖像分割問題轉換爲Dirichlet問題進行求解。Dirichlet問題即就是尋找一個知足邊界條件的調和函數。

2. 求解狄利克雷方程

隨機遊走模型的創建,能夠理解爲狄利克雷積分條件的離散化。其可使用拉普拉斯矩陣來進行描述,即對隨機遊走模型的求解,能夠描述爲以下方程的最小化求解:

以已標記的K類頂點做爲邊界約束條件,求解未知點到各個類的機率。例如,求解各未知點遊走到L1的機率,則以,做爲約束條件。L2和L3也是同理。

所以,狄利克雷方程能夠變形以下:

而後把矩陣分紅標記的和未標記的。對x_U求偏微分, 一階導等於0, 獲得:

對於向量x_M,其中各個元素爲:

3. 模型的求解

對上述稀疏矩陣線性方程組的求解,最長用的是共軛梯度法。 

Relevant Link:

https://yq.aliyun.com/ziliao/522808
https://blog.csdn.net/hjimce/article/details/45201263
https://blog.csdn.net/u011773995/article/details/50438018
https://blog.csdn.net/menjiawan/article/details/47086423
https://blog.csdn.net/Broccoli_Lian/article/details/79739299
相關文章
相關標籤/搜索