Sargent數量經濟學:SciPy
SciPy
SciPy(https://www.scipy.org/)包構建在NumPy基礎上,為科學計算提供了一些常用的工具,例如
線性代數
數值積分
插值
最優化
分布與隨機數生成
信號處理
等等
與NumPy一樣,SciPy也很穩定、成熟,並且被廣泛使用
許多SciPy程式都是對行業版Fortran軟體的再包裝,例如LAPACK,BLAS等等
你們並不需要學習整個SciPy
更加常見的方式是了解SciPy有什麼功能,然後看看其說明文件(https://docs.scipy.org/doc/scipy/reference/index.html)
在本講中,我們只強調該包中一些有用的部分
SciPyversusNumPy
SciPy是一個包含許多構建於NumPy基礎上的工具包,使用其數組數據類型和相關的函數
事實上,當我們輸入SciPy時,我們也得到了NumPy,被當作來自於SciPy初始化文件
然而,更常見、更好的方式是直接使用NumPy的函數
SciPy中有用的東西是其子包中的函數
scipy.optimize,scipy.integrate,scipy.stats, etc.
這些子包和他們的屬性需要單獨輸入
下面,我們看看一些主要的子包
Statistics
scipy.stats子包提供
大量的隨機變數對象(密度、積累分布、隨機抽樣,等等)
一些估計程序
一些統計檢驗
隨機變數和分布
回一下numpy.random提供的產生隨機變數的函數
這會從下列分布中產生一幅圖,其參數a,b=5,5
有時,我們需要得到密度,或CDF,分位點等
為了實現它,我們用scipy.stats,其提供了所有函數與隨機數生成的功能
例如
產生的圖如下
在這行代碼中,我們創建了一個所謂的rv_frozen對象,通過調用q=beta(5,5)
概念的「frozen」部分意味著q代表一個特殊分布,且有一些特別的參數
一旦我們這麼做,我們就能產生隨機數,得到密度等等,所有的都來自於該固定分布
創建這些對象的一般命令是
其中,distribution_name是scipy.stats(https://docs.scipy.org/doc/scipy/reference/stats.html)中的一個分布名
其中,有兩個關鍵的元素loc和scale,
這個命令把原始隨機變數X轉換成Y=c+dX
在結束這個部分之前,我們注意到調用上述方法,還有一種備擇方式
例如,下面的代碼替換上述代碼
Scipy.stats里的其它好玩意
在scipy.stats里,還有許多統計功能
欲知詳情,請參考說明文件(https://docs.scipy.org/doc/scipy/reference/stats.html#statistical-functions)
尋根與不動點
一個實函數在[a,b]上的根,即f(x)=0
例如,如果我們划出函數的圖
其中,x屬於[0,1],我們得到
唯一的根近似0.408
下面,我們來試試尋根的數值技術
二分法
最常用的數值尋根演算法就是二分法
為了理解其演算法,回憶一個著名的遊戲,其中
參與人A在1-100之間秘密想一個數字
參與人B問該數字是否小於50
如果小於,B就問是否小於25
如果不小於,B就問是否小於75
等等
這就是二分法
該演算法在Python中實施非常簡單
事實上,SciPy提供了自帶的二分法函數,下面我們就來使用一下公式(2)中定義的f
Newton-Raphson方法
另一種常用的尋根演算法是Newton-Raphson method(https://en.wikipedia.org/wiki/Newton%27s_method)
不像二分法,NR方法用局部斜率信息
該方法是一把雙刃劍:
當函數是well-behaved,NR方法就比二分法快
當函數不是,NR法可能就不靈了
我們用相同的函數來說明這個問題,首先看看潛在的不穩定性
第二個初始條件導致收斂失敗
另一方面,用Ipython的timeit,我們可以看見newton更快
混合法
迄今為止,我們已經發行NR法快,但不穩定
二分法穩健,但相對較慢
這說明一般性原理:
如果你關於你的函數有特殊的認識,你能有效地解出它
如果沒有,那麼,演算法選擇就要在收斂速度和穩健性之間做出取捨
從實踐來看,大部分默認的尋根、最優化和不動點演算法就是使用混合方法
這些方法以下列方式將速度和穩健性結合起來:
1、嘗試用快的方法
2、進行診斷
3、如果診斷結果不好,那麼,就轉向利用穩健的演算法
在scipy.optimize,函數brentq就是混合方法
這也能找到正確的根,速度幾乎與newton法相同
多元尋根
更多細節,參見說明文件(https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html)
不動點
SciPy也提供解不動點問題的函數
最優化
大多數數值包僅僅只剔紅最小化函數
最大化能通過把函數前面加負來轉換
最小化接近於尋根問題:對於平滑函數,內點最優對應著一階導數的尋根
上面所描述的速度/穩健性取捨現在就存在於數值最優化
除非你有一些先驗信息,最好的方式就是使用混合方法
對於約束單變數最小化,一種好的混合選項就是fminbound
多變數最優化
多變數局部最優化包括minimize,fmin,fmin_powell,fmin_cg,fmin_bfgs,和fmin_ncg
約束多變數局部最優化包括fmin_l_bfgs_b,fmin_tnc,fmin_cobyla
更多細節可參見說明文件(https://docs.scipy.org/doc/scipy/reference/optimize.html)
積分
大部分數值積分方法都是依靠計算一個近似多項式的積分
誤差依賴於多項式擬合積分的程度有多高
在SciPy中,數值積分的相關模塊是scipy.integrate
單變數積分的命令是quad
實際上,quad是一個Fortran包QUADPACK中標準數值積分的埠
它用Clenshaw-Curtis求積(https://en.wikipedia.org/wiki/Clenshaw-Curtis_quadrature),基於切比雪夫多項式展開
其它的單變數積分方法有fixed_quad,它運行很快,且在for循環中
還有許多多變數積分函數
詳細信息可參見https://docs.scipy.org/doc/scipy/reference/linalg.html
線性代數
NumPy為線性代數所提供的模塊稱為linalg
SciPy為線性代數提供的模塊也有相同的名字
更多細節可參見https://docs.scipy.org/doc/scipy/reference/linalg.html
TAG:宏觀經濟研學會 |
※Princeton Makes,Stockholm Takes-諾貝爾經濟學獎得主好書精選
※歧視經濟學,Discrimination bad?
※Esther Kinsky muses on a river in England 經濟學人.Jan18th2018
※經濟學人翻譯練習 The Economist
※經濟學人精讀 The Economist62上
※上海紐約大學NYU商學和經濟學客座教授廖明確認出席 Morketing Brand Summit 2019品牌高峰會
※經濟學法則?!Marvel 迷挑戰 24 小時內觀看《Avengers: Endgame》五次
※The digital proletariat 經濟學人.Jan 12th 2018
※從Token經濟學看PoS共識機制
※第一課 Jose Galvez 與性別經濟學
※諾貝爾經濟學獎得主Robert Shiller:比特幣是一場流行潮
※經濟學家Tuur Demeester:區塊鏈是具有里程碑意義的發明
※Open Source 101:開源經濟學原理
※金融時報|經濟學人 詞伙素材|Microsoft
※比特幣經濟學家Jeffrey Wernick:投資於人 並讓每個人意識到自身價值
※Ultrain Nova新星重磅發布並與經濟學家金刻羽正式簽約
※抵押獲得穩定資產收益?深入探討 Horuspay的Token 經濟學
※諾貝爾經濟學獎得主James J.Heckman:要藉助AI的力量更好地培養中國的孩子們
※以太坊核心開發者Karl Floersch:像黑客帝國那樣學習加密經濟學!
※對抗詐騙的新武器?Vitalik Buterin提出加密經濟學提案懲罰虛假信息