人工神经网络
模拟生物神经系统对真实世界物体所作出的交互反应,下图为生物神经元的结构图;
在生物神经网络中每个神经元与其他的神经元连接,树突接收传递过来的信号,细胞核处理电信号并传递到轴突,
如果信号超过一定的阀值则产生兴奋,将信号通过轴突末梢传递到其他神经元。下图则为单个神经元的模型图:
定义阀值函数S(a)={1 a>0; 0 a<=0} 这里的a为传递过来的信号总和;
(以上神经元多个输入信号产生一个输出信号)
单层感知机(常用于二分类问题,神经网络模型的基础)
感知机是基本的处理单元,其输入可能来自于自环境或者是其他的感知机。与每个输入xi相互关联的是一个链接权重
(突触权重)wi,在这里可以简单的理解为阻值(传递的信号可能会产生损失)最简单的情况下输出为各个信号的权重之和。
即:Y=WX,其中W为【w0,w1,...,wd】行向量,X为【1,x1,x2,...,xd】^T 列向量;
核心概念间隔:样本本身与决策边界的距离。
如果分类函数是线性的情况下,任意点x到分隔平面的距离都正比于线性模型在该点上的输出。
(类比点到平面的距离公式即可)
这里的d可正可负,故可以将区域分解成两部分,正区域和负区域。我们只需不断更新参数w最后即可获得一个超平面。
这里可以不考虑||w||对该损失函数的影响,因为每一次截取的平面此值都相同,其不会对损失函数最后的值产生影响。
分别对损失函数L(w,b)对应的参数求偏导数,可得:
由梯度上升算法不断更新错分配的样本参数w,可得:(如果线性可分最后一定会得到一个决策边界)
伪代码表示:(这里的学习步长即为学习率,介于0和1之间)
感知机实战(fight) 所用的数据集与逻辑回归数据集一样,只不过做了简单的处理负样本点0修改为-1
import numpy as np
from matplotlib import pyplot as plt
import random
dataSet=[]
#获取数据集合
with open('DataSet') as f:
for line in f:
line=line.strip('\n').split(' ')
if(line[2]=='0'):
line[2]='-1'
dataSet.append([float(line[0]),float(line[1]),1,int(line[2])])
data=np.array(dataSet)#学习集
alpha=1#学习率
w=np.array([0,0,1])#初始化参数
step=500#学习次数
while step:
index=random.randint(0,len(data)-1)#随机取一个样本
i=data[index]
if(i[3]*(i[:3].dot(w))<=0):#判断是否为错误样本
w=w+alpha*i[3]*i[:3]
step=step-1
#绘制图像
X=np.array([0.1,0.3])
for i in data:
if(i[3]==1):
plt.scatter(i[0],i[1],c='b')
else:
plt.scatter(i[0], i[1],c='r')
plt.plot(X,-1*(w[0]/w[1]*X+w[2]/w[1]),c='black')
plt.show()
运行结果(result)总体来说分类效果还可以,比之前的逻辑回归拟合效果好