AI实战:从入门到精通系列——用感知器实现情感分类(一)

AI实战:从入门到精通系列——用感知器实现情感分类(一)
AI实战:从入门到精通系列——用感知器实现情感分类(二)



前言

人工智能的第一次高潮始于上世纪50年代。在算法方面,感知器数学模型被提出用于模拟人的神经元反应过程,并能够使用梯度下降法从训练样本中自动学习,完成分类任务。

在这里插入图片描述

感知器

感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题。并且,感知器算法也是非常简单的。

  • 感知器的定义

    感知器示意图:
    在这里插入图片描述

python实现感知器

  • 环境

    • Ubuntu16.04 LTS
    • python 3.x
    • numpy

  • 代码实现
    perception.py

    import numpy as np
    np.random.seed(20190922)
    
    
    class Perceptron(object):
        #感知器
        def __init__(self, input_size, dimension_size, activator):
            '''
            初始化感知器
            '''
            
            self.activator = activator
            
            # 权重向量初始化
            self.weights = np.random.uniform(-0.1, 0.1, (input_size, dimension_size))
            #self.weights = [[0]*dimension_size for i in range(input_size)]
            
            # 偏置项初始化
            self.bias = 0
            
            
        def predict(self, input_vec):
            '''
            输入向量,输出感知器的计算结果
            '''
            # input_vec[x1,x2,x3...], weights[w1,w2,w3,...]   【xi,wi都是dimension_size的向量】
            
            # 计算:wx + b
            sum_res = self.bias
            for i in range(len(input_vec)):
                sum_res += np.dot(input_vec[i], np.array(self.weights[i]).T)
                
            return self.activator(sum_res)
            
              
        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):
            '''
            一次迭代,把所有的训练数据过一遍
            '''
            
            for (input_vec, label) in zip(input_vecs, labels):
                # 计算感知器在当前权重下的输出
                output = self.predict(input_vec)
                
                # 更新权重
                self._update_weights(input_vec, output, label, rate)
                
                
        def _update_weights(self, input_vec, output, label, rate):
            '''
            按照感知器规则更新权重
            '''
    
            # 利用感知器规则更新权重
            delta = label - output
            for i in range(len(input_vec)):
                self.weights[i] = np.add(self.weights[i], rate * delta * np.array(input_vec[i])).tolist()
    
            # 更新bias
            self.bias += rate * delta
            
            
        def print_weights(self):
            
            print('weights', self.weights)
            print('bias', self.bias)
    
        def test(self, text_list, label_list):
            
            num_true = 0
            for text, label in zip(text_list, label_list):
                y = self.predict(text)
                if y == label:
                    num_true += 1
                
            print('acc:', '%.2f%%' %(num_true*100.0/len(text_list)))
    
  • 测试

    
    def f(x):
        '''
        定义激活函数f
        '''
        return 1 if x > 0 else 0
        
    def get_training_dataset():
        # 构建训练数据
        
        # 输入向量列表
        input_vecs = [[[1,1,1], [1,1,1]], [[0,0,0],[0,0,0]], [[1,1,1],[0,0,0]], [[0,0,0],[1,1,1]]]
        # 对应的标签为
        labels = [1, 0, 0, 0]
        
        return input_vecs, labels    
        
    def train_perceptron():
        '''
        训练感知器
        '''
        # 创建感知器,输入参数个数为2,维度为3,激活函数为f
        p = Perceptron(2, 3, f)
        
        # 训练,迭代100轮, 学习率为0.05
        input_vecs, labels = get_training_dataset()
        p.train(input_vecs, labels, 100, 0.05)
        
        # 打印训练获得的权重
        p.print_weights()
       
        return p
        
        
    if __name__ == '__main__': 
        # 训练感知器
        perception = train_perceptron()
        
        # 测试
        res = perception.predict([[1,0,0], [1,1,1]]) 
        print(‘classification:’, res)
    
    
  • 运行结果

    weights [[ 0.06176186 -0.07123933  0.06545874]
     [ 0.03145416  0.00889981  0.01893322]]
     
    bias -0.1
    
    classification: 1
    

后续

使用微博情感分类数据集训练感知器:AI实战:从入门到精通系列——用感知器实现情感分类(二)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szZack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值