期貨量化軟件:赫茲量化中多層感知機(jī)與反向傳播算法
第一個(gè)神經(jīng)網(wǎng)絡(luò)是由沃倫·麥卡洛赫(Warren McCulloch)和沃爾特·皮特(Walter Pitts)于1943年提出的。他們寫了一篇關(guān)于神經(jīng)元應(yīng)該如何工作的文章,他們還根據(jù)自己的想法建立了一個(gè)模型:他們用電路創(chuàng)建了一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)。
人工智能研究進(jìn)展迅速,1980年,福島邦彥(Kunihiko Fukushima)開發(fā)了第一個(gè)真正的多層神經(jīng)網(wǎng)絡(luò)。
神經(jīng)網(wǎng)絡(luò)的最初目的是創(chuàng)造一個(gè)計(jì)算機(jī)系統(tǒng),能夠以類似人腦的方式解決問題。然而,隨著時(shí)間的推移,研究人員改變了研究重點(diǎn),開始使用神經(jīng)網(wǎng)絡(luò)來解決各種特定任務(wù)?,F(xiàn)在,神經(jīng)網(wǎng)絡(luò)執(zhí)行各種各樣的任務(wù),包括計(jì)算機(jī)視覺、語音識別、機(jī)器翻譯、社交媒體過濾、棋盤游戲或視頻游戲、醫(yī)療診斷、天氣預(yù)報(bào)、時(shí)間序列預(yù)測、圖像/文本/語音識別等。
應(yīng)用神經(jīng)元模型
現(xiàn)在,讓我們進(jìn)入實(shí)際應(yīng)用。
本節(jié)分為兩部分:
1. 做預(yù)測
2. 優(yōu)化網(wǎng)絡(luò)權(quán)重
這些步驟為感知器算法在其它分類問題中的實(shí)現(xiàn)和應(yīng)用提供了基礎(chǔ)。
我們需要定義集合X中的列數(shù)。為此,我們需要定義一個(gè)常量。
#define nINPUT 3
在MQL5中,多維數(shù)組可以是靜態(tài)的,也可以僅適用于第一個(gè)維度的動(dòng)態(tài)數(shù)組。因此,由于所有其他維度都是靜態(tài)的,因此必須在數(shù)組聲明期間指定大小。
1. 進(jìn)行預(yù)測
第一步是開發(fā)一個(gè)可以進(jìn)行預(yù)測的函數(shù)。
無論是在隨機(jī)梯度下降過程中評估候選權(quán)重時(shí),還是在模型完成后,這都是必要的。應(yīng)根據(jù)試驗(yàn)數(shù)據(jù)和新數(shù)據(jù)進(jìn)行預(yù)測。
下面是 predict 函數(shù),它根據(jù)一組特定的權(quán)重來預(yù)測輸出值。
第一個(gè)權(quán)重總是一個(gè)偏差,因?yàn)樗亲灾鞴芾淼?,所以它不適用于特定的輸入值。
// Make a prediction with weights template <typename Array> double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0) ?{ ? double z = weights[0]; ? for(int i=0; i<ArrayRange(X, 1)-1; i++) ? ? { ? ? ?z+=weights[i+1]*X[row][i]; ? ? } ? return activation(z); ?}
神經(jīng)元傳輸:
一旦一個(gè)神經(jīng)元被激活,我們就需要傳輸激活來查看神經(jīng)元的實(shí)際輸出。
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ?Transfer neuron activation ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ double activation(const double activation) //# ?{ ? return activation>=0.0?1.0:0.0; ?}
我們將輸入集X、權(quán)重?cái)?shù)組(W)和預(yù)測輸入集X的行輸入到預(yù)測函數(shù)中。
讓我們用一個(gè)小數(shù)據(jù)集來檢查預(yù)測函數(shù)。
我們也可以使用預(yù)先準(zhǔn)備好的權(quán)重來預(yù)測這個(gè)數(shù)據(jù)集。
double weights[] = {-0.1, 0.20653640140000007, -0.23418117710000003};