# -*- 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()
结果

可以看出,经过八千多次 训练后,结果已经非常接近答案了
本文通过实例演示了如何使用梯度下降法进行线性回归分析,详细解释了损失函数的计算方式及参数调整过程。

1201

被折叠的 条评论
为什么被折叠?



