zoukankan      html  css  js  c++  java
  • 机器学习算法详解(三)——通过损失函数优化看线性回归

    我们知道机器学习中模型的参数是通过不断减小损失函数loss来进行优化的,这就与线性回归的含义不谋而合,只不过线性回归是通过最小二乘法来最小化误差(的平方)并且寻找最优函数。一想到平方,又不难联系到平方损失函数,平方损失函数相比最小二乘法不过就是多了个 1/n ,即求平均的系数。

    假设模型预测值为yi,模型实际输出为 ai,则有:

    平方损失函数公式:loss = (1/N)Σ(yi - ai)2

    最小二乘法公式:e = Σ(yi - ai)(由于回归方程的随机误差期望为0且无法确定,此处忽略)

    可以看出两者并没有本质区别,都可以理解成通过最小化误差的平方和来优化模型参数。

    下面使用tensorflow模拟一下损失函数的优化过程,完整代码如下:

     1 import tensorflow as tf
     2 import numpy as np
     3 import matplotlib.pyplot as plt
     4 from mpl_toolkits.mplot3d import Axes3D
     5 
     6 batch_size = 10
     7 seed = 23445
     8 
     9 # 通过随机数种子生成模型的输入输出
    10 random = np.random.RandomState(seed)
    11 input_x = random.rand(64,2)
    12 input_y = [[x1+x2+random.rand()/10.0-0.05] for (x1,x2) in input_x]
    13 print(input_x)
    14 print(input_y)
    15 x = input_x[:,0]
    16 y = input_x[:,1]
    17 z = input_y
    18 # 绘制3D散点图,查看分布情况
    19 fig = plt.figure()
    20 ax = Axes3D(fig)
    21 ax.scatter(x, y, z)
    22 
    23 ax.set_zlabel('Z', fontdict={'size': 15, 'color': 'red'})
    24 ax.set_ylabel('Y', fontdict={'size': 15, 'color': 'red'})
    25 ax.set_xlabel('X', fontdict={'size': 15, 'color': 'red'})
    26 plt.show()
    27 
    28 # 定义网络输入和输出以及参数
    29 x = tf.placeholder(tf.float32,shape=(None,2))
    30 y_ = tf.placeholder(tf.float32,shape=(None,1))
    31 w = tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
    32 y = tf.matmul(x,w)
    33 
    34 # 定义损失函数为MSE
    35 loss = tf.reduce_mean(tf.square(y-y_))
    36 train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
    37 
    38 # 生成会话,训练10000轮
    39 with tf.Session() as sess:
    40     init = tf.global_variables_initializer()
    41     sess.run(init)
    42     steps = 10000
    43     for i in range(steps):
    44         start = (i*batch_size)%64
    45         end = (i*batch_size)%64+batch_size
    46         sess.run(train_step,feed_dict={x:input_x[start:end],y_:input_y[start:end]})
    47         if i%500 ==0:
    48             print("after ",i," steps,w is :",sess.run(w),"loss is :",sess.run(loss,feed_dict={x:input_x[start:end],y_:input_y[start:end]}),'
    ')
    49     print("final,w is :",sess.run(w),"loss is :",sess.run(loss,feed_dict={x:input_x[start:end],y_:input_y[start:end]}),'
    ')

    生成数据如下:

      

    首先可以看到散点分布如图

    旋转一下方向可以看到,生成的数据是存在一定线性关系的

    参数调优过程如下:

    可以看到loss大致是在不断减小的,最终结果如下:

    由上述过程可以看出,损失函数和线性回归存在一定的相似性,但是需要注意的是线性回归只能处理线性问题,而损失函数可以处理非线性的复杂模型。

    感兴趣的读者可以修改上述代码实现线性回归原理。

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/zdm-code/p/12855859.html
Copyright © 2011-2022 走看看