2019-08-11 – Python量化投资

2019-08-11

Tensorflow

处理结构

建立结构–>数据放入里面运行

预测参数

import tensorfow as tf
import numpy as np
#creat data
x_data=np.random.rand(100).astype(np.float32)  
y_data=x_data*0.1+0.3 #使X接近0.1,y接近0.3
搭建结构
#creat tensorflow structure start #
Weights=tf.Variable(tf.random_uniform([1],-1.0,1.0))  #生成一个矩阵,且采用随机变量的形式生成,[1]指的是维度为1,范围是-1.0~1.0。。。。**权重**
biasae=tf.Varible(tf.zero([1]))   #定义一个初始值全是0的**偏置**
y=Weighrs*x+biases #提升y准确度
loss=tf.reduce_mean(tf.square(y-y_data)) #预测值和真实值之间的误差
optimizer=tf.train.GradientDescentOptimizer(0.5) #数字为学习效率
train=optimier.minimize(loss)   #使用优化器训练,进而减小误差
init=tf.intialize_all_variables()  #神经网络相当于一张图,是一个大结构,我们需要先将结构搭建起来,然后再进行。所以在结构运行之前需要先初始化一下。
把结构激活初始化
sess=tf.Session() 
sess.run(init)  #这就相当于一个指针,指向的地方被激活。所以将其指向init初始化的地方激活它,然后初始化以后就可以进行运行了。very important
开始训练神经网络

for steo in range(201): #训练201步
sess.run(train) #指向结构里的train进行训练
if step%20==0: #每隔20步打印一下
print(step,sess.run(Weights),sess.run(biase)) #指向Weights,biase,将此时的这两个打印出来。

Session 会话控制

可以指向神经网络这张图的某一个小结构,然后进行执行这个小结构,可以在此时结合print,将此时这个结构里面的数据进行打印出来

import tensorflow as tf
matrix1=tf.constant([[3,3]]) #建立一个矩阵_一行二列
matrix1=tf.constant([[2],
                                [2]])
product=tf.matmul(matrix1,matrix1)   #矩阵乘法
一种模型——使用Session
sess=tf.Session()
result=sess.run(product)   #每run一样,tensorflow就会执行一下这个结果
print(result)
sess.close()  #有没有其实差不多,有的话会更加整洁和系统一点
另一种模型——mothod 2
with tf.Session as sess:  #以sess命名Session,运行到最后不用管是否采用sess.close()这个语句
        result2=sess.run(product)
        print(result2)     #这两个语句就在with下面了,所以结束这两个语句以后,就无需在意是否将这两个语句进行close了,可以另起一行进行其他语句
balabala~其他语句

Variable 变量

import tensorflow as tf
state=tf.Variable(0,name='counter') #一定要定义一个变量,它才是一个变量.可以给个初始值和命名
#print(state.name)
one=tf.constant(1) #定义一个常量
new_value=tf.add(state+one)
update=tf.assign(state,new_value) #将new_value里面的值赋值到state中,返回以后再进行new_value里面的语法
init=tf.initialize_all_variables()   #如果有定义变量名,一定要有这个语句,这个语句用来将所有变量进行激活。但现在还米有激活,需要下面采用一个session.run()语句
with tf.Session() as sess:
       sess.run(init)  #定义init后一定要run一下,否则没有意义
    for _in range(3):    #3次循环,每一次都run一下下面那个
          sess.run(update)
          print(sess.run(state))  

Tensorflow —-placeholder 传入值

placeholder是指在每一次运行sess.run的时候,进行一个新的输入。而这个新的输入与feed_dict进行了绑定,通过feed_dict进行输入值的数值确定

import tensorflow as tf
input1=tf.placeholder(tf.float32)  #一般情况而言,我们的输入都是float32的。如果你想要定义这个placeholder的结构,可以在float32后面,[2,1]这样用来定义结构
input2=tf.placeholder(tf.float32)
output=tf.mul(input1,input2)  #两个输入矩阵相乘
with tf.Session() as sess:
       print(sess.run(output,feed_dict={input1:[7.],input2:[2.]}))   #每一次run都输出一个output的值。因为是placeholder需要每一次都传入一个新的值,也是在此时进行一个新input1和新input2的输入。

激励函数 activation function

筛选,保留需要的,或者将值进行改变使更符合要求

def 添加层

我们定义了一个带有激励函数的添加层,可以放在神经网络某个架构里面进行调用这个激活函数

说明如何加入一个神经层,输入函数是什么东西,输出和输入多少个单位,激励函数是什么
import tensorflow as tf
def add_layer(inputs,in_size,out_size,activation=None) #我们要添加一个层,需要一个输入。看我们是否需要激励函数,默认的话,我们可以暂时默认为没有就是一个线性函数。
     Weights=tf.Variable(tf.random_normal([in_size,out_size]))  #定义一个权重,大写开头因为它是矩阵。我们定义了一个权重,行有in_size个,列有out_size个,其中输出为随机变量值,这样要比全是0的话好很多,每一步都会有变化
      biases=tf.Variable(tf.zeros([1,out_size])+0.1)  #因为biases相当于一个列表类的,所以非矩阵因此首字母无需大写。由于全是0的话不太好,所以我们让其全是0.1
      Wx_plus_b=tf.matmul(inouts,Weights)+biases  #前面那个式子相当于一个矩阵的乘法,还未被激活,就先存放在这里,是一个线性方程
      if activation_function is None:  
          outputs=Wx_plus_b   #如果没有激活函数,就让输出继续保持线性关系输出就好。不用激活函数的非线性关系
      else:
           outputs=activation_functon(Wx_plus_b)
      return outputs

建造神经网络

怎样建立神经网络结构,怎样得到预测值并与真实值进行比较,然后不断训练使预测值更接近真实值

定义一个新的层
import tensorflow as tf
importnumpy as np
def add_layer(inputs,in_size,out_size,activation=None) #我们要添加一个层,需要一个输入。看我们是否需要激励函数,默认的话,我们可以暂时默认为没有就是一个线性函数。
     Weights=tf.Variable(tf.random_normal([in_size,out_size]))  #定义一个权重,大写开头因为它是矩阵。我们定义了一个权重,行有in_size个,列有out_size个,其中输出为随机变量值,这样要比全是0的话好很多,每一步都会有变化
      biases=tf.Variable(tf.zeros([1,out_size])+0.1)  #因为biases相当于一个列表类的,所以非矩阵因此首字母无需大写。由于全是0的话不太好,所以我们让其全是0.1
      Wx_plus_b=tf.matmul(inouts,Weights)+biases  #前面那个式子相当于一个矩阵的乘法,还未被激活,就先存放在这里,是一个线性方程
      if activation_function is None:  
          outputs=Wx_plus_b   #如果没有激活函数,就让输出继续保持线性关系输出就好。不用激活函数的非线性关系
      else:
           outputs=activation_functon(Wx_plus_b)
      return outputs
定义数据形式
x_data=np.linspace(-1,1,300)[:,np.newaxis]  #我们说明了x_data的区间是-1~1,且有300个例子。后面的[  ]说明了它的维度
noise=np.random.normal(0,0.5,x_data.shape)  #说明我们的这个线并没有按照规定的正规曲线走,其周围还有很多点,也就是使其更接近真实的。
y_data=np.square(x_data)-0.5+noise  #np.square是指x的平方

接下来需要建立第一层,我们知道前面x_data有1个,所以是输入有一个属性也就有一个输入值;输出有y_data有1个,所以其也是有一个属性。那个中间的那个隐藏层,我们定义有10个。

xs=tf.placeholder(tf.float32,[None,1])  #none指的是开始值是多少都ok
ys=tf.placeholder(tf.float32,[None,1])
l1=add_layer(xs,1,10,activation_function=tf.nn.relu) #输入层。。前面定义了一个层了,所以我们这里是这个层的输入层,输入有1个属性,因为隐藏层有10个属性,所以我们定义了一个1,10的层。
prediction=add_layer(l1,10,1,activation_function=None) #10为隐藏层的属性,所以我们就定义了一个10,1的层结构。我猜测这个l1作为输入的原因是因为隐藏层不负其名,可以隐藏不用,所以我们输出层的输入直接就是原输入层的输出。
loss=tf.reduce_mean(tf.reduce_sum(tf.squary(ys-prediction),reduction_indices=[1]))  #一个计算公式,计算误差的
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)     #怎样对于误差减小进行提升,怎样去学习;每次都是以0.1的效率对误差进行更正和提升,使每次都得到一个更好的结果
init=tf.initialize_all_cariable()
sess=tf.Session()
sess.run(init)
for i in range(1000):
  sess.run(train_step,feed_dict={xs:x_data,ys:y_data})  #好处为可以分一步一步训练,可以提高训练效率,不再是一起。
    if i%50==0:   #我们看一下误差是否在得到训练的过程中减小
        print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))#只要通过placeholder进行运算的,就要feed_dict它们的值

结果可视化plot result

https://www.jianshu.com/p/0d1563c98d32

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Scrapy
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论