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

#生成一个数组,从1~9,样本数为9----------------------------------
#numpy.linspace(start, stop, num=50, endpoint=True, retstep=False,dtype=None)
#--------------------------------------------------------------------------------

date=np.linspace(1,9,9) # print(date)得到[1,2,3,4,5,6,7,8,9]
beginPrice=np.array([2443,2458,2480,2500,2510,2496,2493,2511,2503])
endPrice=np.array([2461,2473,2501,2522,2500,2499,2511,2500,2522])    

#生成绘制区域---------------------------------------------------------------
#figure(num=None, figsize=None, dpi=None, facecolor=None,edgecolor=None, frameon=True)
#num:图像编号或名称,数字为编号 ,字符串为名称
#figsize:指定figure的宽和高,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80      1英寸等于2.5cm,A4纸是21*30cm的纸张 
#facecolor:背景颜色
#edgecolor:边框颜色
#--------------------------------------------------------------------------------------

plt.figure()

for i in range(0,8):
    dateN=np.zeros([2])#定义一个数组[0,0],等同于1行2列全为0的矩阵/np.ones([2])全为1
    dateN[0]=i
    dateN[1]=i
    price=np.zeros([2])
    price[0]=beginPrice[i]
    price[1]=endPrice[i]
    if beginPrice[i]<endPrice[i]:
        plt.plot(dateN,price,'red',lw=7)
    else:
        plt.plot(dateN,price,'green',lw=7)

#plt.plot(x,y,format_string,**kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串format_string 由颜色字符,风格字符,和标记字符e.g.plt.plot([1,2,3,6],[4,5,8,1],’g-s’)

dateNor=np.zeros([9,1])
priceNor=np.zeros([9,1])

#将数据归一化
for i in range(0,9):
    dateNor[i,0]=date[i]/9.0
    priceNor[i,0]=endPrice[i]/3000.0    

x=tf.placeholder(tf.float32,[None,1])#placeholder,占位。float32型,N行1列的矩阵
y=tf.placeholder(tf.float32,[None,1])

#简单tensorflow三层结构---------------------------------------------------
#|			| 			|			|
#|	[输入矩阵X]	|	[中间矩阵B]	|	[输出矩阵Y]	|
#|		┗|[矩阵w1]+[偏移矩阵b1]┛┗[矩阵w2]+[偏移矩阵b2]┛		|
#|	layer1		|calcLayer		|layer2			|
#数学实现:X*w1+b1=B,B*w2+b2=Y,最终目标是得到一组w1,b1,w2,b2,可以使得X---(w1,b1,w2,b2)---->Y
#程序实现:
#layer1
w1=tf.Variable(tf.random_uniform([1,10],0,1))#初始化w1,一个1行10列的矩阵,填充为0-1的随机数
b1=tf.Variable(tf.zeros([1,10]))#初始化b1,一个全为0的1行10列矩阵
wb1=tf.matmul(x,w1)+b1#矩阵B=矩阵X*w1+b1
layer1=tf.nn.relu(wb1)#正向纠偏,函数功能是将矩阵内小于0的数全置0,大于0的不变
#layer2
w2=tf.Variable(tf.random_uniform([10,1],0,1))
b2=tf.Variable(tf.zeros([9,1]))#矩阵X(9行1列)--(乘以w1<1行10列>-->9行10列-->+b1)-->矩阵B(9行10列)--(乘以w2<10行1列>-->9行1列-->+b2)-->9行1列
wb2=tf.matmul(layer1,w2)+b2
layer2=tf.nn.relu(wb2)
loss=tf.reduce_mean(tf.square(y-layer2))#将差值矩阵[Y-layer2]降维至loss

#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。---
#第一个参数input_tensor: 输入的待降维的tensor;
#第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
#第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
#第四个参数name: 操作的名称;
#---------------------------------------------------------------------

trainStep=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#设置训练器trainStep,使用tf.train.GradientDescentOptimizer,以0.1的步长,使loss尽可能小

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())#前面定义variable(变量)后要初始化后才可使用
    for i in range(1,10000):#通过for循环执行训练器trainStep,10000次
        sess.run(trainStep,feed_dict={x:dateNor,y:priceNor})#feed_dic={x:dateNor,y:priceNor},可以理解为投喂器,将字典型赋值给trainStep。执行10000次后得到1个转换器M【(__*w1+b1)*w2+b2】,输入矩阵X后可得到结果矩阵Y,即X---(M)--->Y,y=tf.nn.relu(tf.matmul(tf.nn.relu(tf.matmul(x,w1)+b1),w2)+b2)
    pred=sess.run(layer2,feed_dict={x:dateNor})#y=pred=layer2=f1(f2(f3(f4(x))))
    predPrice=np.zeros([9,1])
    for i in range(0,9):
        predPrice[i,0]=pred[i,0]*3000
    #将归一化计算后的结果转换回原值## 标题
    plt.plot(date,predPrice,'b',lw=1)
    plt.show()