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()
数据的散点图
根据梯度下降法求得线性回归的过程