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()
代价函数的公式: m是在求和上面的,也就是样本数,i = 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()