线性回归,python语法实现
作者:互联网
找了很多资料发现好像大家的线性回归都是用sklearn来实现的,作为一个不会用sklearn的小白,寻找了多篇无果后 决定自己用一些比较基础的模块来实现线性回归的梯度下降算法。
import matplotlib.pyplot as plt
import numpy as np
x_data = np.array([1,2,3,4,5])
y_data = np.array([1,2,3,4,5])
a = 0.163
b = np.random.random()
k = np.random.random()
epochs = 1000
设置最简单的y=x函数来进行拟合,设置学习率为0.163,训练次数1000次。
# 计算代价函数
def compute_error(b, k, x_data, y_data):
total_error = 0
for i in range(0, len(x_data)):
total_error += (y_data[i] - (k * x_data[i] + b)) ** 2
return total_error / len(x_data) / 2.0
def gradient_descent_runner(x_data, y_data, k, b, a, epochs):
m = len(x_data)
for i in range(epochs): # 循环epochs次
new_b = 0 # 初始化截距
new_k = 0 # 初始化斜率
# 计算梯度的总和再求平均
for j in range(0, len(x_data)):
new_b += (1 / m) * (((k * x_data[j]) + b) - y_data[j])
new_k += (1 / m) * x_data[j] * (((k * x_data[j]) + b) - y_data[j])
# 更新b和k
b = b - (a * new_b)
k = k - (a * new_k)
else:
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)))
print("Running...")
b, k = gradient_descent_runner(x_data, y_data, b, k, a, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))
第十次训练:
二十次
三十次
最终运行结果:
接近100%拟合,错误率小于10^-26,基本上可以满足需求了。
标签:epochs,python,random,语法,np,error,线性,new,data 来源: https://blog.csdn.net/m0_52830188/article/details/114038901