机器学习算法基础——梯度下降法求一元线性回归

import numpy as np
import matplotlib.pyplot as plt

# 载入数据
data = np.genfromtxt("C:\\ML\\chapter-1\\data.csv",delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()

# 学习率 learning rate
lr = 0.0001
# 截距
b = 0
# 斜率
k = 0
# 最大迭代次数
epochs = 50

# 最小二乘法
def compute_error(b,k,x_data,y_data):
    totalError = 0
    for i in range(0,len(x_data)):
        totalError += (y_data[i] - (k*x_data[i]) + b) ** 2 #计算总的误差
    return totalError / float(len(x_data)) / 2.0

def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
    # 计算总数据量
    m = float(len(x_data))
    # 循环epochs次
    for i in range(epochs):
        b_grad = 0  # grad 梯度 求导
        k_grad = 0
        # 计算梯度的总和再求平均
        for j in range(0,len(x_data)):
            b_grad += -(1/m) * (y_data[j] - (k*x_data[j]) + b)
            k_grad += -(1/m) * x_data[j] * (y_data[j] - ((k*x_data[j]) + b))
        # 更新b和k
        b = b - (lr * b_grad)
        k = k - (lr * k_grad)
        # 每迭代五次,输出一次图像
        if i % 5 == 0:
            print("esochs:",i)
            plt.plot(x_data,y_data,'b.')
            plt.plot(x_data,k*x_data + b,"r")
            plt.show()
    return b,k    

print('Staring b = {0},k = {1},error = {2}'.format(b,k,compute_error(b,k,x_data,y_data)))
print('Running...')
b,k = gradient_descent_runner(x_data,y_data,b,k,lr,epochs) # 开始建模
print('After {0} iterations b = {1},k= {2},error = {3}'.format(epochs,b,k,compute_error(b,k,x_data,y_data)))

# 画图
# plt.plot(x_data,y_data,'b.') # b代表blue .表示用.画出来
# plt.plot(x_data,k*x_data + b, 'r') # 画线,r代表red
# plt.show()

数据的散点图
机器学习算法基础——梯度下降法求一元线性回归_第1张图片
根据梯度下降法求得线性回归的过程
机器学习算法基础——梯度下降法求一元线性回归_第2张图片

你可能感兴趣的:(机器学习算法基础)