
python 初探神经网络(一元一次函数)学习笔记
豆豆实验
有个小蓝的生物,想吃豆豆,豆豆越大豆豆的毒性就越大,豆豆越小豆豆的毒性就越小。
那么小蓝就需要进行一定的思考才可以辨别它所吃的豆豆毒性有多大。
所以一元一次方程在这里就起到了作用,公式为:y=wx。
y为毒性
x为豆豆的大小
w为斜率也是权重。可通过调整不同的权重来意识到豆豆的具体毒性有多大。
这就是McCulloch-Pitts模型的由来。
McCulloch-Pitts模型
这个模型是对生物神经元一种简化的模仿。
左边的是树突,右边的轴突。
输入信号是通过树突输入(自变量),然后通过轴突输出结果(因变量)。
树突一般有很多个,只有一个就是一元一次函数。(y=wx)
如果是两个就是二元函数,举例:豆豆的毒性和颜色也有关系(y = w1x1 + w2x2)。三个就是三元。。。
w就是控制着不同输入对输出的影响。也叫权值。
到后面还会加上激活函数。(也就是b,来激活神经元的输出)
但问题是w的值设置为多少才算合适?刚好符合判断。
举例:w=0.1时,判断0.59大小的豆豆,以为是0.059的毒性,其实是0.68的毒性。
那么它的神经网络就很草率我们可以将它的w设置得大一点,但是需要手动调w很不方便。
到后面Rosenblatt感知器的诞生可以让机器自动调整w权重。
Rosenblatt感知器
简单来讲就是xw设置一个初始值,然后算出的毒性y与实际的毒性相减,得出的误差与w相加得出新的w权重。
但是在相加时还需要乘以一个x,为什么呢?
因为这涉及当输入的数据为负数的时候,与实际值有偏差,乘以x后反而会决定它的数据是正的还是负的。
除此之外还要涉及乘以alpha(也被称为学习率),这是因为不加alpha每次调整都是整数,永远达不到最好的点。所以通过alpha来调整每次调整多少(举例每次调整20%也就是x0.2)
当然alpha设置得越小,就越慢。
完整的过程如下图所示:
编程实验
首先我们输出散点图。
import dataset
from matplotlib import pyplot as plt
# 随机获取豆豆点
xs,ys = dataset.get_beans(100)
# 输出x大小
print(xs)
# 输出y的毒性
print(ys)
# 配置图像
plt.title("Chi Dou Dou",fontsize=20)# 设置图像名称
plt.xlabel("Size")# 设置横坐标名称
plt.ylabel("Toxicity")# 设置纵坐标名称
# 把值附到图上
plt.scatter(xs,ys)
# 显示散点图
plt.show()
import dataset
from matplotlib import pyplot as plt
xs,ys = dataset.get_beans(100)
print(xs)
print(ys)
# 配置图像
plt.title("Chi Dou Dou",fontsize=12)# 设置图像名称
plt.xlabel("Size")# 设置横坐标名称
plt.ylabel("Toxicity")# 设置纵坐标名称
# 把值负到图上
plt.scatter(xs,ys)
# 初始化设置w为0.5权重
w = 0.5
# alpha 每次调整的幅度为5%
alpha = 0.05
# 训练1000次
for j in range(100):
for i in range(100):
# 每次的大小
x = xs[i]
# 每次的毒性
y = ys[i]
# 计算答案
y_pre = w * x
# 计算实际误差
e = y - y_pre
# 与实际误差想加得到新的w权重
w = w + alpha * e * x
# 这个值是训练后的数组
y_pre = w * xs
# 画线
plt.plot(xs,y_pre)
# 显示散点图
plt.show()
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

