一、Metropolis演算法求積分
Metropolis演算法是一個蒙特卡羅模擬的演算法。在計算機模擬的過程中,它的主要作用就是求解高維積分,並且又能夠得到它的誤差範圍,因此也被稱為Metropolis-Hastings演算法。
def Metropolis(n, f, t, w, start): x=start naccept = 0 fstart = f(x) sum_f = 0.0 sum_ff = 0.0 for i in range(n): y = t(x) fy=f(y) a=w(x,y)*fy/fstart if np.random.random(1) < a: x = y naccept += 1 fstart = fy sum_f = sum_f+fstart sum_ff = sum_ff+(fstart**2) mean = sum_f/n var = (sum_ff/n)-(mean**2) std = np.sqrt(var) return (mean, std, naccept/n, x)
二、Metropolis演算法中文名字
Metropolis演算法的中文名字是「大都市演算法」,這個名字取自於它的發明者之一Nicholas Metropolis(大都市N. Metropolis,1915-1999),一個美國物理學家。Metropolis演算法其實是對貝葉斯方法的一種擬合模擬,它主要用於智能採樣、圖像處理、金融建模和生物學模擬等領域。
三、Metropolis演算法是什麼意思
Metropolis演算法是一種隨機搜索演算法,通過採用嘗試性的轉移從一個狀態到另一個狀態。在轉移狀態時,會接受一部分可能造成更差結果的情況,但是這一部分被接受情況的概率隨著轉移狀態而不斷減少,到達一定程度後就變成了0。
四、Metropolis演算法求伊辛模型
Metropolis演算法還被用於求解伊辛模型,它能夠通過Metropolis演算法的能量函數來求解伊辛模型中某一時刻的狀態和它們各自的權重。代碼示例如下:
def metropolis_ising(beta , n, l, r_init): delta = [-2,0,2] steps = l**2*n r = r_init rnorm = np.linalg.norm(r, ord=2) E = energy(r, l)/n min_E = E min_r = r.copy() record_E = np.zeros(steps) for i in range(steps): a = np.random.randint(0,l) b = np.random.randint(0,l) dx = delta[np.random.randint(0,3)] dy = delta[np.random.randint(0,3)] newr = r.copy() newr[a,b,0] = r[a,b,0]+dx newr[a,b,1] = r[a,b,1]+dy newE = energy(newr, l)/n dE = newE - E if dE<0: r = newr E = newE if E<min_E: min_E = E min_r = r.copy() elif np.random.rand()<np.exp(-beta*dE): r = newr E = newE record_E[i] = E return [min_r, min_E, record_E]
五、Metropolis演算法的實現過程
Metropolis演算法是依靠Markov馬爾可夫鏈來進行實現的。在每次迭代中,都從概率分布中抽取一個隨機狀態,並計算它的概率分布函數的值。然後,所有狀態之間的概率差別是計算的,一個隨機數產生,以確定是否以新狀態為中心的概率分布函數的值作為下一個狀態。流程圖如下:
1. 初始狀態S 2. for i in range(N):執行N次採樣操作 3. 從概率密度函數p(S)中隨機抽取一個狀態S_k 4. 假設從一個狀態S轉移到S_k,接受概率狀態為min(1,P(S_k)/P(S)) 5. 以概率a=min(1,P(S_k)/P(S)接受狀態轉移,否則保留原狀態 6. 記錄採樣軌跡 7. 如果在某些情況下不接受S_k,則重新隨機一個狀態並開始下一次迭代 8. 返回完整的採樣軌跡
六、Metropolis演算法的目的
Metropolis演算法的主要目的是有效的模擬和抽樣過程,同時在解決實際問題時也能夠適應於大的維度,讓我們以最小的代價找到最優解。Metropolis演算法通過不斷的採樣,使得它得到進一步優化,並且能夠適用於一般均值「前綴」預處理和最近鄰的加速。
七、Metropolis中文
Metropolis的中文翻譯為「大都市」,這是一個希臘姓氏,這個演算法的命名則來自於它的發明者之一Nicholas Metropolis。他們使用蒙特卡羅方法的統計性質,引導並加速反應進程。Metropolis在理解和優化許多物理化學反應動力學中的某些問題上發揮了重要作用。
八、Metropolis採樣
Metropolis採樣是基於Metropolis演算法的一種隨機採樣方法,它將給定的分布函數作為採樣目標,並將其轉換為轉移矩陣。轉移矩陣中每個元素都表示從一個狀態轉移到另一個狀態的概率。在採樣過程中,從當前狀態抽取樣本,並根據轉移矩陣中的概率確定該樣本是否接受或拒絕。當樣本接受時,系統進入到該樣本表示的狀態。當樣本被拒絕時,保持原來的狀態不變。 Metropolis採樣具有廣泛的應用,比如模擬純物質的相變,自組織系統模擬等。
九、Metropolis演算法代碼示例
下面是使用Python實現的Metropolis演算法,用於估計給定函數的平均值和標準偏差。
import numpy as np #定義接受轉移矩陣 def w(x, y): return 1 #定義轉移函數 def t(x): y = x+np.random.normal(0, 1, 1) return y #定義函數f(x) def f(x): return np.exp(-x**2/2)/np.sqrt(2*np.pi) #定義Metropolis演算法函數 def Metropolis(n, f, t, w, start): x=start naccept = 0 fstart = f(x) sum_f = 0.0 sum_ff = 0.0 for i in range(n): y = t(x) fy=f(y) a=w(x,y)*fy/fstart if np.random.random(1) < a: x = y naccept += 1 fstart = fy sum_f = sum_f+fstart sum_ff = sum_ff+(fstart**2) mean = sum_f/n var = (sum_ff/n)-(mean**2) std = np.sqrt(var) return (mean, std, naccept/n, x) mean, std, accept_ratio, x = Metropolis(1000000,f,t,w,0.0) print("Mean Estimate",mean) print("Standard Deviation Estimate",std) print("Acceptance Ratio",accept_ratio) print("Final Position",x)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248020.html