使用BP神经网络实现二分类

upload successful

神经网络类型:BP(back propagation)神经网络
隐藏层:1(含神经元:3,偏置项独立,梯度下降关闭)
激活函数:sigmoid函数
正则化:无
迭代次数:1000
数据集:内外两包含一定厚度的以10为边界的1/4圆
噪点:30个,两边各15个
编程语言:Python

没想到吧,我又回来了!这两周光准备期中考试了,都没有时间来学习课外知识,但想到不发博客对不起自己的良心,还是拿之前做过的染色分类器水水文章。

对了,在文章开始前我想介绍一位朋友,这位不愿透露性别的朋友要我帮忙宣传ta的博客,于是你可以看见如下链接:
Desc_End的博客
好了,广告时间结束,进入正题!
在本文开始之前,你需要了解:
一、线性代数基础
二、Python基础(含numpy、matplotlib.pyplot、random库)
三、高等数学基础(主要含链式求导法则)
四、线性回归基础
五、深度学习基础(BP神经网络原理)
是不是感觉似曾相识
OK,Here we go!
一、线性激活函数与sigmoid函数
上文中用到了y=x这一激活函数,输出成为了拟合的数值点,在这里,我们使用了sigmoid函数,将输出变成了“概率”,当然它不是真正意义上的概率[1]。在程序中,我使用了定义:

1
2
3
def sigmoid(t):
x = 1.0/(1+np.exp(-t))
return x

需要注意的坑是,这里的t为向量,而且exp函数只能调用np库中的exp,使用math库会报错,在附录中,你[可以]下载到程序,我将代码做了一个伪UI界面,你可以愉快调参,输出各种不同的结果。
笔者玩得不亦乐乎,它每次迭代的过程都不同( •̀ ω •́ )y
二、数据集设定
我采用的是内外圆设定,x0、x1构成横轴与纵轴,y用于标记数据,大概就是这样(?):

upload successful

这里的数据域是离散的点,在效果图(见第一幅图)中,我在正类与负类中均选取了100个点。

我同时设置了
三、正向传播
和之前一样,我采用了一层神经网络,这里不再赘述,只是将输出的神经元用sigmoid处理,调整阈值为0.5(和逻辑回归很像),单层神经网络节点模型如下:

upload successful

多个节点就组成了神经网络:

upload successful

最后得到的是0-1之间的数,大于等于0.5就是正类,小于0.5就是负类。
四、反向传播
没啥好说的,之前写过了,这里提醒两点:
1、由于使用了sigmoid函数,导致求导后变成了z(1-z)这种形式(详见吴恩达);
2、建议关闭对于偏置项的梯度下降,这样能防止过拟合(挂一个过拟合图像):

upload successful

虽然是100%正确率,但是完全没有价值(除了好看)

五、测试新数据
学习完后我们需要看看效果如何,于是我引入了新数据测试点,在标题界面展示所属点的类型(红点/蓝点),结果还是很精确的(BP神经网络如此强大!)
六、结尾
是的,本文就是把很久以前的代码翻出来然后恬不知耻地水了篇博客本文对最简单的BP染色分类器做了实现,不算太好,但起码能看。最后安利一波VsCode,打开速度比pycharm好很多,还有很多非常舒服的功能,感谢泡哥!
七、附录
1、参考文献
[1]sigmoid输出的是什么
2、下载项
[1]BP染色分类器

下一个模型是什么呢?