BP神经网络判定笑傲江湖人物门派

沧海一声笑

滔滔两岸潮

浮沉随浪只记今朝

苍天笑

纷纷世上潮

谁负谁胜出天知晓

江山笑

烟雨遥

涛浪淘尽红尘俗事知多少

啦......

朋友圈的热点纷纷扰扰,转眼间满屏都是向Andrew Ng(吴恩达)同志学习,占领机器学习阵地的帖子。翻看一下Coursera的课程目录,默默从积灰的书堆底下翻出十多年前的《人工神经网络》教材,过上一把怀旧瘾。

金庸大侠笔下《笑傲江湖》一书中,既有正邪之判,复存门户之别,少林、武当、青城、五岳自诩正教与魔教(日月神教)誓不两立,出场人物的权谋武功高下各有不同。加之华山派气宗剑宗分野,嵩山派耗时数年搜集整理各派剑法遗存,葵花宝典化身辟邪剑法重现江湖……无疑加深了识别人物门派的难度,本文尝试BP神经网络算法(误差反向传播,Error Back Propagation)予以求解。

训练数据


bp1.JPG

输出结果

构造一个BP神经网络,根据人物的权谋、内功、剑法、轻功特征判断是否出自华山派。

l 神经元模型

​神经网络中最基本的成分是神经元模型。取一组二进制输入值(附近的神经元),将每个输入值乘以一个连续值权重(每个附近神经元的突触强度),并设立一个阈值,如果这些加权输入值的和超过这个阈值,就输出1,否则输出0(同理于神经元是否放电)。


bp2.jpg

l BP算法的基本思想

通过计算输出结果和期望输出的误差来间接调整隐含层的权值,学习过程由信号的正向传播与误差的反向传播两个过程组成。

  • 正向传播时,输入样本从输入层传入,经各隐含层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传播阶段。

  • 反向传播时,将输出以某种形式通过隐含层向输入层逐层反传,并将误差分摊给各层的所有单元,作为修正各单元权值的依据。


    bp3.png

Python代码解析

l 正向传播(1~5步)

  1. 设定输入数组X 和输出数组Y

  2. 初始化连接权值和阈值

wh 隐含层权值
bh 隐含层阈值
wout 输出层权值
bout 输出层阈值

  1. 计算输入数组与隐含层权值的点积,加上阈值(线性变换)
hidden_layer_input= matrix_dot_product(X,wh) + bh
  1. 采用Sigmoid激活函数进行非线性变换f(x)=1/(1 + exp(-x)).
hiddenlayer_activations = sigmoid(hidden_layer_input)
  1. 对隐含层激活函数的结果进行线性变换,求出与输出层权值的点积,再加上输出层阈值。通过Sigmoid函数预测输出值。
output_layer_input = matrix_dot_product (hiddenlayer_activations * wout ) + bout

output = sigmoid(output_layer_input)

l 反向传播(6~12步)

  1. 将预测结果与实际结果进行比较,其中误差损失函数表示为 ((Y-t)^2)/2
E = y – output
  1. 计算隐含层与输出层神经元的梯度
slope_output_layer = derivatives_sigmoid(output)

slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
  1. 将误差乘以输出层的梯度,得出输出层的调整因子
d_output = E * slope_output_layer
  1. 将误差反向传播到隐含层,计算输出层调整因子与隐含层至输出层连接权值的点积。
Error_at_hidden_layer = matrix_dot_product(d_output, wout.Transpose)
  1. 继续计算隐含层的调整因子,求出隐含层误差与隐含层梯度的点积。
d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
  1. 借助前几步得出的调整因子,更新隐含层与输出层连接的权值
wout = wout + matrix_dot_product(hiddenlayer_activations.Transpose, d_output)*learning_rate

wh = wh + matrix_dot_product(X.Transpose,d_hiddenlayer)*learning_rate
  1. 最后更新隐含层和输出层的阈值
bias at output_layer =bias at output_layer + sum of delta of output_layer at row-wise * learning_rate

bias at hidden_layer =bias at hidden_layer + sum of delta of output_layer at row-wise * learning_rate  

bh = bh + sum(d_hiddenlayer, axis=0) * learning_rate

bout = bout + sum(d_output, axis=0)*learning_rate

Python源代码

# -*- coding: utf-8 -*-

"""

Created on Sun Feb 11 22:42:30 2018

@author: vincentqiao

"""

import numpy as np

#Input array

X=np.array([[1,1,1,1],[1,1,1,0],[0,1,1,0],[1,0,1,1]])

#Output

y=np.array([[0],[1],[1],[0]])

#Sigmoid Function

def sigmoid (x):

 return 1/(1 + np.exp(-x))

#Derivative of Sigmoid Function

def derivatives_sigmoid(x):

 return x * (1 - x)

#Variable initialization

epoch=5000 #Setting training iterations

lr=0.1 #Setting learning rate

inputlayer_neurons = X.shape[1] #number of features in data set

hiddenlayer_neurons = 3 #number of hidden layers neurons

output_neurons = 1 #number of neurons at output layer

#weight and bias initialization

wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))

bh=np.random.uniform(size=(1,hiddenlayer_neurons))

wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))

bout=np.random.uniform(size=(1,output_neurons))

for i in range(epoch):

 #Forward Propogation

 hidden_layer_input1=np.dot(X,wh)

 hidden_layer_input=hidden_layer_input1 + bh

 hiddenlayer_activations = sigmoid(hidden_layer_input)

 output_layer_input1=np.dot(hiddenlayer_activations,wout)

 output_layer_input= output_layer_input1+ bout

 output = sigmoid(output_layer_input)

 #Backpropagation

 E = y-output

 slope_output_layer = derivatives_sigmoid(output)

 slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)

 d_output = E * slope_output_layer

 Error_at_hidden_layer = d_output.dot(wout.T)

 d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer

 wout += hiddenlayer_activations.T.dot(d_output) *lr

 bout += np.sum(d_output, axis=0,keepdims=True) *lr

 wh += X.T.dot(d_hiddenlayer) *lr

 bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr

print (output)

输出结果

[[ 0.03964938]

 [ 0.96135949]

 [ 0.98159661]

 [ 0.01767599]]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容