01 线性回归 python实现 梯度下降

线性回归

线性回归模型:y^=w1x1+w2x2+b,其中w1,w2称作权重,b称作偏差,它们是线性回归模型的参数。求这些参数的过程就是回归。一旦有了这些参数,在给定输入下做预测也就非常容易了。将输入带入回归方程,即可得到预测值。

训练数据:一组数据称为一个样本,其中x1,x2称为特征,特征用来表征样本的特点,y称为标签。一般我们采集m个样本组成训练数据。

损失函数:在模型训练中,我们需要衡量预测值y^与真实值y之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。

训练模型:训练模型就是找出使得平均误差最小的参数的过程。因为只有这样得到的参数w1,w2,b才可以使得预测值y^更加接近真实值y。
优化算法:梯度下降法。

from numpy import *
import numpy as np

#生成训练数据
w1_=2
w2_=-3.4
b_=4.2                                                         #设置参数w1_,w2_,b_
x_data = np.random.normal(loc=0.0, scale=1.0, size=(1000,2)) #随机生成均值为0 方差为1的正态分布
y_data = w1_ * x_data[:,0] + w2_ * x_data[:,1] + b_ #计算真实值y_data

#损失函数(平均平方误差)
def compute_error(w1,w2,b, x_data, y_data):
    totalError = 0
    for i in range(0, len(x_data)): #len计算样本个数 通过循环逐个求误差
        y_hat=(w1*x_data[i][0]+w2*x_data[i][1])+ b #计算预测值
        totalError += (y_data[i] - y_hat) ** 2       #计算每个样本的平方误差并求和
    return totalError / float(len(x_data)) / 2.0     #除以样本个数n计算平均值

#梯度下降
def gradient_descent_runner(x_data, y_data,w1,w2, b, lr, epochs):   #lr 学习率 epoch 训练次数
    # 计算总数据量
    m = float(len(x_data))
    # 循环epochs次
    for i in range(epochs):
        w1_grad=0
        w2_grad=0
        b_grad = 0
        # 计算梯度的总和再求平均 (损失函数对每个参数的求导)
        for j in range(0, len(x_data)):
            w1_grad += (1 / m) * x_data[j][0] * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
            w2_grad += (1 / m) * x_data[j][1] * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
            b_grad += (1 / m) * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
        # 更新b和k
        w1=w1-(lr*w1_grad) #新的参数=旧的参数-学习率*旧的参数
        w2=w2-(lr*w2_grad)
        b = b - (lr * b_grad)
        # 每迭代5次,输出一次图像
        error=compute_error(w1,w2,b, x_data, y_data)
        if i % 100==0:
            print('迭代次数:%d, 误差:%f'%(i,error))
    return w1,w2,b

#初始化训练参数
w1=0
w2=0
b=0
lr = 0.01
epochs =500

#训练模型(得出最佳参数)
w1, w2, b=gradient_descent_runner(x_data, y_data,w1,w2, b, lr, epochs)

#初始设置的参数 vs 训练出来的参数
print('w1_=%2f, w2_=%2f, b_=%2f' % (w1_,w2_,b_))
print('w1=%2f, w2=%2f, b=%2f' % (w1,w2,b))
        扫一扫,关注我们
        每天一个小程序,开开心心学python

扫一扫学python

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值