❶ 怎樣用python處理股票
用Python處理股票需要獲取股票數據,以國內股票數據為例,可以安裝Python的第三方庫:tushare;一個國內股票數據獲取包。可以在網路中搜索「Python tushare」來查詢相關資料,或者在tushare的官網上查詢說明文檔。
❷ #Python干貨#python實現——最優化演算法
函數詳見rres,此代碼使該演算法運行了兩次
收獲:
這是我第一個實現的代碼。學習完該演算法以後,邏輯框架基本上就有了,剩下需要明確的就是對應的python的語言。於是我就開始了查找「如何定義函數」(詳見mofan的優酷),「循環體」和「if條件語句」的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)「數學符號」(詳見mofan的優酷),以及print的使用
1.def是python中指定義,一般用來定義函數,如果需要深度學習搭建網路可用來定義網路。值得注意的一點是
我不清楚為什麼,但是如果沒有加的話,那個函數公式就是一個花瓶,就像一個結果輸不出去。
2.最坑的就是邏輯。一開始邏輯沒理清楚,或者說在代碼上有疏漏,導致我將left和right放在了循環體里,結果可想而知。不過也是因為這個錯誤,我知道pycharm中的debug怎麼用,挺簡單的,網路一下就出來了。
3.不知道什麼原因,看的莫煩視頻中的print多個變數一起輸出是沒有辦法在我的pycharm中使用的,出來的結果很奇怪。可能是因為我是win10不是ios吧。print如果多個變數一起輸出必須是print("名字:%s,名字2:%s"%(a,b))結果輸出就是名字:a ,名字2:b
關於python中數據變數。第一遍運行結果出現很明顯不對,於是我採用了debug。結果發現,mid1處一直為1而不是1.5,於是就開始了解數據變數。起初我猜測python默認所有變數為整型,但是根據二分法的結果我意識到此猜測不對,所以要改整個file的變數格式沒有必要。所以我就在mid1式子前面加了一個float,結果就顯示為1.5了。但是如果我將整個式子用()括起來,前面加float,結果還是1。我不太理解為什麼。不過我知道了python的數據格式是根據輸入量決定的,也就是說你的輸入量如果是整型,那麼與其直接相關的計算輸出結果一定是整型,而且還是不採用進位的整型。在我沒有採用+float/+.0這兩種方法之前,mid1~3全部是整型。
或者不再mid1前面加float,直接將輸入量後面點個點就行
真的很想吐槽一下print,好麻煩啊啊啊啊每次都得弄個%s,而且有時候還不能放一起!!!!
不要問我掌握了什麼,要問我現在寫完這個代碼後有多麼的愛python的精度表示 :-)我決定以後只要再編寫數學公式的代碼都將輸入量的小數學點後面補很多0
fibonacci函數定義,每次debug後我的手都是抖的O( _ )O~
不知道自己什麼時候有的強迫症,只要是代碼下面有「~」我就必須要消掉。笑哭。這個很簡單,前四個除了費波納茨,都很簡單。
這個公式看起來很麻煩,便寫的時候更要謹慎。我上回把那個2擱在了分號下面,結果很大,所以還是換算成0.5更好(PS:勿忘那長河般的0)。
雖然代碼很長,但是主要是因為print太多。本打算在開頭print,最後結果會漏掉最後一部分。懶得想其他辦法了,直接就這樣吧
一開始while裡面寫成了>,導致run不出來。繼而,debug也沒法用。在網上一查才知道 「沒聯網」+「沒選斷點」。最後想嘗試將else裡面的內容輸出來,結果發現run以後被刷屏了。於是改成i<7以後還是不行,於是想著加一個break跳出循環,結果成效了。
然後剛剛由debug了一下,才知道原來是i+1在if裡面,因為沒有辦法+1,所以i=6一直存在,就不斷循環。因為加break也好,i+1也好,都可以。
這是我第一組自己實現的python代碼,就是數學公式用python語言組裝起來。剛開始的時候知道大概需要在語言中體現什麼,但不太清楚。於是我就在網上找了幾個二分法的,他們都各有不同,但框架都差不多,不過如果要用到我們的那個公式里還需要改變很多。然後我就開始分析我們的題,我發現大體需要兩部分,一部分函數定義,一部分循環體。但我不知道如何定義函數,如何寫數學公式,如何弄變數,也就是說一些小點不太會,所以我選擇直接網路。因為我知道自己閱讀的能力不錯,相比於從視頻中提取要素,我更擅長通過閱讀獲得要點。有目的性地找知識點,掌握地更牢固。
於是我就開始了第一個——二分法的編寫。我發現,自己出現了很多錯誤而且有很多地方都很基礎。但我依然沒選擇視頻,而是將這些問題直接在網路上找,因為視頻講完或許你也沒找到點。當然,這是一步一步走的,不是直接就將程序擺上去,一點一點改。
隨著前兩個的成功,我發現自己對於這些代碼有了自信,似乎看透了他們的偽裝,抓住了本質。除此之外,我還意識到自己自從8月份以後,學習能力似乎提高了不少,而且有了更為有效的學習方法。各方面都有了一定的覺醒。除了第一個找了幾個牛頭不對馬嘴的代碼,其他都是根據自己的邏輯寫,邏輯通下來以後,對應語言中某一部分不知道如何翻譯就去網路,其實這幾個套路都一樣或者說數學公式轉化的套路都一樣。
我還意識到,匯編其實是最難的語言,目前為止所學到的,因為很多都需要自己去定義,去死摳,需要記住大量的指令且不能靈活變通。但是其他的卻只需要將一些對應的記下來就好。python真的挺簡單的。而且,我發現自己今天似乎打開了新世界的大門,我愛上了這種充滿了靈性的東西,充滿了嚴謹的美麗,還有那未知的變化,我發現我似乎愛上了代碼。可能不僅僅局限於python,這些語言都充滿了挑戰性。我覺得當你疑惑的時候,就需要相信直覺,至少我發現它很准
❸ 說明 Python 處理業財數據的應用場景,並寫出相應代碼。可以從采購業務、存貨
Python 是一種流行的編程語言,通常用於處理財務數據。一個常見的應用是在數據分析和數據科學領域,Python強大的數據處理和可視化庫可用於分析大型數據集並識別數據中的趨勢和模式。
可用於分析財務數據的 Python 腳本的一個示例是計算指定時間段內特定股票平均價格的腳本。金融分析師可以使用此腳本來跟蹤股票的表現並預測其未來的價格走勢。
下面是計算股票平均價格的 Python 代碼示例:
在此代碼中,我們首先導入 and 庫,這些庫通常用於處理 Python 中的財務數據。然後,我們使用庫中的函數將庫存數據從 CSV 文件載入到 ,這是一種用於處理表格數據的強大數據結構。pandasnumpyread_csv()pandasDataFrame
接下來,我們使用對象中的函數來計算股票的平均價格。最後,我們將結果列印到控制台。mean()DataFrame
這只是Python如何用於財務數據分析的一個簡單示例。在這個領域使用Python還有許多其他應用和可能性,包括分析投資組合的表現,預測股票價格等等。
回答不易望請採納
❹ Python怎麼做最優化
一、概觀scipy中的optimize子包中提供了常用的最優化演算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼演算法。下面optimize包中函數的概覽:1.非線性最優化fmin -- 簡單Nelder-Mead演算法fmin_powell -- 改進型Powell法fmin_bfgs -- 擬Newton法fmin_cg -- 非線性共軛梯度法fmin_ncg -- 線性搜索Newton共軛梯度法leastsq -- 最小二乘2.有約束的多元函數問題fmin_l_bfgs_b ---使用L-BFGS-B演算法fmin_tnc ---梯度信息fmin_cobyla ---線性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局優化anneal ---模擬退火演算法brute --強力法4.標量函數fminboundbrentgoldenbracket5.擬合curve_fit-- 使用非線性最小二乘法擬合6.標量函數求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名bisect ---二分法newton ---牛頓法fixed_point7.多維函數求根fsolve ---通用broyden1 ---Broyden』s first Jacobian approximation.broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數line_search ---找到滿足強Wolfe的alpha值check_grad ---通過和前向有限差分逼近比較檢查梯度函數的正確性二、實戰非線性最優化fmin完整的調用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數。一個描述優化問題的函數以及初值。後面的那些參數我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數的最小值是4,在x=2的時候取到。from scipy.optimize import fmin #引入優化包def myfunc(x):return x**2-4*x+8 #定義函數x0 = [1.3] #猜一個初值xopt = fmin(myfunc, x0) #求解print xopt #列印結果運行之後,給出的結果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序准確的計算得出了最小值,不過最小值點並不是嚴格的2,這應該是由二進制機器編碼誤差造成的。除了fmin_ncg必須提供梯度信息外,其他幾個函數的調用大同小異,完全類似。我們不妨做一個對比:from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):return x**2-4*x+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4給出的結果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。有源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!
❺ python 設計一個名為Stock的類來表示一個公司的股票
是的,設計一個名為 Stock的類表示股票,該類包括:
1、一個名為symbol的字元串數據域表示股票代碼:
2、一個名為name的字元串數據域表示股票名稱;
3、一個名為previousPrice的double型數據域,用來存儲股票的前一 日收盤價:
4、一個名為currentPrice的double型數據域,用來存儲股票的當前價格:
5、創建一個給定特定代碼和名稱的股票構造方法:
6、一個名為getChangePercentO方法,返回從前的日價格到當前價格變化的百分比。
實現這個類,編寫個測試程序,創建一個Stock 對象,它的股票代碼是600000,股票名稱是「浦發銀行」,前一日收盤價是 25.5元,當前的最新價是28.6元,顯示市值變化的百分比。
拓展資料
設計一個Stock類和DividendStock類
編寫了一個表示擁有股票情況的Stock類,這里給出了一個簡化版,去掉了對參數的合法性的檢查等細節,現在需要創建一個可以發放分紅的股票。紅利的多少和持有股票的數量成正比,不是所有的股票都是會有分紅的,所以不能直接在Stock類上直接增加這個功能,而是應該在Stock類的基礎上,繼承一個DividendStock類。並在這個子類中增加分紅的屬性和行為。
(1)一個用於記錄分紅的欄位dividents
(2)重寫父類的getProfit方法(在父類的getProfit方法的基礎上還要加上分紅的)
父類的getProfit+股票的總的分紅(也就是欄位dividents的值)
(3)增加計算分紅的方法,方法中的參數表示每股的紅利,可以理解為成員變數dividents賦值: 股票的總的分紅=每股的紅利*總股數
public void payDividend(double amountPerShare)
編寫一個測試的程序,創建一個名為」Oracle」的分紅股票,先後以單價32元購買200股,以單價40元購買350股。每股的分紅2.8元。這支股票的當前價格是每股50元。
❻ python數據分析與應用第三章代碼3-5的數據哪來的
savetxt
import numpy as np
i2 = np.eye(2)
np.savetxt("eye.txt", i2)
3.4 讀入CSV文件
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #index從0開始
3.6.1 算術平均值
np.mean(c) = np.average(c)
3.6.2 加權平均值
t = np.arange(len(c))
np.average(c, weights=t)
3.8 極值
np.min(c)
np.max(c)
np.ptp(c) 最大值與最小值的差值
3.10 統計分析
np.median(c) 中位數
np.msort(c) 升序排序
np.var(c) 方差
3.12 分析股票收益率
np.diff(c) 可以返回一個由相鄰數組元素的差
值構成的數組
returns = np.diff( arr ) / arr[ : -1] #diff返回的數組比收盤價數組少一個元素
np.std(c) 標准差
對數收益率
logreturns = np.diff( np.log(c) ) #應檢查輸入數組以確保其不含有零和負數
where 可以根據指定的條件返回所有滿足條件的數
組元素的索引值。
posretindices = np.where(returns > 0)
np.sqrt(1./252.) 平方根,浮點數
3.14 分析日期數據
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1:datestr2num}, unpack=True)
print "Dates =", dates
def datestr2num(s):
return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday()
# 星期一 0
# 星期二 1
# 星期三 2
# 星期四 3
# 星期五 4
# 星期六 5
# 星期日 6
#output
Dates = [ 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 4. 0. 1. 2. 3. 4. 0.
1. 2. 3. 4.]
averages = np.zeros(5)
for i in range(5):
indices = np.where(dates == i)
prices = np.take(close, indices) #按數組的元素運算,產生一個數組作為輸出。
>>>a = [4, 3, 5, 7, 6, 8]
>>>indices = [0, 1, 4]
>>>np.take(a, indices)
array([4, 3, 6])
np.argmax(c) #返回的是數組中最大元素的索引值
np.argmin(c)
3.16 匯總數據
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
#得到第一個星期一和最後一個星期五
first_monday = np.ravel(np.where(dates == 0))[0]
last_friday = np.ravel(np.where(dates == 4))[-1]
#創建一個數組,用於存儲三周內每一天的索引值
weeks_indices = np.arange(first_monday, last_friday + 1)
#按照每個子數組5個元素,用split函數切分數組
weeks_indices = np.split(weeks_indices, 5)
#output
[array([1, 2, 3, 4, 5]), array([ 6, 7, 8, 9, 10]), array([11,12, 13, 14, 15])]
weeksummary = np.apply_along_axis(summarize, 1, weeks_indices,open, high, low, close)
def summarize(a, o, h, l, c): #open, high, low, close
monday_open = o[a[0]]
week_high = np.max( np.take(h, a) )
week_low = np.min( np.take(l, a) )
friday_close = c[a[-1]]
return("APPL", monday_open, week_high, week_low, friday_close)
np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s") #指定了文件名、需要保存的數組名、分隔符(在這個例子中為英文標點逗號)以及存儲浮點數的格式。
.png
格式字元串以一個百分號開始。接下來是一個可選的標志字元:-表示結果左對齊,0表示左端補0,+表示輸出符號(正號+或負號-)。第三部分為可選的輸出寬度參數,表示輸出的最小位數。第四部分是精度格式符,以」.」開頭,後面跟一個表示精度的整數。最後是一個類型指定字元,在例子中指定為字元串類型。
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)
>>>def my_func(a):
... """Average first and last element of a 1-D array"""
... return (a[0] + a[-1]) * 0.5
>>>b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>>np.apply_along_axis(my_func, 0, b) #沿著X軸運動,取列切片
array([ 4., 5., 6.])
>>>np.apply_along_axis(my_func, 1, b) #沿著y軸運動,取行切片
array([ 2., 5., 8.])
>>>b = np.array([[8,1,7], [4,3,9], [5,2,6]])
>>>np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8],
[3, 4, 9],
[2, 5, 6]])
3.20 計算簡單移動平均線
(1) 使用ones函數創建一個長度為N的元素均初始化為1的數組,然後對整個數組除以N,即可得到權重。如下所示:
N = int(sys.argv[1])
weights = np.ones(N) / N
print "Weights", weights
在N = 5時,輸出結果如下:
Weights [ 0.2 0.2 0.2 0.2 0.2] #權重相等
(2) 使用這些權重值,調用convolve函數:
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
sma = np.convolve(weights, c)[N-1:-N+1] #卷積是分析數學中一種重要的運算,定義為一個函數與經過翻轉和平移的另一個函數的乘積的積分。
t = np.arange(N - 1, len(c)) #作圖
plot(t, c[N-1:], lw=1.0)
plot(t, sma, lw=2.0)
show()
3.22 計算指數移動平均線
指數移動平均線(exponential moving average)。指數移動平均線使用的權重是指數衰減的。對歷史上的數據點賦予的權重以指數速度減小,但永遠不會到達0。
x = np.arange(5)
print "Exp", np.exp(x)
#output
Exp [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]
Linspace 返回一個元素值在指定的范圍內均勻分布的數組。
print "Linspace", np.linspace(-1, 0, 5) #起始值、終止值、可選的元素個數
#output
Linspace [-1. -0.75 -0.5 -0.25 0. ]
(1)權重計算
N = int(sys.argv[1])
weights = np.exp(np.linspace(-1. , 0. , N))
(2)權重歸一化處理
weights /= weights.sum()
print "Weights", weights
#output
Weights [ 0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]
(3)計算及作圖
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
ema = np.convolve(weights, c)[N-1:-N+1]
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, ema, lw=2.0)
show()
3.26 用線性模型預測價格
(x, resials, rank, s) = np.linalg.lstsq(A, b) #系數向量x、一個殘差數組、A的秩以及A的奇異值
print x, resials, rank, s
#計算下一個預測值
print np.dot(b, x)
3.28 繪制趨勢線
>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2], [3, 4, 5]])
>>> np.ones_like(x) #用1填充數組
array([[1, 1, 1], [1, 1, 1]])
類似函數
zeros_like
empty_like
zeros
ones
empty
3.30 數組的修剪和壓縮
a = np.arange(5)
print "a =", a
print "Clipped", a.clip(1, 2) #將所有比給定最大值還大的元素全部設為給定的最大值,而所有比給定最小值還小的元素全部設為給定的最小值
#output
a = [0 1 2 3 4]
Clipped [1 1 2 2 2]
a = np.arange(4)
print a
print "Compressed", a.compress(a > 2) #返回一個根據給定條件篩選後的數組
#output
[0 1 2 3]
Compressed [3]
b = np.arange(1, 9)
print "b =", b
print "Factorial", b.prod() #輸出數組元素階乘結果
#output
b = [1 2 3 4 5 6 7 8]
Factorial 40320
print "Factorials", b.cumprod()
#output
❼ 這段python代碼如何優化
第一:不需要定義main函數,直接寫就好。
第二:代碼的邏輯也是有問題的。一般來說,按這樣的框架去寫:
_size, _verbs, A, s = [int(_) for _ in imput().split(' ')], [], ''
for _ in range(_size): A.append(...) # 讀入矩陣所有行
def G:
....實現特徵函數G
for _ in range(_verbs):
....verb = [int(_) for _ in imput().split(' ')]
.... if verb[0] = 1:
........行翻轉
....elif verb[0] = 2:
........列翻轉
....else:
........s += G()
print(s)
❽ python用什麼方法或者庫可以拿到全部股票代碼
首先你需要知道哪個網站上有所有股票代碼,然後分析這個網站股票代碼的存放方式,再利用python寫一個爬蟲去爬取所有的股票代碼
❾ 如何用python獲取股票數據
在Python的QSTK中,是通過s_datapath變數,定義相應股票數據所在的文件夾。一般可以通過QSDATA這個環境變數來設置對應的數據文件夾。具體的股票數據來源,例如滬深、港股等市場,你可以使用免費的WDZ程序輸出相應日線、5分鍾數據到s_datapath變數所指定的文件夾中。然後可使用Python的QSTK中,qstkutil.DataAccess進行數據訪問。
❿ Python怎麼做最優化
一、概觀
scipy中的optimize子包中提供了常用的最優化演算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼演算法。下面optimize包中函數的概覽:
1.非線性最優化
fmin -- 簡單Nelder-Mead演算法
fmin_powell -- 改進型Powell法
fmin_bfgs -- 擬Newton法
fmin_cg -- 非線性共軛梯度法
fmin_ncg -- 線性搜索Newton共軛梯度法
leastsq -- 最小二乘
2.有約束的多元函數問題
fmin_l_bfgs_b ---使用L-BFGS-B演算法
fmin_tnc ---梯度信息
fmin_cobyla ---線性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x>=0
3.全局優化
anneal ---模擬退火演算法
brute --強力法
4.標量函數
fminbound
brent
golden
bracket
5.擬合
curve_fit-- 使用非線性最小二乘法擬合
6.標量函數求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名
bisect ---二分法
newton ---牛頓法
fixed_point
7.多維函數求根
fsolve ---通用
broyden1 ---Broyden』s first Jacobian approximation.
broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數
line_search ---找到滿足強Wolfe的alpha值
check_grad ---通過和前向有限差分逼近比較檢查梯度函數的正確性二、實戰非線性最優化
fmin完整的調用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數。一個描述優化問題的函數以及初值。後面的那些參數我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數的最小值是4,在x=2的時候取到。
from scipy.optimize import fmin #引入優化包def myfunc(x):
return x**2-4*x+8 #定義函數
x0 = [1.3] #猜一個初值
xopt = fmin(myfunc, x0) #求解
print xopt #列印結果
運行之後,給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准確的計算得出了最小值,不過最小值點並不是嚴格的2,這應該是由二進制機器編碼誤差造成的。
除了fmin_ncg必須提供梯度信息外,其他幾個函數的調用大同小異,完全類似。我們不妨做一個對比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
print
xopt2 = fmin_powell(myfunc, x0)
print xopt2
print
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
print
xopt4 = fmin_cg(myfunc,x0)
print xopt4
給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。
在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。
有源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!