導航:首頁 > 編程語言 > numpy編程求解單純形法

numpy編程求解單純形法

發布時間:2023-06-02 12:51:29

『壹』 numpy是什麼意思

numpy的意思:是python的一種開源的數值計算擴展。

補充資料:

Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。python是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用於獨立的、大型項目的開發衫鏈。

簡介:

Python由荷蘭數學胡唯和計算機科學研究學會的Guido van Rossum於1990 年代初設計,作為一門叫做ABC語言的替代品。Python提供了高效的高級數據結構,還能簡單有效地面向對象編程

Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快褲塌培速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。

『貳』 import numpy as np是什麼意思

這是使用的numpy模塊中的隨機函數。

1、numpy.ndarray.shape 返回一個數組維度的元組比如12345678import numpy as npx = np.array([1, 2])y = np.array([[1],[2]])print x.shapeprint y.shape>>>(2,)(2, 1)註:x[1,2]的shape值(2,)。

2、意思是一維數組,數組中有2個元素y[[1],[2]]的shape值是(2,1),意思是一個二維數組,每個數組中有1個元素, from numpy import 然後就可以使用你的random.rand(4,4)了不過,不建議這樣導入。

拓展資料:

NumPy系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也可以用來表示矩陣(matrix))。

一個用python實現的科學計算包。包括:

1、一個強大的N維數組對象Array;

2、比較成熟的(廣播)函數庫;

3、用於整合C/C++和Fortran代碼的工具包;

4、實用的線性代數、傅里葉變換和隨機數生成函數。numpy和稀疏矩陣運算包scipy配合使用更加方便。

NumPy(Numeric Python)提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專為進行嚴格的數字處理而產生。多為很多大型金融公司使用,以及核心的科學計算組織如:Lawrence Livermore,NASA用其處理一些本來使用C++,Fortran或Matlab等所做的任務。

『叄』 Python科學計算常用的工具包有哪些

1、 NumPy


NumPy幾乎是一個無法迴避的科學計算工具包,最常用的也許是它的N維數組對象,其他還包括一些成熟的函數庫,用於整合C/C++和Fortran代碼的工具包,線性代數、傅里葉變換和隨機數生成函數等。NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存儲單一數據類型的多維數組,而ufunc則是能夠對數組進行處理的函數。


2、SciPy:Scientific Computing Tools for Python


“SciPy是一個開源的Python演算法庫和數學工具包,SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。其功能與軟體MATLAB、Scilab和GNU Octave類似。 Numpy和Scipy常常結合著使用,Python大多數機器學習庫都依賴於這兩個模塊。”—-引用自“Python機器學習庫”


3、 Matplotlib


matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行制圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程序中。Matplotlib可以配合ipython shell使用,提供不亞於Matlab的繪圖體驗,總之用過了都說好。


關於Python科學計算常用的工具包有哪些,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。

『肆』 如何用python編程求解二元一次方程組。如x+y=3;x-y=1

利用 numpy 很簡單。可以利用pip安裝

pipinstallnumpy

然後(以你的方程為例),python 下

Python2.7.10(default,Oct232015,19:19:21)
[GCC4.2.1CompatibleAppleLLVM7.0.0(clang-700.0.59.5)]ondarwin
Type"help","right","credits"or"license"formoreinformation.
>>>importnumpyasnp
>>>a=np.array([[1,1],[1,-1]])
>>>b=np.array([3,1])
>>>printnp.linalg.solve(a,b)
[2.1.]

如果你學過 線性代數,那麼這段代碼很好理解。

『伍』 銷售量服從泊松分布,怎樣獲取最大利潤

如何實現大數據利潤最大利潤化

制定合適的價格很重要,再怎麼誇大都不過分。價格提高1%意味著經營利潤平均可以增長8.7%(當然,假設銷量沒有損失)。不過我們估計,在許多公司每年制定的成千上萬個定價決策中,多達30%未能給出最合適的價格——這意味著收入大量流失。而且考慮到如今海量數據為公司提供了難得的機會,可以做出合理得多的定價決策,這種現狀尤其令人不安。對那些能夠井然有序地應對復雜的大數據的公司而言,這蘊含著巨大價值。

將數據轉化為利潤的四個步驟

想制定更合適的價格,關鍵是完全明白現在可供公司使用的數據。這就需要放大目標,而不是縮小目標。正如綜合性能源和化工企業沙索(Sasol)集團副總裁兼營銷和銷售總經理湯姆·奧布賴恩(Tom O』Brien)提及這種做法時說:「銷售團隊知道價格,還可能知道銷量,但這種做法需要了解更多信息:極其精細的數據,實際上來自每一張發票,按產品、客戶和包裝分門別類。」

事實上,將大數據成功應用於B2B環境方面最激動人心的一些例子實際上不僅僅著眼於定價,還涉及一家公司的商業引擎的其他方面。比如說,「動態交易評分」(dynamic deal scoring)提供了單筆交易層面的價格指導,還提供了決策逐級上報點、激勵機制、績效評分及更多方面,立足於一系列相似的盈/虧交易。使用較小的、相關的交易樣本很有必要,因為與任何一筆交易息息相關的因素會有變化,這導致一系列總體交易成為毫無用處的衡量基準。我們已見過這種方法應用於技術行業,取得了巨大成功。將銷售利潤率提高了4到8個百分點(相對於同一家公司的對照組)。

想獲得足夠精細的數據,公司就要做好這四項工作

傾聽數據。制定最合理的價格不是牽涉數據的挑戰(公司通常已經坐擁龐大的數據寶庫),而是牽涉分析的挑戰。最出色的B2C公司知道如何解釋自己擁有的海量數據,並見機行事,但B2B公司往往一味管理數據,而不是利用數據推動決策。優秀的分析工具可以幫助公司確定經常被忽視的因素(比如更宏觀的經濟形勢、產品偏好以及銷售代表的洽談),揭示什麼因素左右針對每個客戶群和產品的價格。

提高自動化。人工分析數千種孝頃產品太耗費時間和財力。自動化系統可以識別狹小的客戶群,確定什麼因素左右每個客戶群的價值,並且拿來與歷史交易數據進行比較。這樣一來,公司就可以根據數據,為產品群和客戶群制定有針對性的價格。自動化還大大簡化了復制和調整分析的工作,因此沒必要每次都從頭開始分析。

培養技能、樹立信心。實施新價格既在運營方面帶來了挑戰,又在溝通攜族方面帶來了挑戰。成功的公司非常注重深思熟慮的變革計劃,幫助銷售隊伍了解並接受新的定價方法。公司需要與銷售代表們齊心協力,解釋為什麼實行建議價,這巧隱陸套價格體系是如何運作的,那樣銷售代表就會非常信任價格,從而竭力說服顧客。同樣重要的是制定一套明確清晰的溝通方法,為價格給出一個理由,從而著重突出價值,然後針對具體顧客給出相應的理由。全面的洽談培訓也至關重要,以便讓銷售代表獲得信心和工具,那樣與客戶面對面交流時,能拿出頗有說服力的理由。最優秀的領導陪同銷售代表會見最難拿下的客戶,專注於迅速見效,那樣銷售代表就能樹立起信心,積極奉行新的定價方法。林德集團旗下瑞士PanGas AG公司的總經理羅伯特·克里格(Robert Krieger)說:「表明領導層支持這種新的定價方法這個立場,至關重要。為此,我們採取的做法就是領導層與銷售代表一起拜見難纏的客戶。我們不僅能夠幫助銷售代表,還能夠闡明為什麼制定新價格。」

積極管理績效。想改善績效管理,公司就需要藉助實用的績效指標支持銷售隊伍。最大的影響來自確保銷售一線對於客戶帶來的利潤瞭然於胸;銷售和營銷部門擁有合適的分析技能,得以發現機會,並牢牢抓住機會。還需要將權力下放給銷售隊伍,讓他們自行調整價格,而不是依賴集中式團隊。這不僅需要創業理念,還需要在針對特定的客戶制定價格策略時有一定的創造力。在改變定價策略和績效衡量標準的同時,可能還要改變激勵機制。

我們已經看到了這一幕:軟體、化工、建材和電信等眾多行業的公司利用大數據,幫助制定更合理的定價決策,因而收到顯著成效。這些公司都有數量眾多的庫存單位(SKU)和交易,還有一大批高度分散的客戶;重新制定價格後,都發現利潤率提高了3%到8%,這些價格是在極其精細的產品數據層面制定的。僅舉一例,一家歐洲建材公司為幾種有所選擇的產品制定合適的價格後,利潤增幅高達20%。如果公司想制定合適的價格,就應該充分利用大數據,並投入足夠的資源來支持銷售代表,否則它們會發現自己在為此付出高昂的代價:利潤流失。

轉載請註明:數據分析 » 如何實現大數據利潤最大利潤化

量化分析師的Python_python 金融量化分析_python金融大數據分析

量化分析師的Python_python 金融量化分析_python金融大數據分析

一、SciPy概述
前篇已經大致介紹了NumPy,接下來讓我們看看SciPy能做些什麼。NumPy替我們搞定了向量和矩陣的相關操作,基本上算是一個高級的科學計算器。SciPy基於NumPy提供了更為豐富和高級的功能擴展,在統計、優化、插值、數值積分、時頻轉換等方面提供了大量的可用函數,基本覆蓋了基礎科學計算相關的問題。

在量化分析中,運用最廣泛的是統計和優化的相關技術,本篇重點介紹SciPy中的統計和優化模塊,其他模塊在隨後系列文章中用到時再做詳述。

本篇會涉及到一些矩陣代數,如若感覺不適,可考慮跳過第三部分或者在理解時簡單採用一維的標量代替高維的向量。

首先還是導入相關的模塊,我們使用的是SciPy裡面的統計和優化部分:

In[1]:

import numpy as npimport scipy.stats as statsimport scipy.optimize as opt

二、統計部分2.1 生成隨機數

我們從生成隨機數開始,這樣方便後面的介紹。生成n個隨機數可用rv_continuous.rvs(size=n)或rv_discrete.rvs(size=n),其中rv_continuous表示連續型的隨機分布,如均勻分布(uniform)、正態分布(norm)、貝塔分布(beta)等;rv_discrete表示離散型的隨機分布,如伯努利分布(bernoulli)、幾何分布(geom)、泊松分布(poisson)等。我們生成10個[0, 1]區間上的隨機數和10個服從參數$a = 4$,$b = 2$的貝塔分布隨機數:

In[2]:

rv_unif = stats.uniform.rvs(size=10)print rv_unifrv_beta = stats.beta.rvs(size=10, a=4, b=2)print rv_beta

[ 0.20630272 0.25929204 0.16859206 0.92573462 0.16383319 0.3475617 0.83792048 0.79574153 0.37945051 0.23439682][ 0.71216492 0.85688464 0.70310131 0.3783662 0.69507561 0.78626586 0.54529967 0.4261079 0.26646767 0.8519046 ]

在每個隨機分布的生成函數里,都內置了默認的參數,如均勻分布的上下界默認是0和1。可是一旦需要修改這些參數,每次生成隨機都要敲這么老長一串有點麻煩,能不能簡單點?SciPy里頭有一個Freezing的功能,可以提供簡便版本的命令。SciPy.stats支持定義出某個具體的分布的對象,我們可以做如下的定義,讓beta直接指代具體參數$a = 4$和$b = 2$的貝塔分布。為讓結果具有可比性,這里指定了隨機數的生成種子,由NumPy提供。

In[3]:

np.random.seed(seed=2015)rv_beta = stats.beta.rvs(size=10, a=4, b=2)print "method 1:"print rv_betanp.random.seed(seed=2015)beta = stats.beta(a=4, b=2)print "method 2:"print beta.rvs(size=10)

method 1:[ 0.43857338 0.9411551 0.75116671 0.92002864 0.62030521 0.56585548 0.41843548 0.5953096 0.88983036 0.94675351]method 2:[ 0.43857338 0.9411551 0.75116671 0.92002864 0.62030521 0.56585548 0.41843548 0.5953096 0.88983036 0.94675351]

2.2 假設檢驗

好了,現在我們生成一組數據,並查看相關的統計量(相關分布的參數可以在這里查到:http://docs.scipy.org/doc/scipy/reference/stats.html):

In[4]:

norm_dist = stats.norm(loc=0.5, scale=2)n = 200dat = norm_dist.rvs(size=n)print "mean of data is: " + str(np.mean(dat))print "median of data is: " + str(np.median(dat))print "standard deviation of data is: " + str(np.std(dat))

mean of data is: 0.705195138069median of data is: 0.658167882933standard deviation of data is: 2.08967006905

假設這個數據是我們獲取到的實際的某些數據,如股票日漲跌幅,我們對數據進行簡單的分析。最簡單的是檢驗這一組數據是否服從假設的分布,如正態分布。這個問題是典型的單樣本假設檢驗問題,最為常見的解決方案是採用K-S檢驗( Kolmogorov-Smirnov test)。單樣本K-S檢驗的原假設是給定的數據來自和原假設分布相同的分布,在SciPy中提供了kstest函數,參數分別是數據、擬檢驗的分布名稱和對應的參數:

In[5]:

mu = np.mean(dat)sigma = np.std(dat)stat_val, p_val = stats.kstest(dat, 'norm', (mu, sigma))print 'KS-statistic D = %6.3f p-value = %6.4f' % (stat_val, p_val)

KS-statistic D = 0.045 p-value = 0.8195

假設檢驗的$p$-value值很大(在原假設下,$p$-value是服從[0, 1]區間上的均勻分布的隨機變數,可參考http://en.wikipedia.org/wiki/P-value ),因此我們接受原假設,即該數據通過了正態性的檢驗。在正態性的前提下,我們可進一步檢驗這組數據的均值是不是0。典型的方法是$t$檢驗($t$-test),其中單樣本的$t$檢驗函數為ttest_1samp:

In[6]:

stat_val, p_val = stats.ttest_1samp(dat, 0)print 'One-sample t-statistic D = %6.3f, p-value = %6.4f' % (stat_val, p_val)

One-sample t-statistic D = 4.761, p-value = 0.0000

我們看到$p$-value$ < 0.05$,即給定顯著性水平0.05的前提下,我們應拒絕原假設:數據的均值為0。我們再生成一組數據,嘗試一下雙樣本的$t$檢驗(ttest_ind):

In[7]:

norm_dist2 = stats.norm(loc=-0.2, scale=1.2)dat2 = norm_dist2.rvs(size=n/2)stat_val, p_val = stats.ttest_ind(dat, dat2, equal_var=False)print 'Two-sample t-statistic D = %6.3f, p-value = %6.4f' % (stat_val, p_val)

Two-sample t-statistic D = 5.565, p-value = 0.0000

注意,這里我們生成的第二組數據樣本大小、方差和第一組均不相等,在運用$t$檢驗時需要使用Welch』s $t$-test,即指定ttest_ind中的equal_var=False。我們同樣得到了比較小的$p$-value$,在顯著性水平0.05的前提下拒絕原假設,即認為兩組數據均值不等。

stats還提供其他大量的假設檢驗函數,如bartlett和levene用於檢驗方差是否相等;anderson_ksamp用於進行Anderson-Darling的K-樣本檢驗等。

2.3 其他函數

有時需要知道某數值在一個分布中的分位,或者給定了一個分布,求某分位上的數值。這可以通過cdf和ppf函數完成:

In[8]:

g_dist = stats.gamma(a=2)print "quantiles of 2, 4 and 5:"print g_dist.cdf([2, 4, 5])print "Values of 25%, 50% and 90%:"print g_dist.pdf([0.25, 0.5, 0.95])

quantiles of 2, 4 and 5:[ 0.59399415 0.90842181 0.95957232]Values of 25%, 50% and 90%:[ 0.1947002 0.30326533 0.36740397]

對於一個給定的分布,可以用moment很方便的查看分布的矩信息,例如我們查看$N(0, 1)$的六階原點矩:

In[9]:

stats.norm.moment(6, loc=0, scale=1)

Out[9]:

15.000000000895332

describe函數提供對數據集的統計描述分析,包括數據樣本大小,極值,均值,方差,偏度和峰度:

In[10]:

norm_dist = stats.norm(loc=0, scale=1.8)dat = norm_dist.rvs(size=100)info = stats.describe(dat)print "Data size is: " + str(info[0])print "Minimum value is: " + str(info[1][0])print "Maximum value is: " + str(info[1][1])print "Arithmetic mean is: " + str(info[2])print "Unbiased variance is: " + str(info[3])print "Biased skewness is: " + str(info[4])print "Biased kurtosis is: " + str(info[5])

Data size is: 100Minimum value is: -4.12414564687Maximum value is: 4.82577602489Arithmetic mean is: 0.0962913592209Unbiased variance is: 2.88719292463Biased skewness is: -0.00256548794681Biased kurtosis is: -0.317463421177

當我們知道一組數據服從某些分布的時候,可以調用fit函數來得到對應分布參數的極大似然估計(MLE, maximum-likelihood estimation)。以下代碼示例了假設數據服從正態分布,用極大似然估計分布參數:

In[11]:

norm_dist = stats.norm(loc=0, scale=1.8)dat = norm_dist.rvs(size=100)mu, sigma = stats.norm.fit(dat)print "MLE of data mean:" + str(mu)print "MLE of data standard deviation:" + str(sigma)

MLE of data mean:-0.249880829912MLE of data standard deviation:1.89195303507

pearsonr和spearmanr可以計算Pearson和Spearman相關系數,這兩個相關系數度量了兩組數據的相互線性關聯程度:

In[12]:

norm_dist = stats.norm()dat1 = norm_dist.rvs(size=100)exp_dist = stats.expon()dat2 = exp_dist.rvs(size=100)cor, pval = stats.pearsonr(dat1, dat2)print "Pearson correlation coefficient: " + str(cor)cor, pval = stats.pearsonr(dat1, dat2)print "Spearman's rank correlation coefficient: " + str(cor)

Pearson correlation coefficient: -0.0262911931014Spearman's rank correlation coefficient: -0.0262911931014

其中的$p$-value表示原假設(兩組數據不相關)下,相關系數的顯著性。

最後,在分析金融數據中使用頻繁的線性回歸在SciPy中也有提供,我們來看一個例子:

In[13]:

x = stats.chi2.rvs(3, size=50)y = 2.5 + 1.2 * x + stats.norm.rvs(size=50, loc=0, scale=1.5)slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)print "Slope of fitted model is:" , slopeprint "Intercept of fitted model is:", interceptprint "R-squared:", r_value**2

Slope of fitted model is: 1.44515601191Intercept of fitted model is: 1.91080684516R-squared: 0.798786910173

在前面的鏈接中,可以查到大部分stat中的函數,本節權作簡單介紹,挖掘更多功能的最好方法還是直接讀原始的文檔。另外,StatsModels(http://statsmodels.sourceforge.net )模塊提供了更為專業,更多的統計相關函數。若在SciPy沒有滿足需求,可以採用StatsModels。

三、優化部分

優化問題在投資中可謂是根本問題,如果手上有眾多可選的策略,應如何從中選擇一個「最好」的策略進行投資呢?這時就需要用到一些優化技術針對給定的指標進行尋優。隨著越來越多金融數據的出現,機器學習逐漸應用在投資領域,在機器學習中,優化也是十分重要的一個部分。以下介紹一些常見的優化方法,雖然例子是人工生成的,不直接應用於實際金融數據,我們希望讀者在後面遇到優化問題時,能夠從這些簡單例子迅速上手解決。

3.1 無約束優化問題

所謂的無約束優化問題指的是一個優化問題的尋優可行集合是目標函數自變數的定義域,即沒有外部的限制條件。例如,求解優化問題 [

minimizef(x)=x24.8x+1.2

] 就是一個無約束優化問題,而求解 [

minimizef(x)=x24.8x+1.2subject tox≥0

]則是一個帶約束的優化問題。更進一步,我們假設考慮的問題全部是凸優化問題,即目標函數是凸函數,其自變數的可行集是凸集。(詳細定義可參考斯坦福大學Stephen Boyd教授的教材convex optimization,下載鏈接:http://stanford.e/~boyd/cvxbook )

我們以Rosenbrock函數 [ f(mathbf{x}) = sum{i=1}^{N-1} 100 (x_i – x{i-1}^2)^2 + (1 – x_{i-1})^2 ] 作為尋優的目標函數來簡要介紹在SciPy中使用優化模塊scipy.optimize。

首先需要定義一下這個Rosenbrock函數:

In[14]:

def rosen(x): """The Rosenbrock function""" return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

3.1.1 Nelder-Mead單純形法

單純形法是運籌學中介紹的求解線性規劃問題的通用方法,這里的Nelder-Mead單純形法與其並不相同,只是用到單純形的概念。設定起始點$mathbf{x}_0 = (1.3, 0.7, 0.8, 1.9, 1.2)$,並進行最小化的尋優。這里『xtol』表示迭代收斂的容忍誤差上界:

In[15]:

x_0 = np.array([0.5, 1.6, 1.1, 0.8, 1.2])res = opt.minimize(rosen, x_0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Nelder-Mead Simplex algorithm:"print res

Optimization terminated successfully. Current function value: 0.000000 Iterations: 436 Function evaluations: 706Result of minimizing Rosenbrock function via Nelder-Mead Simplex algorithm: status: 0 nfev: 706 success: True fun: 1.6614969876635003e-17 x: array([ 1., 1., 1., 1., 1.]) message: 'Optimization terminated successfully.' nit: 436

Rosenbrock函數的性質比較好,簡單的優化方法就可以處理了,還可以在minimize中使用method=』powell』來指定使用Powell』s method。這兩種簡單的方法並不使用函數的梯度,在略微復雜的情形下收斂速度比較慢,下面讓我們來看一下用到函數梯度進行尋優的方法。

3.1.2 Broyden-Fletcher-Goldfarb-Shanno法

Broyden-Fletcher-Goldfarb-Shanno(BFGS)法用到了梯度信息,首先求一下Rosenbrock函數的梯度:

[ begin{split} frac{partial f}{partial xj} &= sum{i=1}^N 200(xi – x{i-1}^2)(delta{i,j} – 2x{i-1}delta{i-1,j}) -2(1 – x{i-1})delta_{i-1,j} &= 200(xj – x{j-1}^2) – 400xj(x{j+1} – x_j^2) – 2(1 – x_j) end{split}] 其中當$i=j$時,$delta_{i,j} = 1$,否則$delta_{i,j} = 0$。

邊界的梯度是特例,有如下形式: [ begin{split} frac{partial f}{partial x_0} &= -400x_0(x_1 – x_0^2) – 2(1 – x_0), frac{partial f}{partial x{N-1}} &= 200(x{N-1} – x_{N-2}^2) end{split}]

我們可以如下定義梯度向量的計算函數了:

In[16]:

def rosen_der(x): xm = x[1:-1] xm_m1 = x[:-2] xm_p1 = x[2:] der = np.zeros_like(x) der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm) der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0]) der[-1] = 200*(x[-1]-x[-2]**2) return der

梯度信息的引入在minimize函數中通過參數jac指定:

In[17]:

res = opt.minimize(rosen, x_0, method='BFGS', jac=rosen_der, options={'disp': True})print "Result of minimizing Rosenbrock function via Broyden-Fletcher-Goldfarb-Shanno algorithm:"print res

Optimization terminated successfully. Current function value: 0.000000 Iterations: 52 Function evaluations: 63 Gradient evaluations: 63Result of minimizing Rosenbrock function via Broyden-Fletcher-Goldfarb-Shanno algorithm: status: 0 success: True njev: 63 nfev: 63 hess_inv: array([[ 0.00726515, 0.01195827, 0.0225785 , 0.04460906, 0.08923649], [ 0.01195827, 0.02417936, 0.04591135, 0.09086889, 0.18165604], [ 0.0225785 , 0.04591135, 0.09208689, 0.18237695, 0.36445491], [ 0.04460906, 0.09086889, 0.18237695, 0.36609277, 0.73152922], [ 0.08923649, 0.18165604, 0.36445491, 0.73152922, 1.46680958]]) fun: 3.179561068096293e-14 x: array([ 1. , 0.99999998, 0.99999996, 0.99999992, 0.99999983]) message: 'Optimization terminated successfully.' jac: array([ 4.47207141e-06, 1.30357917e-06, -1.86454207e-07, -2.00564982e-06, 4.98799446e-07])

3.1.3 牛頓共軛梯度法(Newton-Conjugate-Gradient algorithm)

用到梯度的方法還有牛頓法,牛頓法是收斂速度最快的方法,其缺點在於要求Hessian矩陣(二階導數矩陣)。牛頓法大致的思路是採用泰勒展開的二階近似: [ f(mathbf{x}) approx f(mathbf{x}_0) + nabla f(mathbf{x}_0)(mathbf{x} – mathbf{x}_0) + frac{1}{2}(mathbf{x} – mathbf{x}_0)^Tmathbf{H}(mathbf{x}_0)(mathbf{x} – mathbf{x}_0) ] 其中$mathbf{H}(mathbf{x}_0)$表示二階導數矩陣。若Hessian矩陣是正定的,函數的局部最小值可以通過使上面的二次型的一階導數等於0來獲取,我們有: [ mathbf{x}_{mathrm{opt}} = mathbf{x}_0 – mathbf{H}^{-1}nabla f ]

這里可使用共軛梯度近似Hessian矩陣的逆矩陣。下面給出Rosenbrock函數的Hessian矩陣元素通式:

[ begin{split} H{i,j} = frac{partial^2 f}{partial x_i partial x_j} &= 200(delta{i,j} – 2x{i-1}delta{i-1,j}) – 400xi(delta{i+1,j} – 2xidelta{i,j}) – 400delta{i,j}(x{i+1} – xi^2) + 2delta{i,j}, &= (202 + 1200xi^2 – 400x{i+1}) delta{i,j} – 400x_idelta{i+1,j} – 400x{i-1}delta{i-1,j} end{split}] 其中$i,j in [1, N-2]$。其他邊界上的元素通式為: [ begin{split} frac{partial^2 f}{partial x_0^2} &= 1200x_0^2 – 400x_1 + 2, frac{partial^2 f}{partial x_0 partial x_1} = frac{partial^2 f}{partial x_1 partial x_0} &= -400x_0, frac{partial^2 f}{partial x{N-1} partial x{N-2}} = frac{partial^2 f}{partial x{N-2} partial x{N-1}} &= -400x_{N-2}, frac{partial^2 f}{partial x_{N-1}^2} &= 200. end{split}]

例如,當$N=5$時的Hessian矩陣為:

[ mathbf{H} =

[1200x20400x1+2400x0000400x0202+1200x21400x2400x1000400x1202+1200x22400x3400x2000400x2202+1200x23400x4400x3000400x3200]

]為使用牛頓共軛梯度法,我們需要提供一個計算Hessian矩陣的函數:

In[18]:

def rosen_hess(x): x = np.asarray(x) H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1) diagonal = np.zeros_like(x) diagonal[0] = 1200*x[0]**2-400*x[1]+2 diagonal[-1] = 200 diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:] H = H + np.diag(diagonal) return H

In[19]:

res = opt.minimize(rosen, x_0, method='Newton-CG', jac=rosen_der, hess=rosen_hess, options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian):"print res

Optimization terminated successfully. Current function value: 0.000000 Iterations: 20 Function evaluations: 22 Gradient evaluations: 41 Hessian evaluations: 20Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian): status: 0 success: True njev: 41 nfev: 22 fun: 1.47606641102778e-19 x: array([ 1., 1., 1., 1., 1.]) message: 'Optimization terminated successfully.' nhev: 20 jac: array([ -3.62847530e-11, 2.68148992e-09, 1.16637362e-08, 4.81693414e-08, -2.76999090e-08])

對於一些大型的優化問題,Hessian矩陣將異常大,牛頓共軛梯度法用到的僅是Hessian矩陣和一個任意向量的乘積,為此,用戶可以提供兩個向量,一個是Hessian矩陣和一個任意向量$mathbf{p}$的乘積,另一個是向量$mathbf{p}$,這就減少了存儲的開銷。記向量$mathbf{p} = (p_1, ldots, p_{N-1})$,可有

[ mathbf{H(x)p} = begin{bmatrix} (1200x0^2 – 400x_1 + 2)p_0 -400x_0p_1 vdots -400x{i-1}p{i-1} + (202 + 1200x_i^2 – 400x{i+1})pi – 400x_ip{i+1} vdots -400x{N-2}p{N-2} + 200p_{N-1} end{bmatrix} ]

我們定義如下函數並使用牛頓共軛梯度方法尋優:

In[20]:

def rosen_hess_p(x, p): x = np.asarray(x) Hp = np.zeros_like(x) Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1] Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1] -400*x[1:-1]*p[2:] Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1] return Hpres = opt.minimize(rosen, x_0, method='Newton-CG', jac=rosen_der, hessp=rosen_hess_p, options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian times arbitrary vector):"print res

Optimization terminated successfully. Current function value: 0.000000 Iterations: 20 Function evaluations: 22 Gradient evaluations: 41 Hessian evaluations: 58Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian times arbitrary vector): status: 0

轉載請註明:數據分析 » 量化分析師的Python_python 金融量化分析_python金融大數據分析

閱讀全文

與numpy編程求解單純形法相關的資料

熱點內容
情片網 瀏覽:64
php變慢 瀏覽:11
質數的後代python 瀏覽:149
如何做好美逛App 瀏覽:591
租伺服器租用後怎麼使用 瀏覽:285
木勺解壓助眠視頻 瀏覽:371
酒吧陪女電影 瀏覽:657
雙胞胎兄弟的韓國愛情電影 瀏覽:425
女人遇到網球教練韓國電影 瀏覽:43
一線影院和二線影院 瀏覽:379
韓國電影食物鏈裡面的女主角叫什麼名字? 瀏覽:461
程序員做開發256G夠用嗎 瀏覽:186
c程序編譯的秘密 瀏覽:178
安卓頁面廣告怎麼關閉 瀏覽:666
linux信號量命令 瀏覽:345
父親出門上班兒子和繼母的日本電影 瀏覽:954
安卓機怎麼摳鋼化膜 瀏覽:390
免費看影視網站7大入口 瀏覽:535
doctrinephp 瀏覽:752
dos命令ip 瀏覽:444