第一章 最小二乘法

tensorflow是机器学习中一个优秀的框架,这一系列的教程是通过实例来介绍tensorflow的使用。慢慢的对tensorflow的一些重要的概念进行介绍,把tensorflow的使用方法融入到各个算法中,而不是一味的去专门学习tensorflow的使用。

张量

tensorflow 可以分成两个词, 一个是tensor ,另外一个是flowtensor说的是数据模型, 把它叫做 张量flow 是一种流式的计算流行以后会慢慢的明白这种方式。

几种变量形式:

  • placeholder:占位符,通常是在训练的时候把数据喂给 他们。

  • Variable:求变量,我们在训练的过程中,就是为了求出这些值来。

  • constant:常变量,可以进行赋值计算等。

    >>> import tensorflow as tf
    >>> a = tf.constant([3],name="a")
    >>> b = tf.constant([4],name="b")
    >>> c = a + b
    >>> sess = tf.Session()
    >>> sess.run(c)
    array([7], dtype=int32)
    >>> print c
    Tensor("add_1:0", shape=(1,), dtype=int32)
    >>>
    

constant 的计算过程,特别注意的是要得到变量具体的值,需要创建一个上下文sess = tf.Session() 才能访问到变量的资源。

评价函数和梯度上升下降

评价函数是我们需要求解的方程,如在最小二乘法中评价函数为方差最小, 梯度下降:是我们求解问题的方式,简单的认为是,我们沿着坡就能达到山的波峰或者波谷,波峰或者波谷代表了评价函数的最大值或最小值。

最小二乘法评价函数用数学公式表示为:

$$\sum_{n=0}^N(y_i-a-bx_i)^2$$

tensorflow 表示为:

X = tf.placeholder("float")
Y = tf.placeholder("float")

W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)

cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)

使用梯度,求得最值:

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

其中 learning_rate 为学习因子,代表梯度的步长。

代码如下所示:

import matplotlib
matplotlib.use('Agg')


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

rng = numpy.random

learning_rate = 0.01
training_epochs = 13
display_step = 1

train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
                         7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
                         2.827,3.465,1.65,2.904,2.42,2.94,1.3])
n_samples = train_X.shape[0]

X = tf.placeholder("float")
Y = tf.placeholder("float")

W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)

cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

init = tf.global_variables_initializer()

with tf.Session() as sess:

    sess.run(init)

    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        if (epoch+1) % display_step == 0 or epoch == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b))

        plt.figure()
            plt.title('step:' + str(epoch))
        plt.plot(train_X, train_Y, 'ro', label='Original data')
        plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
        plt.legend()
        out_png = '%d.png'%(epoch)
        plt.savefig(out_png, dpi=150)

    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

求解的过程如下:

转载请标明来之:http://www.bugingcode.com/

更多教程:阿猫学编程


所有评论

写了这么多年博客,收到的优秀评论少之又少。在这个属于 SNS 的时代也并不缺少向作者反馈的渠道。

还没有评论

撰写评论