机器学习(感知机)

人工神经网络

模拟生物神经系统对真实世界物体所作出的交互反应,下图为生物神经元的结构图;

在生物神经网络中每个神经元与其他的神经元连接,树突接收传递过来的信号,细胞核处理电信号并传递到轴突,

如果信号超过一定的阀值则产生兴奋,将信号通过轴突末梢传递到其他神经元。下图则为单个神经元的模型图:

定义阀值函数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)总体来说分类效果还可以,比之前的逻辑回归拟合效果好

发布了79 篇原创文章 · 获赞 81 · 访问量 5709

猜你喜欢

转载自blog.csdn.net/weixin_44638960/article/details/104245541