一元一次函数感知器
引入
假设海底生物“小蓝”依赖吃“豆豆”存活,而豆豆越大毒性越高。小蓝可以感知到豆豆的大小,它该如何判断豆豆是否能k吃?
如何去描述认知?函数
豆豆的大小x,毒性y,y=wx;
但是小蓝不能通过这个函数活下去,因为随着w的取值不同,函数会产生很多错误。参数w设置为多少小蓝才能够进行很好的预测呢
也就是要让神经元有自己调整w的能力。
Rossenblatt感知器
核心:通过误差修正参数
输入经过函数产生结果,用标准答案减去结果就得到了误差e,要根据e来调整参数。
如:w+=e;这样当结果过小时e为正,w增加;过大时e为负,w减小
但是当x为负时就不能是简单的w=w+e了,因为当结果过小时e为正,但w需要向小调整。所以令w=w+e*x,这样就解决了e的符号问题。
但是,如果调整的幅度过大,可能会出现w过小时增大然后过大了,过小时减小又过小了,最后搁那反复横跳。
给修正项添加系数a,当a为0.05时每次修正幅度会变慢20倍。
可以证明w最后一定会收敛。
编程实验
-
导入事先写好的数据集dataset类,调用get_beans函数生成豆豆的x,y的值
import dataset xs, ys = dataset.get_beans(5) print(xs) print(ys)
生成了豆豆的大小以及对应的毒性
-
利用python自带的matplotlib绘制直观的图
从matplotlib中导包pyplot并取名为plt
from matplotlib import pyplot as plt
设置图像信息
# 配置图像 plt.title("Size-Toxicity Function", fontsize=12) # 名字 plt.xlabel("Bean Size") # 横坐标名字 plt.ylabel("Toxicity") # 纵坐标名字 plt.show() # 显示图像
绘制散点图
plt.scatter(xs, ys)
多生成一些豆豆
xs, ys = dataset.get_beans(100)
非常的直观
绘制预测函数
w = 0.5
y_pre = w * xs
plt.plot(xs, y_pre)
当然这里的斜率是固定的
实现rosenblatt感知器
- 输入x,求出y
- 求出误差e
- w=w+a*e*x
for m in range(100): # 调整100次
for i in range(100):
x = xs[i]
y = ys[i]
y_pre = w * x
e = y - y_pre
alpha = 0.05
w = w + alpha * e * x
拟合的非常好
总结
核心:参数的自适应