梯度下降法 -- 一元线性回归

demo.py

import numpy as np

import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt('data.csv',delimiter=',')
x_data = data[:,0] # 读取全部数据的第0列 ,也就是第一维数据
y_data = data[:,1] # 读取全部数据的第1列 ,也就是第二维数据
plt.scatter(x_data,y_data)
plt.show()

 

代价函数的公式: J(\Theta 0 , \Theta 1) = 1/2m \sum m i = 1 (h\Theta (X^{i}) - Y^{i})^{2}  m是在求和上面的,也就是样本数,i = 1在下面

梯度下降法 -- 一元线性回归_第1张图片

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

# 最小二乘法 也就是计算代价函数的值 
def compu_error(b,k,x_data ,y_data)
    totalError = 0
    
    for i in range(0,len(x_data)):
        # (k * x_data[i] +b )为预测值
        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(0,len(x_data)):
        b_grad = 0
        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)
        # 每迭代5次 ,输出图像
        if i % 5 == 0 :
            plt.plot(x_data,y_data , 'b')
            plt.plot(x_data , k*x_data + b ,'r')
            plt.show()
    return b,k
print('starting b = {0} , k = {1} ,error = {2}'.format(b,k,compute_error(b,k,x_data , y_data)))

b, k = gradient_descent_runner(x_data , y_data , b, k , lr ,epochs)

print('After {0} interations 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')
plt.plot(x_data,k*x_data + b,'r')
plt.show()

 

 

 

 

 

 

 

 

 

 

 

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