計算機視覺基礎系列(python與opencv的操作與運用/tensorflow的基礎介紹)(八)---小例子(神經網絡逼近股票收盤價格)

這裏我們運用簡單的神經網絡模擬一下股票的收盤價格,是一個學習的示例。

首先要知道,股票曲線圖的參數意義:

這個曲線圖主要記錄股票的開盤價格和收盤價格,如果開盤價格低於收盤價格,那麼證明這個股票在增長,每天的規律如此,所以,在下面,首先定義股票價格的座標圖如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
data = np.linspace(1, 15, 15)            # linspace的功能用來創建等差數列
endPrice = np.array([2511.6, 2538.6, 2510.3, 2591.6, 2732.9, 2701.69, 2702.69, 2703.69, 2704.69, 2721.69, 2711.69, 2711.69, 2721.69, 2731.69, 2741.69])         # 收盤價格
beginPrice = np.array([2438.7, 2500.9, 2534.9, 2512.6, 2594.6, 2743.26, 2753.26, 2752.26, 2754.26, 2751.26, 2732.26, 2725.26, 2745.26, 2756.26, 2737.26])       # 開盤價格
print(data)                             # 1-15天
plt.figure()
for i in range(0, 15):
    '''柱狀圖'''
    dateOne = np.zeros([2])             # 生成一個一行兩列全爲0的矩陣,分別賦值
    dateOne[0] = i
    dateOne[1] = i
    priceOne = np.zeros([2])
    priceOne[0] = beginPrice[i]
    priceOne[1] = endPrice[i]
    if endPrice[i] > beginPrice[i]:
        plt.plot(dateOne, priceOne, 'r', lw=8)              # 如果收盤價格高於開盤價格,則柱狀圖爲紅色
    else:
        plt.plot(dateOne, priceOne, 'g', lw=8)              # 如果開盤價格高於收盤價格,則柱狀圖爲綠色
plt.show()


畫出來的結果圖爲:

首先,這個原始的柱狀圖,畫出來了,股票圖形的繪製就是這樣了。接下來的就是神經網絡的認識了:

首先矩陣相乘的知識,我們要知道:

L1(a,b)*L2(c,d)=L3(a,d)

矩陣的維度變化是這樣的,行列的數是這個規律。接下來就是神經網絡的結構的說明了:

首先,我們需要知道的是:神經網絡是大體可以分爲三層結構的,第一層(輸入層)第二層(隱藏層,可以有多層)第三層(輸出層),在我們的這個問題上,這裏的輸入層爲日期,即爲15天,且可以看作是一個15x1的矩陣,這裏的隱藏層則可以規定爲一個10x1的矩陣,這個隱藏層的設計可以根據數據來合理設計,這裏的輸出層和輸入層一樣,我們需要得到對應天數預測得到的股票的收盤的值,所以也是15x1。在這裏,我們把輸入矩陣看作是A,中間層即隱藏層看作是B,輸出層(每天都股價)可以看作是C。

其次,我們需要知道的是中間層的值B,是由輸入層的值乘以一個權重值w1,然後加上偏執值b1得到的,即可以用上圖表示。同理,C的值也是如此。這個就是簡單的神經網絡結構,接下來,其中神經網絡的細節如下:

這裏一層到二層,二層到三層即爲B的值怎麼得到的,的值怎麼得到的,上面也有比較詳細的敘述,然後接下來,我們需要知道的是其中神經網網絡整個數據的維度的變化了,以上圖可以看出,經過一系列的運算,最後輸入和輸出的維度是相同的。

最後,我們需要知道的是,其中神經網絡的調參的過程了,如果說第一次循環的神經網絡得到的預測值是2400,然後實際值是2511,這裏預測值和實際值是相差111點的,所以,我們的目的是將這個預測值和實際值縮小,而這裏的預測值是C,能夠讓C變化,更貼近真實值,我們這裏的輸入A變不了,而B又是由A得到的,所以能變的就是這些W1和B1,W2和B2這些值了,我們利用梯度下降法來減少真實值和預測值的差異,(此處先不講梯度下降,之後的博客會進行相應的更新說明),經過一次次的循環訓練,我們會將這四個參數值進行調節,調節至預測值和真實值是我們想要的那個結果爲止,或者說可以控制循環,我們要求循環多少次爲止。

接下來就是實現整個神經網絡的部分了,下面的代碼中也有詳細的介紹,相關注釋對代碼有一個大體的把握:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
data = np.linspace(1, 15, 15)            # linspace的功能用來創建等差數列
endPrice = np.array([2511.6, 2538.6, 2510.3, 2591.6, 2732.9, 2701.69, 2702.69, 2703.69, 2704.69, 2721.69, 2711.69, 2711.69, 2721.69, 2731.69, 2741.69])         # 收盤價格
beginPrice = np.array([2438.7, 2500.9, 2534.9, 2512.6, 2594.6, 2743.26, 2753.26, 2752.26, 2754.26, 2751.26, 2732.26, 2725.26, 2745.26, 2756.26, 2737.26])       # 開盤價格
print(data)                             # 1-15天
plt.figure()
for i in range(0, 15):
    '''柱狀圖'''
    dateOne = np.zeros([2])             # 生成一個一行兩列全爲0的矩陣,分別賦值
    dateOne[0] = i
    dateOne[1] = i
    priceOne = np.zeros([2])
    priceOne[0] = beginPrice[i]
    priceOne[1] = endPrice[i]
    if endPrice[i] > beginPrice[i]:
        plt.plot(dateOne, priceOne, 'r', lw=8)              # 如果收盤價格高於開盤價格,則柱狀圖爲紅色
    else:
        plt.plot(dateOne, priceOne, 'g', lw=8)              # 如果開盤價格高於收盤價格,則柱狀圖爲綠色
# plt.show()
'''數據的歸一化處理'''
'''A(15x1)*W1(1x10)+b1(1x10)=B(15x10)'''
'''B(15x10)*W2(10x1)+b2(15x1)=C(15x1)'''
dateNormal = np.zeros([15, 1])
priceNormal = np.zeros([15, 1])
for i in range(0, 15):
    dateNormal[i, 0] = i/14.0
    priceNormal[i, 0] = endPrice[i]/3000.0
x = tf.placeholder(tf.float32, [None, 1])
y = tf.placeholder(tf.float32, [None, 1])
# B的定義,隱藏層
w1 = tf.Variable(tf.random_uniform([1, 10], 0, 1))       # 在0-1之間取10個數
b1 = tf.Variable(tf.zeros([1, 10]))                      # 建一個一行十列的矩陣
wb1 = tf.matmul(x, w1)+b1                                # 得到B
layer1 = tf.nn.relu(wb1)                                 # 激活函數,完成wb1的映射,以後再進行描述
# C的定義,輸出層
w2 = tf.Variable(tf.random_uniform([10, 1], 0, 1))
b2 = tf.Variable(tf.zeros([15, 1]))
wb2 = tf.matmul(layer1, w2)+b2
layer2 = tf.nn.relu(wb2)
# 我們計算預測值,通過差異調參
loss = tf.reduce_mean(tf.square(y-layer2))             # 標準差的損失函數,之後再進行描述
# 定義我們每次調參的步長,我們選擇梯度下降法,作用是縮小loss,減小預測值和真實值的差異,通過不斷調整w和b
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())                   # 完成數據的初始化
    # 定義中止的條件,有兩個,定義真實值和預測值之間的差異,比如說差別2%中止,或者說定義循環的次數,在這裏定義循環100次中止
    for i in range(0, 1000):
        sess.run(train_step, feed_dict={x: dateNormal, y: priceNormal})
    # 經過10000次訓練之後,輸出了一組優化後的w1,w2,b1,b2。那麼我們怎麼檢測這些參數呢/我們可以喂入之前的輸出的值預測繪製相應的曲線去驗證
    prediction = sess.run(layer2, feed_dict={x: dateNormal})
    predictionPrice = np.zeros([15, 1])
    for i in range(0, 15):
        predictionPrice[i, 0] = (prediction*3000)[i, 0]            # 這裏乘以300是爲了恢復預測值,之前處以了3000
    plt.plot(data, predictionPrice, 'b', lw=1)
plt.show()


下面是運行的結果圖:

可以看出來,模擬的藍色的曲線的預測值還是和真實值相對吻合的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章