AI实战:从入门到精通系列——用感知器实现情感分类(一)
AI实战:从入门到精通系列——用感知器实现情感分类(二)
前言
人工智能的第一次高潮始于上世纪50年代。在算法方面,感知器数学模型被提出用于模拟人的神经元反应过程,并能够使用梯度下降法从训练样本中自动学习,完成分类任务。
感知器
感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题。并且,感知器算法也是非常简单的。
-
感知器的定义
感知器示意图:
python实现感知器
-
环境
- Ubuntu16.04 LTS
- python 3.x
- numpy
-
代码实现
perception.pyimport 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实战:从入门到精通系列——用感知器实现情感分类(二)