手动实现线性回归

《Tensorflow深度学习》 这本书的学习

手动实现线性回归

加了一点自己的思路。

import numpy as np
import tensorflow as tf

## 手动实现线性回归模型,没有用到框架
# 直接从模型随机采样得到数据,然后用这个数据再进行训练,训练后得到的模型和原有模型对比

# 产生100个随机样本
# x采样自[-10,10]的均匀分布
# 根据线性模型对样本标签y添加高斯噪声

# 循环产生样本
# 先保存在list中,再转换成ndarray
data = []
for i in range(100):
    x = np.random.uniform(-10., 10.)
    eps = np.random.normal(0, 0.01)
    y = 1.477 * x + 0.089 + eps
    data.append([x, y])
num_data = np.array(data)


# print(num_data)  # 数据较少,可以直接打印观察。

## 模型训练
# 1.定义损失函数【用于训练过程监控】
# 2.优化/训练:定义一步迭代函数【输入:当前迭代点+梯度计算(当前点+样本数据)+步长 输出:新迭代点】、
# 定义整个梯度下降函数【最大迭代次数,初始点】、
# 定义主训练函数【封装前面的函数】

# 损失函数mse
def mse(w, b, data):
    n = data.shape[0]
    return ((w * data[:, 0] + b - data[:, 1]) ** 2).sum() / n


def grad_comput(w, b, data):
    n = data.shape[0]
    res = (w * data[:, 0] + b - data[:, 1])
    grad_w = (2 / n) * (res * data[:, 0]).sum()
    grad_b = (2 / n) * res.sum()
    return grad_w, grad_b


# 一步迭代函数
def step_gradient(cur_w, cur_b, data, lr):
    """计算梯度,完成迭代步,返回新迭代点"""
    grad_w, grad_b = grad_comput(cur_w, cur_b, data)
    new_w = cur_w - lr * grad_w
    new_b = cur_b - lr * grad_b
    return new_w, new_b


# 梯度下降函数
# 书上只通过最大迭代次数控制是否停机,这里再添加一个梯度判断
def grad_descent(init_w, init_b, lr, data, max_iter, precision):
    loss_list = []
    w, b = init_w, init_b
    for i in range(max_iter):
        grad_w, grad_b = grad_comput(w, b, data)
        if grad_w ** 2 + grad_b ** 2 < precision:
            print("Ideal precision attained.")
            break
        w, b = step_gradient(w, b, data, lr)
        if i % 50 == 0:
            loss = mse(w, b, data)
            loss_list.append(loss)
            print("==iteration %d==  loss:%e  w:%e  b:%e" % (i, loss, w, b))
    print("Max iteration.")
    return [w, b]


# 训主练函数
def mian_train():
    lr = 0.01
    init_w, init_b = 0, 0
    max_iter = 1000
    precision = 1e-10
    w, b = grad_descent(init_w, init_b, lr, num_data, max_iter, precision)
    loss = mse(w, b, num_data)  # 计算最后的损失
    print("Final loss:%e  w:%e  b:%e" % (loss, w, b))

# 训练
mian_train()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值