Tensorflow2.0笔记:回归问题(附代码)

简介

在现实生活中,连续值预测问题是非常常见的,比如股价的走势预测、天气预报中温
度和湿度等的预测、年龄的预测、交通流量的预测等。对于预测值是连续的实数范围,或
者属于某一段连续的实数区间,我们把这种问题称为回归(Regression)问题。特别地,如果使用线性模型去逼近真实模型,那么我们把这一类方法叫做线性回归(Linear Regression,简称 LR)
下面举例一个简单的线性回归问题

问题

从指定的w=1.477, b=0.089的真实模型y=1.477*x+0.0889中直接采样数据。在这里插入图片描述

程序清单

import tensorflow as tf
import numpy as np

# 1.采集数据
data = []  # 保存样本集的列表
for i in range(100):  # 循环采样100个点
    x = np.random.uniform(-10., 10.)  # 从[-10,10]的均匀分布中随机采样一个数
    eps = np.random.normal(0., 0.1)  # 从均值为0.1,方差为0.1^2的高斯分布中随机采样噪声
    y = 1.477*x+0.089+eps  # 得到模拟的输出
    data.append([x, y])  # 保存样本点
data = np.array(data)  # 转换为2D Numpy数组

# 2.计算误差
def mse(b, w, points):  # 根据当前轮的w,b参数,计算均方差损失
    totalError = 0
    for i in range(0, len(points)):  # 循环迭代所有点
        x = points[i, 0]  # 获得第i个点的横坐标x
        y = points[i, 1]  # 获得第i个点的纵坐标y
        totalError += (y-(w*x+b))**2  # 计算累计误差
    return totalError/float(len(points))  # 得到均方差

# 3.计算梯度
def step_gradient(b_current, w_current, points, learning_rate):
    b_gradient = 0
    w_gradient = 0
    M = float(len(points))  # 总样本数
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        b_gradient += (2/M) * ((w_current * x + b_current) - y)  # 误差函数对b的导数
        w_gradient += (2/M) * x * ((w_current * x + b_current) - y)  # 误差函数对w的导数
    # 根据梯度下降法算法更新w,b
    new_b = b_current - (learning_rate * b_gradient)
    new_w = w_current - (learning_rate * w_gradient)
    return [new_b, new_w]

# 4.梯度更新
def gradient_descent(points, starting_b, starting_w, learning_rate, epos):
    b = starting_b  # 初始化b
    w = starting_w
    for step in range(epos):
        b, w = step_gradient(b, w, np.array(points), learning_rate)
        loss = mse(b, w, points)
        if step % 50 == 0:
            print('epos', step, ':loss', loss, '; w', w, '; b', b)  # 每50epos打印一遍
    return {b, w}

def main():
    lr = 0.01
    init_b = 0
    init_w = 0
    epos = 10000
    [b, w] = gradient_descent(data, init_b, init_w, lr, epos)
    loss = mse(b, w, data)
    print('Final loss:', loss, ' w:', w, ' b:', b)
    return 0

if __name__ == "__main__":
    main()

训练结果:
在这里插入图片描述
从训练结果可以发现,通过建立的线性模型训练出来的w,b已经很接近真实模型了

发布了45 篇原创文章 · 获赞 50 · 访问量 3526

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/104699929