import numpy as np
from matplotlib import pyplot as plt
# 创建列表,用于保存采集得到的样本
data = []
for i in range(100):
x = np.random.uniform(-10., 10.) # 随机采样输入x
# 采样高四噪声
eps = np.random.normal(0., 0.01)
y = 1.477 * x + 0.089 + eps
data.append([x, y])
data = np.array(data) # 转为2D Numpy数组
print(data)
x=data[:,0]
print(x)
y=data[:,1]
print(y)
plt.plot(x,y)
plt.show()
M=len(data)
lr = 0.001#学习率
w = 0
b = 0
totalloss = 0
b_grad=0
w_grad=0
iterations=30000#迭代次数
for step in range(iterations):
b_grad = 0
w_grad = 0
totalloss=0
#重点totalloss和b_grad,w_grad一定要清0因为是要从第一个算的数开始累加
for i in range(0,len(data)):
x = data[i, 0]
y = data[i, 1]
b_grad+=(2/M)*((w*x+b)-y)
w_grad+= (2 / M) * ((w * x + b)-y)*x
# print(x,y)
b= b - lr * b_grad
w= w - lr * w_grad
#梯度记得清0很重要
b_grad = 0
w_grad = 0
for i in range(0, len(data)):
x = data[i, 0]
y = data[i, 1]
totalloss += ((w* x + b) - y) ** 2
loss = totalloss / float(len(data))
if step % 50 == 0:
print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
x1=data[:,0]
y1=w*x1+b
plt.plot(x1,y1,'r')
plt.show()
# 10的-4次方