numpy梯度下降算法简单求解二元一次方程近似解

本文通过实例演示了如何使用梯度下降法进行线性回归分析,详细解释了损失函数的计算方式及参数调整过程。
# -*- coding: utf-8 -*-   
import torch
import numpy

# 框架信息
print("torch.__version__=",torch.__version__)
print("torch.cuda.is_available()=",torch.cuda.is_available())
print()


# 对所有点求总的损失函数
# loss=所有(wx+b-y)^2的和的平均数
def compute_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=(y-(w*x+b))**2
    return totalError/float(len(points))

# 更新w,b
# w_new=w_old-学习率*损失函数对w_old的偏导
# b_new=b_old-学习率*损失函数对b_old的偏导
def step_gradient(b_current,w_current,points,learning_rate):
    b_gradient=0
    w_gradient=0
    N=float(len(points))
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient+=2*(w_current*x+b_current-y)
        w_gradient+=2*x*(w_current*x+b_current-y)
    b_gradient/=N
    w_gradient/=N
    b_new=b_current-learning_rate*b_gradient
    w_new=w_current-learning_rate*w_gradient
    return [b_new,w_new]

# 循环迭代训练
def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):
    b=starting_b
    w=starting_w
    for i in range(num_iterations):
        b,w=step_gradient(b,w,numpy.array(points),learning_rate)
        loss=compute_error_for_line_given_points(b,w,points)
        if loss<1e-4:
            print("训练",i,"次即得出结果")
            break
    return [b,w]

# 假设y=wx+b
# 初始有五个点[1.,2.145] [2.,4.145] [3.,6.145] [4,8.415] [5,10.145]
def run():
    points=numpy.array([[1.,2.145],[2.,4.145],[3.,6.145],[4,8.145],[5,10.145]])
    learning_rate=0.001
    b=0
    w=0
    num_iterations=10000
    print("初始:")
    print("learning_rate=",learning_rate,"num_iterations=",num_iterations)
    print("b=",b,"w=",w)
    b,w=gradient_descent_runner(points,b,w,learning_rate,num_iterations)
    print("训练完毕后")
    loss=compute_error_for_line_given_points(b,w,points)
    print("b=",b,"w=",w,"loss=",loss)

run()

结果

可以看出,经过八千多次 训练后,结果已经非常接近答案了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值