本文假设读者已经了解逻辑回归的原理,如有不了解的作者,请先查阅相关逻辑回归的原理和推导资料。


逻辑回归预测的计算公式为 y_predict = logistic(X*W+b)


其中:

X表示输入,

W表示输入和隐含层之间的权重,

b为隐含层神经元的偏置,

y_predict表示预测值,即输出结果。


这里需要求解的参数是W和b,使用的方法是随机梯度下降法,损失函数是预测值和实际值的L2距离。


# coding: utf-8 
import tensorflow as tf  
import numpy as np  
import matplotlib.pyplot as plt  
import math
  
# 配置参数
num_samples = 400
learning_rate = 0.01
num_epoch = 500
# 创建占位符  
x = tf.placeholder(tf.float32)  
y = tf.placeholder(tf.float32)  
  
# 创建变量  
# tf.random_normal([1])返回一个符合正太分布的随机数  
w = tf.Variable(tf.random_normal([1], name='weight'))  
b = tf.Variable(tf.random_normal([1], name='bias'))  
  
y_predict = tf.sigmoid(tf.add(tf.multiply(x, w), b))  
cost = tf.reduce_sum(tf.pow(y_predict - y, 2.0))
sum_cost = tf.reduce_sum(tf.pow(y_predict - y, 2.0))/num_samples
   
# optimizer = tf.train.AdamOptimizer().minimize(cost)  
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

cost_accum = []  
cost_prev = 0
#np.linspace()创建agiel等差数组,元素个素为num_samples  
xs = np.linspace(-3, 3, num_samples)  
ys = (np.sin(xs) + np.random.normal(0, 0.01, num_samples)  + 1.0) /2
  
with tf.Session() as sess:  
    #初始化所有变量  
    sess.run(tf.initialize_all_variables()) 
    #开始训练  
    for epoch in range(num_epoch):  
        for sample_x, sample_y in zip(xs,ys):  
            sess.run(optimizer, feed_dict={x:sample_x, y:sample_y})
        train_cost = sess.run(sum_cost, feed_dict={x:xs, y:ys})  
        print("train_cost is:" + str(train_cost))
        cost_accum.append(train_cost)  
        print(w.eval())
        print(b.eval())
         
  
        # 当误差小于10-6时 终止训练  
        if np.abs(cost_prev - train_cost) < 1e-6:  
           break  
        #保存最终的误差  
        cost_prev=train_cost  
    fig = plt.figure()
    ax1 = fig.add_subplot(121)
    ax2 = fig.add_subplot(122)
    #画图  画出每一轮训练所有样本之后的误差  
    ax1.plot(range(len(cost_accum)), cost_accum, 'r')
    newys = list()
    for x in xs:
        sum = x * w.eval()[0] + b.eval()[0]
        newys.append(1/(1+math.exp(-sum)))
    ax2.plot(xs, newys, 'r')
    ax2.plot(xs, ys, 'b')
    plt.show()


image.png