至于什么是线性和非线性,最早出现在信号系统当中,是针对齐次性,叠加性等提出的,不懂的简单理解是直线即可。要对一堆数据进行模型分析,当我们看到一堆这样的数据时,第一反应这绝壁是一个二次函数。
首先我们来实现这些函数的实现:这里需要引入一个numpy库
设置一个一维数组,让这个数组是呈等价递增,并增加一个维度,可以理解为上图中的x轴。x_data = numpy.linspace(-0.5, 0.5, 200)[:,np.newaxis]
设置噪声,也可理解为上下波动,noise = np.random.normal(0,0.02,x_data.shape)
设置y_data,y_data = np.square(x_data) + noise
到这里所有的数据已经完全产生,接下来的工作就是显示出来和训练出这个模型
这次不用函数模型,直接用一个神经网络来训练这个模型:
定义两个占位符,x和y,一个当作输入一个当作输出,用来训练网络
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])
定义网络中间网络层,包括权重Weight和偏差Biase,(和x输入连接的部分)
Weights_L = tf.Variable(tf.random_normal([1,10]))
Biases_L = tf.Variable(tf.zeros([1,1]))
Result_L = tf.matmul(x,Weights_L) + Biases_L
L = tf.nn.tanh(Result_L)
定义和y输入连接的部分
Weights_R = tf.Variable(tf.random_normal([10,1]))
Biases_R = tf.Variable(tf.zeros([1,1]))
Result_R = tf.matmul(L,Weights_R) + Biases_R
R = tf.nn.tanh(Result_R)
网络设置完成之后就用字典填充准备的数据来训练网络:
sess.run(train,feed_dict={x:x_data,y:y_data})
训练完成之后再次将x_data填入得到自己预测的值
prediction = sess.run(R,feed_dict={x:x_data})
画图的部分使用matplotlib.pyplot即可,很简单。
全部代码:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#设置一个一维数组,让这个数组是呈等价递增,并增加一个维度
x_data = np.linspace(-0.5, 0.5, 200)[:,np.newaxis]
#print(x_data)
#设置波动,也可称为噪音
noise = np.random.normal(0,0.02,x_data.shape)
#print(noise)
#设置y_data
y_data = np.square(x_data) + noise
#print(y_data)
#定义两个占位符,x和y,一个当作输入一个当作输出,用来训练网络
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])
#定义网络中间网络层,包括权重Weight和偏差Biase
#定义和x输入连接的部分
Weights_L = tf.Variable(tf.random_normal([1,10]))
Biases_L = tf.Variable(tf.zeros([1,1]))
Result_L = tf.matmul(x,Weights_L) + Biases_L
L = tf.nn.tanh(Result_L)
#定义和y输入连接的部分
Weights_R = tf.Variable(tf.random_normal([10,1]))
Biases_R = tf.Variable(tf.zeros([1,1]))
Result_R = tf.matmul(L,Weights_R) + Biases_R
R = tf.nn.tanh(Result_R)
#设置代价函数
loss = tf.reduce_mean(tf.square(y-R))
#设置优化器
optimizer = tf.train.GradientDescentOptimizer(0.1)
#设置最小代价函数
train = optimizer.minimize(loss)
#设置初始化变量
init = tf.global_variables_initializer()
#设置会话
with tf.Session() as sess:
sess.run(init)
for step in range(2000):
sess.run(train,feed_dict={x:x_data,y:y_data})
#获取预测值
prediction = sess.run(R,feed_dict={x:x_data})
#画图
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction,'-r',lw=5)
plt.show()
结果是: