zoukankan      html  css  js  c++  java
  • tensorflow 2.0 学习(二)线性回归问题

    线性回归问题

     1 # encoding: utf-8
     2 
     3 import numpy as np
     4 import matplotlib.pyplot as plt
     5 
     6 data = []
     7 for i in range(100):
     8     x = np.random.uniform(-10., 10.)    #均匀分布产生x
     9     eps = np.random.normal(0., 0.01)    #高斯分布产生一个误差值
    10     y = 1.477*x + 0.089 +eps            #计算得到y值
    11     data.append([x, y])                 #保存到data中
    12 
    13 data = np.array(data)                   #转成数组的方式方便处理
    14 plt.plot(data[:,0], data[:,1], 'b')    #自己引入用于观察原始数据
    15 #plt.show()
    16 plt.savefig('original data.png')
    17 
    18 
    19 def mse(b, w, points):                  #计算所有点的预测值和真实值之间的均方误差
    20     totalError = 0
    21     for i in range(0, len(points)):
    22         x = points[i, 0]
    23         y = points[i, 1]
    24         totalError += (y -(w*x + b))**2     #真实值减预测值的平方
    25     return totalError/float(len(points))    #返回平均误差值
    26 
    27 
    28 def step_gradient(b_current, w_current, points, lr):    #预测模型中梯度下降方式优化b和w
    29     b_gradient = 0
    30     w_gradient = 0
    31     M = float(len(points))
    32     for i in range(0, len(points)):
    33         x = points[i, 0]
    34         y = points[i, 1]
    35         b_gradient += (2/M) * ((w_current*x + b_current) - y)   #求偏导数的公式可知
    36         w_gradient += (2/M)*x*((w_current*x + b_current) - y)   #求偏导数的公式可知
    37     new_b = b_current - (lr*b_gradient)      #更新参数,使用了梯度下降法
    38     new_w = w_current - (lr*w_gradient)      #更新参数,使用了梯度下降法
    39     return [new_b, new_w]
    40 
    41 
    42 def gradient_descent(points, starting_b, starting_w, lr, num_iterations):   #循环更新w,b多次
    43     b = starting_b
    44     w = starting_w
    45     loss_data = []
    46     for step in range(num_iterations):  #计算并更新一次
    47         b, w = step_gradient(b, w, np.array(points), lr)        #更新了这一次的b,w
    48         loss = mse(b, w, points)
    49         loss_data.append([step+1, loss])
    50         if step % 50 == 0:              #每50次输出一回
    51             print(f"iteration:{step}, loss{loss}, w:{w}, b:{b}")
    52     return [b, w, loss_data]
    53 
    54 
    55 def main():
    56     lr = 0.01               #学习率,梯度下降算法中的参数
    57     initial_b = 0           #初值
    58     initial_w = 0
    59     num_iterations = 1000   #学习100轮
    60     [b, w, loss_data] = gradient_descent(data, initial_b, initial_w, lr, num_iterations)
    61     loss = mse(b, w, data)
    62     print(f'Final loss:{loss}, w:{w}, b:{b}')
    63 
    64     plt.figure()            #观察loss每一步情况
    65     loss_data = np.array(loss_data)
    66     plt.plot(loss_data[:,0], loss_data[:,1], 'g')
    67     plt.savefig('loss.png')
    68     #plt.show()
    69 
    70     plt.figure()        #观察最终的拟合效果
    71     y_fin = w*data[:,0] + b + eps
    72     plt.plot(data[:,0], y_fin, 'r')
    73     #plt.show()
    74     plt.savefig('final data.png')
    75 
    76 
    77 if __name__ == '__main__':
    78     main()

    original data (y = w*x + b +eps)

    loss rate

    final data (y' = w' *x + b' + eps )

    最终loss趋近9.17*10^-5, w趋近1.4768, b趋近0.0900

    真实的w值1.477, b为0.089

    对于线性回归问题,适用性挺好!

    主要的数学代码能理解,唯有取梯度的反方向更新参数,不是很能理解!

     这里还没有用到tensorflow,下一次更新基础知识!

  • 相关阅读:
    Zend Framework 2.1.5 中根据服务器的环境配置调用数据库等的不同配置
    在基于 Eclipse 的 IDE 中安装和使用 Emmet(ZenCoding)
    【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet
    【翻译】Emmet(Zen Coding)官方文档 之二 缩写
    【翻译】Emmet(Zen Coding)官方文档 之七 一览表
    【翻译】Emmet(Zen Coding)官方文档 之三 CSS 缩写
    【翻译】Emmet(Zen Coding)官方文档 之四 动作
    【翻译】Emmet(Zen Coding)官方文档 之一 web 编程的必备工具
    Zend Framework 2 时区设置警告问题的解决
    【翻译】Emmet (Zen Coding) 元素类型
  • 原文地址:https://www.cnblogs.com/heze/p/12049243.html
Copyright © 2011-2022 走看看