正文
线性回归算法的数学推导:
假设有两个特征项X1和X2,和参数θ0、θ1、θ2它们满足
Y=θ0+θ1X1+θ2X2
其中 θ0为 偏置项,用于更好的描述数据。
YY表示一个由X和θ拟合的平面hθ(X),这个拟合平面与X、θ之间的关系为:
绝大部分情况下线性回归算法会产生 误差,所以有必要在公式中加入对误差的描述。
记误差为 ϵ,则对于用该算法描述的每个样本都有:
对每一个样本而言,误差 ϵ(i)是 独立同分布的,均服从”均值为 0,方差为σ^2”的 高斯分布( 正态分布)。
由 正态分布公式:
由此可得 似然函数:
为方便计算,将似然函数转换为对数形式,则 对数似然函数为:
当 J(θ)越小时,误差越小, J(θ)的最小点即 J(θ)的一个极值点
求该函数的极值点要用到 梯度下降的方法,梯度下降,即将数据应用于 目标函数, 不断迭代,直到达到目标函数的 终点( 极值点)。
我们将误差视为一种 损失,对有 mm个样本的数据集而言,将每一个样本的平均损失视为目标函数,当每一个样本的平均损失最小时,就达到了目标函数的终点。
平均损失(目标函数):
梯度下降的方法通常有三种,分别是 批量梯度下降、 随机梯度下降和 小批量梯度下降:
①批量梯度下降:
迭代公式:
②随机梯度下降:
迭代公式:
③小批量梯度下降:
迭代公式:
小批量的批处理数量依内存和处理效率而定。
梯度下降通常还有一个学习率的问题,一般来说,学习率要取一个比较小的数,之后再依学习情况进行更改。
不同学习率造成的不同影响:
学习率的选择,直接关系着学习效果的好坏。
线性回归算法的tensorflow演示:
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt threshold = 1.0e-2 x_data = np.random.randn(100).astype(np.float32) y_data = 3 * x_data + 1 weight = tf.Variable(1.0) bias = tf.Variable(1.0) x_ = tf.placeholder(tf.float32) y_ = tf.placeholder(tf.float32) y_model = tf.add(tf.multiply(x_, weight), bias) loss = tf.reduce_sum(tf.pow((y_model - y_), 2)) train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss) sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) flag = 1 while(flag): for (x, y) in zip(x_data, y_data): sess.run(train_op, feed_dict={x_:x, y_:y}) print(weight.eval(sess), bias.eval(sess)) if sess.run(loss, feed_dict={x_:x_data, y_:y_data}) <= threshold: flag = 0 plt.plot(x_data, y_data, 'ro', label='Original data') plt.plot(x_data, sess.run(weight) * x_data + sess.run(bias), label='Fittedline') plt.legend() plt.show()