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

猜你喜欢

转载自blog.csdn.net/qq_31244453/article/details/109995475