Нейронная сеть Tensorflow предсказывает среднюю цену акций

искусственный интеллект TensorFlow Нейронные сети NumPy

1. Введение

1. Цель:

Зная «цену открытия» и «цену закрытия» акции, используйте нейронную сеть для прогнозирования «средней цены закрытия».

2. Источник данных:

Дата (данные): [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.]
Цена открытия (beginPrice): [2438,71, 2500,88, 2534,95, 2512,52, 2594,04, 2743,26, 2697,47, 2695,24, 2678,23, 2722,13, 2674,73, 2744,13, 2718,28,46]
Цена закрытия (endPrice): [2511,90, 2538,26, 2510,68, 2591,66, 2732,98, 2701,69, 2701,29, 2678,67, 2726,50, 2681,50, 2739,17, 2715,07, 2823,49, 1

3. Метод прогнозирования

(1) Введение в базовые знания

Введение в нейронные сети: https://blog.csdn.net/leiting_imecas/article/details/60463897.
Введение в функцию возбуждения relu(): https://www.cnblogs.com/neopenx/p/4453161.html

(2) Анализ случая

  • Необработанные данные: данные, endPrice
  • Входной слой: data/1.4 —> x:dateNormal, endPrice / 3000 —> y:priceNormal
  • Скрытый слой: wb1(15x10) = x(15x1) * w1(1x10) + b1(1x10)
    layer1 = tf.nn.relu(wb1)
  • Выходной слой: wb2(15x1) = layer1(15x10) * w2(10x1) + b2(15x1)
    layer2 = tf.nn.relu(wb2)
  • Градиентный спуск: Стандартное отклонение реального значения y и вычисленного значения layer2 используется для градиентного спуска с уменьшением на 0,1 каждый раз;
  • Результат прогноза: pred = sess.run(layer2,feed_dict={x:dateNormal})
    predPrice = pred*3000

2. Входные данные

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

date = np.linspace(1,15,15)
# 开始是1,结束是15,有15个数的等差数列
print(date)

beginPrice = np.array([2438.71,2500.88,2534.95,2512.52,2594.04,2743.26,2697.47,2695.24,2678.23,2722.13,2674.93,2744.13,2717.46,2832.73,2877.40])
# 开盘价
endPrice = np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.17,2715.07,2823.58,2864.90,2919.08]
)
# 收盘价

результат:

[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15.]

Функциональный анализ:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

  • Разобрать:
    Эта функция возвращает набор данных/выборочных значений с одинаковым интервалом, интервал данных получается вычислением (обычно используется для создания арифметической последовательности)
  • параметр:
    start: начальное значение последовательности
    stop: конечное значение последовательности, если для конечной точки не задано значение False. Когда конечная точка имеет значение True, интервал данных: (stop-start)/num. Когда конечная точка имеет значение False, интервал данных: (стоп-старт)/(число+1).
    num: количество выборок, значение по умолчанию 50
    конечная точка: если true, стоп является последним значением выборки, а значение по умолчанию — true.
    retstep: если true, возврат (выборки, шаг), шаг — это интервал между различными значениями выборки.
    dtype: тип выходной последовательности.
    возвращение:
    образцы: n-мерный массив
    шаг: интервал выборочных значений

3. Рисование диаграмм

plt.figure()
for i in range(0,15):
    dateOne = np.zeros([2])
    # 建一个两列值为0的矩阵
    dateOne[0] = i;
    # 第一列的 0-14
    dateOne[1] = i;
    # 第二列的 0-14
    priceOne = np.zeros([2])
    # 建一个两列值为0的矩阵
    priceOne[0] = beginPrice[i]
    # 把开盘价输入第一列
    priceOne[1] = endPrice[i]
    # 把收盘价输入第二列
    if endPrice[i] > beginPrice[i]:
        # 如果收盘价 大于 开盘价
        plt.plot(dateOne,priceOne,'r',lw=8)
        # 条形是红色,宽度为8
    else:
        plt.plot(dateOne,priceOne,'g',lw=8)
        # 条形是绿色,宽度为8

результат:

Функциональный анализ:

1. диапазон (старт, стоп, шаг)

  • Дан только один параметр s, что означает от 0 до s
    Например: диапазон(5)
    Результат: [0,1,2,3,4]
  • Два параметра, s, e, представляют от s до e
    Например: диапазон(5,10)
    Результат: 5,6,7,8,9
  • Три параметра s, e, i представляют от s до e, интервал i берется
    Например: диапазон (0,10,2)
    Результат: [0,2,4,6,8]

В-четвертых, входной слой входной слой

dateNormal = np.zeros([15,1])
# 创建一个15行,1列的矩阵
priceNormal = np.zeros([15,1])
for i in range(0,15):
    dateNormal[i,0] = i/14.0;
    # 日期的值,最大值为14
    priceNormal[i,0] = endPrice[i]/3000.0;
    # 价格的值,最大值为3000
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])

Функциональный анализ:

tf.placeholder(dtype, shape=None, name=None)

  • Анализ: эту функцию можно понимать как формальный параметр, который используется для определения процесса и присвоения конкретных значений во время выполнения.
  • параметр:
    dtype: тип данных. Часто используемые числовые типы, такие как tf.float32, tf.float64.
    форма: форма данных. Значение по умолчанию — «Нет», что является одномерным значением, или оно может быть многомерным.Например, [2,3], [Нет, 3] означает, что столбец равен 3, а строка не определена.
    имя: имя.
  • возвращение:
    Тип тензора

Пять, скрытый слой (скрытый слой)

w1 = tf.Variable(tf.random_uniform([1,10],0,1))
# 创建一个1行10列的矩阵,最小值为0,最大值为1
b1 = tf.Variable(tf.zeros([1,10]))
# 创建一个1行10列的矩阵,值都为0
wb1 = tf.matmul(x,w1)+b1
# wb1 = x * w1 + b1
layer1 = tf.nn.relu(wb1) 
# 激励函数的类型:https://tensorflow.google.cn/api_guides/python/nn#Activation_Functions
# 激励函数的作用:https://zhuanlan.zhihu.com/p/25279356

В-шестых, выходной слой (выходной слой)

w2 = tf.Variable(tf.random_uniform([10,1],0,1))
b2 = tf.Variable(tf.zeros([15,1]))
wb2 = tf.matmul(layer1,w2)+b2
# wb2 = wb1 * w2 + b2
layer2 = tf.nn.relu(wb2)

loss = tf.reduce_mean(tf.square(y-layer2))
# 计算真实值y和计算值layer2的标准差
# 方差 s^2=[(x1-x)^2+(x2-x)^2+......(xn-x)^2]/(n) (x为平均数)
# 标准差=方差的算术平方根
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 每次梯度下降0.1,目的是缩小真实值y和计算值layer2的差值
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(0,10000):
        sess.run(train_step,feed_dict={x:dateNormal,y:priceNormal})
        # feed_dict是一个字典,在字典中需要给出每一个用到的占位符的取值,每次迭代选取的数据只会拥有占位符这一个结点。
        # 训练出w1、w2、b1、b2,但是还需要检测是否有效
    pred = sess.run(layer2,feed_dict={x:dateNormal})
    # 训练完的预测结果值
    predPrice = np.zeros([15,1])
    for i in range(0,15):
        predPrice[i,0]=(pred*3000)[i,0]
        # pred需要乘以3000是因为前面 priceNormal[i,0] = endPrice[i]/3000.0;
    plt.plot(date,predPrice,'b',lw=1)
plt.show()

результат:

Функциональный анализ:

tf.reduce_mean(input_tensor,axis=None,keepdims=None,name=None,reduction_indices=None,keep_dims=None)

  • Разбор: вычисляет среднее значение элементов по размерности тензора.
  • параметр:
    input_tensor: сокращение тензора. Должен иметь числовой тип.
    ось: размер для уменьшения. Если нет (по умолчанию), уменьшаются все размеры. Должен быть в диапазоне [ rank(input_tensor), rank(input_tensor) ).
    keepdims: если true, сохранить уменьшенные размеры длины 1.
    name: Имя действия (необязательно).
    reduce_indices: Старые (устаревшие) имена для осей.
    keep_dims: устаревший псевдоним keepdims.