使用TensorFlow实现简单的线性回归(LinearRegression)

线性模型基本形式 :

  • 线性回归属于回归算法,表达监督学习的过程。通过属性的线性组合来预测函数:
    f(x)=w1x1+w2x2+...+wdxd+b
  • 一般向量形式写成:
    f(x)=wTx+b
  • 其中的 w=(w1;w2;...;wd). w b 学的后模型就可以确定
  • 线性回归的目标是找到一个与这些数据最为吻合的线性函数,用来预测或者分类,主要解决线性问题

使用TensorFlow实现简单的线性回归:

  • 在TensorFlow中进行线性回归处理重点是将样本和样本特征矩阵化

    1. 定义用于显示图画的长和宽产出样本点个个数。linspace在X -3 到 3 的位置产出100个样本点.使用np.random增加扰动使用scatter做散点绘制show展示图像

      plt.rcParams["figure.figsize"] = (12, 6)
      n_observations = 200
      xs = np.linspace(-3, 3, n_observations)
      ys = np.sin(xs) + np.random.uniform(-0.5, 0.5, n_observations)
      plt.scatter(xs, ys)
      plt.show()
      
    2. 准备好placeholder容器往模型添加tf.placeholder:用于得到传递进来的真实的训练样本:声明时,必须提供初始值;名称的真实含义,在于变量,也即在真实训练时,其值是会改变的,自然事先需要指定初始值

      X = tf.placeholder(tf.float32, name='X_placeholder')
      Y = tf.placeholder(tf.float32, name='Y_placeholder')
      
    3. tf.Variable:主要在于一些可训练变量(trainable variables),比如模型的权重或者偏执值,不必指定初始值,可在运行时,通过 Session.run 的函数的 feed_dict 参数指定; 这也是其命名的原因所在,仅仅作为一种占位符;

      W = tf.Variable(tf.random_normal([1]), name='weight')
      b = tf.Variable(tf.random_normal([1]), name='bias')
      
    4. 计算预算结果,先做一次向,再增加高次项

      
      Y_pred = tf.add(tf.multiply(X, W), b)
      W_2 = tf.Variable(tf.random_normal([1]), name='weight_1')
      Y_pred = tf.add(tf.multiply(tf.pow(X, 2), W_2), Y_pred)
      W_3 = tf.Variable(tf.random_normal([1]), name='weight_2')
      Y_pred = tf.add(tf.multiply(tf.pow(X, 3), W_3), Y_pred)
      sample_num = xs.shape[0]
    5. 计算损失函数值,对Y去做差值后求平方设置步进值,凸函数可以用梯度下降收敛到的局部最低点就是全局最低点初始化GradientDescentOptimizer对象去执行op>minimize运算会对loss做一个最小化,但是如果是神经网络就不能使用GradientDescentOptimizer因为会降到最低点

      
      loss = tf.reduce_sum(tf.pow(Y_pred - Y, 2)) / sample_num
      learning_rate = 0.01
      optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
      n_samples = xs.shape[0]
    6. 指定迭代的次数,并在Session里执行graph,显示参数的更新

      
      n_samples = xs.shape[0]
      with tf.Session() as sess:
      sess.run(tf.global_variables_initializer()) 
      writer = tf.summary.FileWriter('./graphs/polynomial_reg', sess.graph)
      for i in range(1000):
          total_loss = 0
          for x, y in zip(xs, ys):
              _, l = sess.run([optimizer, loss], feed_dict={X: x, Y:y}) 
              total_loss += l
          if i%20 ==0:
              print('Epoch {0}: {1}'.format(i, total_loss/n_samples))
      writer.close()
      W, W_2, W_3, b = sess.run([W, W_2, W_3, b])
    7. 绘制可视化图形

      
      plt.plot(xs, ys, 'bo', label='Real data')
      plt.plot(xs, xs * W + np.power(xs, 2) * W_2 + np.power(xs, 3) * W_3 + b, 'r', label='Predicted data')
      plt.legend()
      plt.show()

    运行结果
    使用TensorFlow实现简单的线性回归(LinearRegression)_第1张图片

你可能感兴趣的:(TensorFlow)