如何用python原生代码实现神经元?
2022-10-28 本文已影响0人
小黄不头秃
如何用python原生代码实现神经元?
(即:解决一元线性回归模型)
问题:让神经元拟合函数 y = x + 1
- 首先,我们需要制作数据集
- 给神经网络出题, 已知:
- 求解w, b
(1)构造数据集
# 构造数据集
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(0,10,0.1) # [0, 0.1, 0.2, 0.3, ..., 9.9]
# 因为现实世界的数据是充满噪声的,我们给数据同时也人工的加入噪声
noise = np.random.normal(0,0.1,100)
# y = x + 1
y = x + 1 + noise
# 画散点图
fig = plt.figure()
plt.scatter(x,y,s=1)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
(2) 根据步骤编码神经元
-
定义function&初始化参数:
f(x) = wx+b, 让w = 0.1, b = 0.1 -
计算 y = f(x):
然后把x
带进去, 计算出y^
-
计算loss损失:
loss = y – y^
-
更新参数w,b:
w = w + η * loss
(η 称之为学习率,可以理解为控制w的更新速度) -
if loss>0.1: return (2)
w = 0.1
b = 0.1
learning_rate = 0.01
flag = True # 用作跳出循环的条件
i = 0 # 画图用
loss_history = [] # 画图用
def functions(x):
return w * x + b
def loss_function(y, y_hat):
return y - y_hat
# 进行神经网络训练
while flag:
for x_i, y_i in zip(x,y):
y_hat = functions(x_i)
loss = loss_function(y_i, y_hat)
w = w + learning_rate * loss
b = b + learning_rate * loss
# 画图用
loss_history.append(loss)
i += 1
if loss < 0.01:
flag = False
break
print("w =",w,"b =",b)
# 画散点图
fig = plt.figure()
plt.plot(np.arange(i),loss_history)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()
(3) 模型预测
我们选取0-49,50个数据进行预测。并将散点图画出来
predct_x = np.arange(0,50)
predct_y = [functions(x_i) for x_i in predct_x]
print(predct_y[1]) # predict = 1 + 1
print(predct_y[2]) # predict = 2 + 1
fig = plt.figure()
plt.scatter(predct_x,predct_y,s=1)
plt.xlabel("x")
plt.ylabel("predict_y")
plt.show()