MLP算法的介绍

一、背景

多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(Artificial Neural Network,ANN),除了输入输出层,它中间可以有多个隐层。最简单的MLP需要有一层隐层,即输入层、隐层和输出层才能称为一个简单的神经网络。通俗而言,神经网络是仿生物神经网络而来的一种技术,通过连接多个特征值,经过线性和非线性的组合,最终达到一个目标,这个目标可以是识别这个图片是不是一只猫,是不是一条狗或者属于哪个分布。

二、感知器

2.1 人工神经元
人工神经元就是使用一个数学函数来对生物的神经元建模。
简单来说,一个人工神经元就是接受一个或者多个输入(训练数据),对它们加和,并产生一个输出。一般来说,这里面的加和指的是加权求和(每个输入乘上权重,并加上一个偏差),然后将加和的输入传递给一个非线性函数(一般称作激活函数或者转移函数)。
2.2 最简单的人工神经元——感知器
感知器是实现人工神经元最简单的方法,它的历史可以追溯到20世纪50年代,在20世纪60年代的时候,首次被实现。
简单来说,感知器就是一个二元分类函数,它将输入映射到一个二元输出,单层感知器
2.3  感知器算法
简化版的感知器算法如下:
① 以一个随机分布初始化权值和偏差(通常比较小);
② 选择一个输入向量,并将其放入神经网络中;
③ 将输入与权重相乘,并加上偏差,计算网络的输出y’;
④ 感知器的函数如下:

 三、神经网络的原理

我们基于生物神经元模型可得到多层感知器MLP的基本结构,最典型的MLP包括包括三层:输入层、隐层和输出层,MLP神经网络不同层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。

对感知机进行数学建模

通常我们把(w,b,统一称为为W权重)

ΣW*X+b(矩阵相乘求和)(Σ求和,W权重,b偏置,x输入)

此可知,神经网络主要有三个基本要素:权重、偏置和激活函数

权重:神经元之间的连接强度由权重表示,权重的大小表示可能性的大小

偏置:偏置的设置是为了正确分类样本,是模型中一个重要的参数,即保证通过输入算出的输出值不能随便激活。

激活函数:起非线性映射的作用。其可将神经元的输出幅度限制在一定范围内,一般限制在(-1~1)或(0~1)之间。最常用的激活函数是Sigmoid函数,其可将(-∞,+∞)的数映射到(0~1)的范围内

四、python代码

class Perceptron(object):
    def __init__(self, input_num, activator):
        '''
        初始化感知器,设置输入参数的个数,以及激活函数。
        激活函数的类型为double -> double
        '''
        self.activator = activator
        # 权重向量初始化为0
        self.weights = [0.0 for _ in range(input_num)]
        # 偏置项初始化为0
        self.bias = 0.0
    def __str__(self):
        '''
        打印学习到的权重、偏置项
        '''
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
    def predict(self, input_vec):
        '''
        输入向量,输出感知器的计算结果
        '''
        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
        # 最后利用reduce求和
        return self.activator(
            reduce(lambda a, b: a + b,
                   map(lambda (x, w): x * w,  
                       zip(input_vec, self.weights))
                , 0.0) + self.bias)
    def train(self, input_vecs, labels, iteration, rate):
        '''
        输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率
        '''
        for i in range(iteration):
            self._one_iteration(input_vecs, labels, rate)
    def _one_iteration(self, input_vecs, labels, rate):
        '''
        一次迭代,把所有的训练数据过一遍
        '''
        # 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]
        # 而每个训练样本是(input_vec, label)
        samples = zip(input_vecs, labels)
        # 对每个样本,按照感知器规则更新权重
        for (input_vec, label) in samples:
            # 计算感知器在当前权重下的输出
            output = self.predict(input_vec)
            # 更新权重
            self._update_weights(input_vec, output, label, rate)
    def _update_weights(self, input_vec, output, label, rate):
        '''
        按照感知器规则更新权重
        '''
        # 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用感知器规则更新权重
        delta = label - output
        self.weights = map(
            lambda (x, w): w + rate * delta * x,
            zip(input_vec, self.weights))
        # 更新bias
        self.bias += rate * delta
def f(x):
    '''
    定义激活函数f
    '''
    return 1 if x > 0 else 0
def get_training_dataset():
    '''
    基于and真值表构建训练数据
    '''
    # 构建训练数据
    # 输入向量列表
    input_vecs = [[1,1], [0,0], [1,0], [0,1]]
    # 期望的输出列表,注意要与输入一一对应
    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0
    labels = [1, 0, 0, 0]
    return input_vecs, labels    
def train_and_perceptron():
    '''
    使用and真值表训练感知器
    '''
    # 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f
    p = Perceptron(2, f)
    # 训练,迭代10轮, 学习速率为0.1
    input_vecs, labels = get_training_dataset()
    p.train(input_vecs, labels, 10, 0.1)
    #返回训练好的感知器
    return p
if __name__ == '__main__': 
    # 训练and感知器
    and_perception = train_and_perceptron()
    # 打印训练获得的权重
    print and_perception
    # 测试
    print '1 and 1 = %d' % and_perception.predict([1, 1])
    print '0 and 0 = %d' % and_perception.predict([0, 0])
    print '1 and 0 = %d' % and_perception.predict([1, 0])
    print '0 and 1 = %d' % and_perception.predict([0, 1])

五、总结

多层感知机:MLP分类器会有一个好的识别率且分类速度更快。但是其训练没有SVM分类快,尤其对于巨大量的训练集。

参考:

TensorFlow - 什么是感知器(Perceptron)_西西弗Sisyphus的博客-CSDN博客

神经网络1:多层感知器-MLP - 知乎

https://www.cnblogs.com/jokerjason/p/7132837.html

MLP算法(多层感知机)是一种基于人工神经网络的监督学习算法,常用于解决分类和回归问题。Python和TensorFlow是两个常用的工具,可以用来实现MLP算法。 在Python中,可以使用一些开源库如NumPy和Scikit-learn来处理数据和构建MLP模型。首先,需要导入这些库并加载数据集。接着,可以按需进行数据预处理,如标准化、归一化等。然后,可以用Scikit-learn的MLPClassifier类或MLPRegressor类来创建并训练MLP模型。在训练过程中,可以调整模型的超参数,如隐藏层的数量和大小,学习率,正则化参数等,以提高模型的性能。最后,可以使用训练好的模型来进行预测,并评估模型的准确率或均方误差等指标。 TensorFlow是一个开源的深度学习库,可以用于构建和训练MLP模型。在TensorFlow中,可以使用tf.keras API来创建和训练MLP神经网络模型。首先,需要导入TensorFlow库并加载数据集。然后,可以使用tf.keras.Sequential类来定义模型的结构,如输入层、隐藏层和输出层的神经元数量等。接着,可以通过调用compile方法来配置模型的损失函数、优化器和评估指标。在训练过程中,可以使用fit方法来迭代地训练模型,并在每个epoch中计算训练误差和验证误差。最后,可以使用训练好的模型进行预测,并评估模型的准确率或均方误差等指标。 总结来说,MLP算法可以使用Python和TensorFlow来实现。Python提供了丰富的库和工具来处理数据和构建模型,并通过Scikit-learn库提供了便捷的API来实现MLP算法。而TensorFlow是一种强大的深度学习库,可以用于高效地构建、训练和评估MLP模型。通过选择合适的库和工具,可以更加方便地实现MLP算法,并应用于各种分类和回归问题中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值