Pytorch-回归实战-利用梯度下降方法求解numpy两组数据

'''
理论1.
回归学习:
理论:数据都是有噪声的.
模型:y=wx+b+ε  ,ε高斯噪声.
损失函数:loss=sqrt(wx+b-y)
动态图:由x,y,loss三个组成的立体空间图.
目的:输入x值,求得的y`值尽量接近于真实值y.
优化器:??
'''
'''
理论2.
Linear Regression
a.Linear Regression (y=wx+b+ε)
b.Logistic Regression 对数据进行压缩,使得y值在[0,1].
c.Classification 手写字概率0-9? EPi=1(写10次)
'''
'''
实战-利用梯度下降方法求解numpy两组数据:
公式1:y=wx+b
公式2:loss=sqrt(wx+b-y)
问题描述:
输入x到公式生成的y`值与真实值的梯度下降方法计算最优参数w和b值.
运行:
Starting gradient descent at b = {0}, m = {1}, error = {2}
第一个compute_error_for_line_given_points()函数是计算参数值w,b为0的时候的差值.
更多的是寻找x与y最适合的参数值.
方法:
是通过求导公式2loss的w,b的极值,对函数loss求导求出它在值域里面的极小值,那也就是loss的最小值,小批量有100个数据值对w,b求导之和,
然后更新梯度w,b值.这为1/num_iterations.
对于num_iterations的次数,要看loss值.
After {0} iterations b = {1}, m = {2}, error = {3}
'''
import numpy as np

#y=wx+b
#计算误差函数
def compute_error_for_line_given_points(b, w, points):
    totalError = 0
    for i in range(0, len(points)): #一个代表列索引,一个代表列数据
        x = points[i, 0] #切片
        # print(x)
        y = points[i, 1] #切片
        # print(y)
        totalError += (y - (w * x + b)) ** 2
        # print(totalError)
    return totalError / float(len(points))

def step_gradient(b_current, w_current, points, learningRate):
    b_gradient = 0
    w_gradient = 0
    N = float(len(points)) #100
    for i in range(0, len(points)):
        x = points[i, 0]
        print("x:%d" % i)
        print(x)
        y = points[i, 1]
        print("y:%d" % i)
        print(y)
        b_gradient += -(2/N) * (y - ((w_current * x) + b_current))
        w_gradient += -(2/N) * x * (y - ((w_current * x) + b_current))
        print("b:%d"%i)
        print(b_gradient)
        print("w:%d"%i)
        print(w_gradient)
    new_b = b_current - (learningRate * b_gradient)
    new_m = w_current - (learningRate * w_gradient)
    return [new_b, new_m]

#梯度下降
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m
    for i in range(num_iterations):
        b, m = step_gradient(b, m, np.array(points), learning_rate) #更新b,w值,反复循环num_iterationsc次.
    return [b, m]

def run():
    points = np.genfromtxt("data.csv",delimiter=",") #将数据读取成列表形式
    # print(points)
    learning_rate = 0.0001
    initial_b = 0 # initial y-intercept guess
    initial_m = 0 # initial slope guess
    num_iterations = 1000 #迭代次数为1000
    #format:基本语法是通过 {} 和 : 来代替以前的 %
    print("Starting gradient descent at b = {0}, m = {1}, error = {2}"
          .format(initial_b, initial_m,
                  compute_error_for_line_given_points(initial_b, initial_m, points))
          )
    print("Running...")
    #将b,w更新为对函数最优的值,使用的方法叫做梯度下降法.
    [b,m] = gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)  #(100,2),0,0,0.0001,1000
    print("After {0} iterations b = {1}, m = {2}, error = {3}".
          format(num_iterations, b, m,
                 compute_error_for_line_given_points(b, m, points))
          )
if __name__ == '__main__':
    run()

程序运行后的值,通过两次运行结果的error值,可以看出训练批次1000和10000差别不大:

批次为1000时训练后面的结果:

After 1000 iterations b = 0.08893651993741346, m = 1.4777440851894448, error = 112.61481011613473

批次为10000时训练后面的结果:

After 10000 iterations b = 0.6078985997054931, m = 1.4675440436333027, error = 112.31533427075733

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值