創建NTL+語言的神經網路


引言

人工神經網路 - 是由數學模型, 及其機器硬體和軟體的實現, 是基於生物神經網路的組合和功能 - 大腦的神經細胞網路.

當前神經網路應用廣泛, 例如識別,分類,聯合存儲,規律性的確定,預測等等.

神經網路需要單獨的數學或基於數學包的附加模型, 以便於提供不同類型和配置方案的網路結構

我們試圖基於NTL+語言重新創建自己的網路,並同時嘗試物件導向的程式設計.

問題選擇

在本文中我們來測試, 基於過去的燭圖可以預測未來柱圖的確定走勢: 下降或上漲。

這涉及分類問題。我們公司的金融工具允許使用歷史資料,以此獲得專業的評估。並創建基於多層感知的網路。

因此,根據k柱的收盤價創建網路而預測隨後燭圖的狀態. 如果其收盤價高於前一柱, 那麼取輸出值1(價格上漲)。在其他情況下,輸出值取0(價格沒有變化或下跌)。

網路建設

一般而言,多層感知具有一個輸入層,一個或多個隱藏層和一個輸出層。單個隱藏層足夠進行輸入轉為輸出. 使用更多數量的隱藏層只能導致網路學習速度明顯放緩, 而沒有顯著的學習品質.

在網路中保留1個輸入層, 一個隱藏層和一個輸出層. 在下面的圖中顯示網路的體系結構. x1 - xn - 輸入 (收盤價), wi,j - 自節點i至j的邊緣權重; y1 - ym 隱層神經元, o1 - ok 網路輸出.


網路也使用輸入偏移(偏移輸入). 使用這些輸入可以確保我們的網路沿x軸移動啟動的函數, 從而不僅改變啟動函數的斜率, 還可以保證線性偏移.

1. 啟動函數表 當 = 1
2. 啟動函數表 при =2 和 = 1
3. 啟動函數表, 偏移為 當=2, = 1 和 = 1

每個網路節點的值將按照下面的公式計算:
, где f(x) - 啟動函數, n - 前一層的節點數.

啟動函數

啟動函數來計算經過加法器之後獲得輸出信號。 人工神經元通常作為一個非線性函數的參數。最常用的啟動函數:

費米函數(S型指數):


合理的S型:


雙曲正切


確定每個節點的輸出需要選擇合理的S型, 因其計算需要較少時間.

網路學習的過程

為了學習, 我們的神經網路實現了誤差的反向傳輸. 該方法是利用了多層感知達到誤差最小化的重複演算法. 演算法的主要思想是: 在神經網路輸出計算後, 計算每個節點和邊的誤差W的偏差, 並且錯誤的計算方法是由輸出端至輸入端. 之後按照誤差值校正權重W . 該演算法對啟動函數的唯一的要求是: 被微分. S型和雙曲正切滿足這一要求.

因此, 在學習的過程中, 我們需要做到以下幾點:

  1. 初始化所有邊的權重隨機值.
  2. 對於所有的輸出, 神經網路計算統計修正
    , 其中 oj - 神經網路計算的輸出, tj - 實際值
  3. 除了最後一個節點, 其他都由下面的公式計算
    , wj,k 節點輸出的邊的權重用於計算修正 節點計算的誤差位於兩個系那個林的輸出層.
  4. 對於每個神經網路的邊計算修正:
    , 其中oi 自邊的輸出的節點計算輸出 被計算的節點輸出, 用於計算修正, 而被計算的節點修正, 其中包括確定的邊.
  5. 校正所有邊的權重值:
  6. 重複步驟2 - 5 , 針對所有學習的例子或暫時未達到品質準則的.

準備輸入資料

對於實現神經網路的學習需要準備輸入資料, 有品質的輸入值可以很好的影響網路的工作及其參數w的穩定速度, 也就是學習的過程.

所有的輸入向量被正常化, 以便起分量處於區間[0;1] 或 [-1;1]. 正常化使得所有輸入向量在網路學習的過程中是平等的, 從而保障學習的修正.

我們來正常化輸入向量 - 使其分量處於[0;1], 對此需要使用下列公式:

作為向量的分量, 將進入柱體的收盤價, 並且作為輸入移動至[n+k;n+1]柱體的收盤價, 其中k是輸入向量的大小. 希望值的確定基於n柱體. 其值大小的確定將遵循: 如果n柱的收盤價大於n+1柱的收盤價, 則取希望值為1, 如果低於或等於, 那麼取0;

在圖表中標出了黃色的柱體, 其參與組成每組資料(#1, #2), 橙色的是用於確定希望值.

在網路學習的過程中, 也會影響資料的次序也會影響學習的過程. 如果輸入向量均勻提供1和0,那麼學習的過程更穩定.

同樣形成了單獨的資料組, 用於評估網路工作的有效性. 這些資料網路不會用於學習, 僅用於按照最小二次方的方法計算錯誤. 在測試組資料添加10%的輸入例子. 其結果是90%例子將用學習, 10%用於評估.

最小二次方計算錯誤的功能有下列方式:
,
где - 網路輸出信號和 - 輸出信號的需要值.

查看準備為神經網路輸入向量的腳本代碼

分析DataSet類 - 資料組. 該類包括:

  • 輸入值向量陣列 - input
  • 生出輸出值- output
  • Normalize 方法- 標準化(正常化)資料
  • OutputDefine方法- 確定價格的實際值
  • AddData方法- 在輸入向量的記錄值和變數的實際值
  • To_file 方法 - 單矩陣的資料組, 針對下一條目

輸入不同數量的學習的例子, 可以看到我們的網路學習的過程.


圖中紅線對應1的學習例子. 藍線 - 對應0. 根據各自橫軸截取學習的例子, 根據縱軸計算學習例子的網路值. 可以看出, 如果例子的數量少(25及其以下)網路不能差別不同的輸入向量, 如果數量多- 很明確的分為兩類.

評估網路

為了評估學習的效果, 我們使用最小二次方的方法計算錯誤. 對此要創建具有以下代碼的實用程式並運行它. 在此添加2個文件: "test.txt" - 計算錯誤時用到的資料和希望值, "NT.txt" - 已計算參數的文件.

該腳本完成下列步驟:

  • 創建net類的對象NT
  • 校對參數w 並載入至NT
  • 創建陣列的網路輸出和輸入
  • 校對輸入值並置於陣列'x'中, 校對輸入並置於'reals'
  • 計算網路的輸出, 提供給數位'x'
  • 計算錯誤error, 所有計算值和實際值差異的平方和
  • 當臨近檔結尾, 輸出錯誤值並退出腳本

顯示的長條圖反映下一個柱圖的預期. 值從0.5-1說明下一個柱圖很有可能是下降的. 值從0至0.5則說明下一個柱圖很有可能是上漲的. 0.5對應的是不確定. 即下一個柱圖可能上漲, 也可能下降.

概要

神經網路是技術分析的強大工具. 在本文中展示了通過NTL+利用物件導向的語言來創建神經網路的過程. 使用物件導向的方法使得簡化代碼, 並更容易用在未來的腳本中. 在實踐中, 我們創建了類 layer 描述神經網路的層和類net描述整體的網路. 類net我們用於確定錯誤數量和計算權重的指標. 此外還舉例展示了如何利用學習網路.