# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline
# 1.读入数据
data = np.genfromtxt('一元线性回归.csv', delimiter=',')
x_data = data[:, 0] # 1维
y_data = data[:, 1] # 1维
plt.scatter(x_data, y_data)
# 2.用梯度下降法调整参数
k = 0 # 先随便设置一个k
b = 0 # 先随便设置一个b
learing_rate = 0.0001 # 学习率
epoches = 30 # 循环30次
m = len(x_data) # 一共100条数据
# 不断的调用k和b
for i in range(epoches):
# for j in range(m):
k_grad = (k * x_data + b - y_data) * x_data
b_grad = k * x_data + b - y_data
k_grad = (-1 / m) * sum(k_grad)
b_grad = (-1 / m) * sum(b_grad)
k = k + learing_rate * k_grad
b = b + learing_rate * b_grad
print('最终结果:k={}, b={}'.format(k, b))
plt.scatter(x_data, y_data)
plt.plot(x_data, x_data * k + b, 'r')
# 改进1
k = 0 # 先随便设置一个k
b = 0 # 先随便设置一个b
learing_rate = 0.0001 # 学习率
epoches = 30 # 循环30次
m = len(x_data) # 一共100条数据
def loss_function(k, b):
total_error = (k * x_data + b - y_data) ** 2
total_error = sum(total_error)
return total_error / (2 * m)
# 不断的调用k和b
for i in range(1, epoches + 1):
k_grad = (k * x_data + b - y_data) * x_data
b_grad = k * x_data + b - y_data
k_grad = (-1 / m) * sum(k_grad)
b_grad = (-1 / m) * sum(b_grad)
k = k + learing_rate * k_grad
b = b + learing_rate * b_grad
# 每循环5次,输出此时k, b和损失函数
if i % 3 == 0:
print('epoch{}:k={},b={},loss function={}'.format(i, k, b, loss_function(k, b)))
plt.scatter(x_data, y_data)
plt.plot(x_data, x_data * k + b, 'r')
plt.show()
print('最终结果:k={}, b={}'.format(k, b))
plt.scatter(x_data, y_data)
plt.plot(x_data, x_data * k + b, 'r')
plt.show()