本文假设读者已经了解逻辑回归的原理,如有不了解的作者,请先查阅相关逻辑回归的原理和推导资料。
逻辑回归预测的计算公式为 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()