线性回归的原理和实现

    最近看一本书,《动手学习深度学习》,发现这本书挺好的正好用来复习深度学习的基本概念。但是书中的是以MXNET作为教学代码,我又不想去学,因此我把书上的例子都用Tensorflow实现一遍。


回归和拟合

    回归从数学角度来讲就是,给定一个点集,能够用一条曲线去拟合,如果这个曲线是一条直线,就成为线性回归。

    拟合的方法包括回归、插值、和逼近,它更为宽泛一些,是一种数据处理的方式。而回归是一种特定的数学方法,可以实现数据拟合。


模型、权重、偏置

2.png

误差函数

3.png

均方误差

4.png

数值解、解析解

    当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)


随机梯度下降、学习率和超参数

5.png


线性回归

    线性回归可以看做一个单层神经网络:

6.png

    输入分别为 x1 和 x2 ,因此输入层的输入个数为2。输入个数也叫特征数或特征向量维度。输入层不计算,因此该网络一般被认为只有一层。输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)。

    向量化表示求解过程:

7.png


Tensorflow实现

    模型有两个特征,训练数据获取如下:

import tensorflow as tf
import numpy as np

#目标函数y=X*w+b

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2

#获得训练数据
features = np.random.normal(loc=0.,scale=1, size=(num_examples, num_inputs))
labels = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b
#加上噪声
labels += np.random.normal(scale=0.01,size=labels.shape)

    绘制训练数据分布

%matplotlib inline
import matplotlib.pyplot as plt

y_hat0 = true_w[0] * features[:,0]  + true_b
y_hat1 = true_w[1] * features[:,1]  + true_b

plt.figure()
plt.scatter(features[:,0],features[:,1],color='red',s=10) #散点图 红色,大小为10
plt.show()
plt.figure()
plt.scatter(features[:,0],labels,s=10)
plt.plot(features[:,0],y_hat0)
plt.show()
plt.figure()
plt.scatter(features[:,1],labels,s=10)
plt.plot(features[:,1],y_hat1)
plt.show()

8.jpg

    绘制三维数据分布

from mpl_toolkits.mplot3d import Axes3D
y_hat = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(features[:,0],features[:,1], labels,s=5)
ax.set_xlabel('features0')
ax.set_ylabel('features1')
ax.set_zlabel('y')
plt.show()

9.jpg

    定义并训练模型

%%time
#初始化模型参数
w = tf.Variable(initial_value=tf.random_normal(shape=(num_inputs, 1),stddev=1.,mean=0.))
b = tf.Variable(initial_value=tf.random_normal(shape=(1,),stddev=1.,mean=0.))
#定义模型
x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))
y=tf.matmul(x,w)+b
#定义损失函数及反向传播方法
loss=tf.reduce_mean(tf.square(y_-y))
sgd=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
BATCH_SIZE=10
w_history=[]
b_history=[]
#生成对话,训练网络
with tf.Session() as sess:
    init_op=tf.global_variables_initializer() #初始化所有的Variable
    sess.run(init_op)
    STEPS=2000
    for i in range(STEPS):
        index=np.random.randint(low=0, high=num_examples-1, size=BATCH_SIZE)
        data=features[index]
        label=labels[index].reshape(-1,1)
        
        sess.run(sgd,feed_dict={x:data,y_:label})
        
        if(i%200==0): 
            w_history.append(sess.run(w))
            b_history.append(sess.run(b))
            print(i,end=' ')
            print(sess.run(w))
            print(sess.run(b))

    显示训练过程

plt.figure(figsize=(10,10))
plt.scatter(features[:,0],labels,s=10)
for W,B in zip(w_history,b_history):
    W0=W[0]
    y_hat0 = W0 * features[:,0]  + B
    plt.plot(features[:,0],y_hat0,label =str(W0))
plt.legend()#显示图例
plt.show()
plt.figure(figsize=(10,10))
plt.scatter(features[:,1],labels,s=10)
for W,B in zip(w_history,b_history):
    W1=W[1]
    y_hat1 = W1 * features[:,1]  + B
    plt.plot(features[:,1],y_hat1,label =str(W1))
plt.legend()#显示图例
plt.show()

10.jpg

11.jpg





参考文献

[1]阿斯顿·张(Aston Zhang) ,李沐(Mu Li),etc.动手学深度学习.http://zh.gluon.ai/chapter_deep-learning-basics/mlp.html 

[2]yaoyao_CJ.回归与拟合、分类与回归.https://blog.csdn.net/yaoyao_cj/article/details/79460522.2018-03-06

上一篇: 没有了

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于