本文是 2020人工神经网络第一次作业 的参考答案第二部分

02 第二题答案参考


1.问题描述

原题要求设计一个神经网络对于下面图中的3类模式进行分类。期望输出分别使用:
(1,−1,−1)T,(−1,1,−1)T,(−1,−1,1)T\left( {1, - 1, - 1} \right)^T ,\left( { - 1,1, - 1} \right)^T ,\left( { - 1, - 1,1} \right)^T(1,−1,−1)T,(−1,1,−1)T,(−1,−1,1)T
来表示。

▲ 三类样本在坐标系中的分布

2.求解分析

根据题目给定的三类样本处于坐标系的位置,可以知道它们各自的数据如下表所示:

样本 x1 x2 种类 期望输出
1 0.25 0.25 1 (1,-1,-1)
2 0.75 0.125 1 (1,-1,-1)
3 0.25 0.75 1 (1,-1,-1)
4 0.5 0.125 2 (-1,1,-1)
5 0.75 0.25 2 (-1,1,-1)
6 0.25 0.75 2 (-1,1,-1)
7 0.25 0.5 3 (-1,-1,1)
8 0.5 0.5 3 (-1,-1,1)
9 0.75 0.75 3 (-1,-1,1)

显然,这三类是线性不可分的。所以采用带有隐层的BF网络、或者RBF网络完成类别的求解。

3.问题求解

(1) 设计BP网络进行分类

参考在 第一道题的参考答案 中给出的BP网络程序,建立不同中间隐层结构的BP网络来进行分类。

  • 网络模型1:
    设置网络模型构造如下:取中间隐层为5个。隐层神经元的传递函数为sigmoid函数,输出神经元的传递函数在线性函数。

▲ 网络模型

学习速率η=0.5\eta = 0.5η=0.5,使用最基本的BP算法训练上述模型。输出误差下降曲线为:

▲ 网络训练误差下降曲线

最终,在就个样本中,始终存在;一个误差样本,无法消除。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW12BP.PY                    -- by Dr. ZhuoQing 2020-11-17
#
# Note:
#============================================================from headm import *#------------------------------------------------------------
# Samples data constructionx_data = array([[0.25, 0.25],[0.75, 0.125],[0.25, 0.75],[0.5, 0.125], [0.75, 0.25], [0.25, 0.75],[0.25, 0.5], [0.5, 0.5], [0.75, 0.5]])
y_data = array([[1,-1,-1],[1,-1,-1],[1,-1,-1],[-1,1,-1],[-1,1,-1],[-1,1,-1],[-1,-1,1],[-1,-1,1],[-1,-1,1]]).T#------------------------------------------------------------
def shuffledata(X, Y):id = list(range(X.shape[0]))random.shuffle(id)return X[id], (Y.T[id]).T#------------------------------------------------------------
# Define and initialization NN
def initialize_parameters(n_x, n_h, n_y):random.seed(2)W1 = random.randn(n_h, n_x) * 0.5          # dot(W1,X.T)W2 = random.randn(n_y, n_h) * 0.5          # dot(W2,Z1)b1 = zeros((n_h, 1))                       # Column vectorb2 = zeros((n_y, 1))                       # Column vectorparameters = {'W1':W1,'b1':b1,'W2':W2,'b2':b2}return parameters#------------------------------------------------------------
# Forward propagattion
# X:row->sample;
# Z2:col->sample
def forward_propagate(X, parameters):W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']Z1 = dot(W1, X.T) + b1                    # X:row-->sample; Z1:col-->sampleA1 = 1/(1+exp(-Z1))Z2 = dot(W2, A1) + b2                     # Z2:col-->sample
#    A2 = 1/(1+exp(-Z2))                       # A:col-->sampleA2 = Z2                                   # Linear outputcache = {'Z1':Z1,'A1':A1,'Z2':Z2,'A2':A2}return Z2, cache#------------------------------------------------------------
# Calculate the cost
# A2,Y: col->sample
def calculate_cost(A2, Y, parameters):err = [x1-x2 for x1,x2 in zip(A2.T, Y.T)]cost = [dot(e,e) for e in err]return mean(cost)#------------------------------------------------------------
# Backward propagattion
def backward_propagate(parameters, cache, X, Y):m = X.shape[0]                  # Number of the samplesW1 = parameters['W1']W2 = parameters['W2']A1 = cache['A1']A2 = cache['A2']dZ2 = (A2 - Y) #* (A2 * (1-A2))dW2 = dot(dZ2, A1.T) / mdb2 = sum(dZ2, axis=1, keepdims=True) / mdZ1 = dot(W2.T, dZ2) * (A1 * (1-A1))dW1 = dot(dZ1, X) / mdb1 = sum(dZ1, axis=1, keepdims=True) / mgrads = {'dW1':dW1,'db1':db1,'dW2':dW2,'db2':db2}return grads#------------------------------------------------------------
# Update the parameters
def update_parameters(parameters, grads, learning_rate):W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']dW1 = grads['dW1']db1 = grads['db1']dW2 = grads['dW2']db2 = grads['db2']W1 = W1 - learning_rate * dW1W2 = W2 - learning_rate * dW2b1 = b1 - learning_rate * db1b2 = b2 - learning_rate * db2parameters = {'W1':W1,'b1':b1,'W2':W2,'b2':b2}return parameters#------------------------------------------------------------
# Define the training
DISP_STEP           = 500def train(X, Y, num_iterations, learning_rate, print_cost=False):
#    random.seed(3)n_x = 2n_y = 3n_h = 5lr = learning_rateparameters = initialize_parameters(n_x, n_h, n_y)XX,YY = shuffledata(X, Y)costdim = []for i in range(0, num_iterations):A2, cache = forward_propagate(XX, parameters)cost = calculate_cost(A2, YY, parameters)grads = backward_propagate(parameters, cache, XX, YY)parameters = update_parameters(parameters, grads, lr)if print_cost and i % DISP_STEP == 0:printf('Cost after iteration:%i: %f'%(i, cost))costdim.append(cost)if cost < 0.1:breakreturn parameters, costdim#------------------------------------------------------------
parameter,costdim = train(x_data, y_data, 10000, 0.5, True)A2, cache = forward_propagate(x_data, parameter)
#printf(A2, y_data)A22 = array([[1 if e >= 0 else -1 for e in l] for l in A2])
res = [1 if any(x1!=x2) else 0 for x1,x2 in zip(A22.T, y_data.T)]
printf(res, sum(res))#------------------------------------------------------------plt.plot(arange(len(costdim))*DISP_STEP, costdim)
plt.xlabel("Step(10)")
plt.ylabel("Cost")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
#        END OF FILE : HW12BP.PY
#============================================================
  • 网络模型2:

构造神经网络模型如下图所示:中间两个隐层的神经元个数为5,传递函数为sigmoid函数。输出层的传递函数为线性函数。

▲ 网络模型

▲ 网络误差下降曲线

最速仍然存在一个样本的误差。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW12BP2.PY                    -- by Dr. ZhuoQing 2020-11-17
#
# Note:
#============================================================from headm import *#------------------------------------------------------------
# Samples data constructionx_data = array([[0.25, 0.25],[0.75, 0.125],[0.25, 0.75],[0.5, 0.125], [0.75, 0.25], [0.25, 0.75],[0.25, 0.5], [0.5, 0.5], [0.75, 0.5]])
y_data = array([[1,-1,-1],[1,-1,-1],[1,-1,-1],[-1,1,-1],[-1,1,-1],[-1,1,-1],[-1,-1,1],[-1,-1,1],[-1,-1,1]]).T#------------------------------------------------------------
def shuffledata(X, Y):id = list(range(X.shape[0]))random.shuffle(id)return X[id], (Y.T[id]).T#------------------------------------------------------------
# Define and initialization NN
def initialize_parameters(n_x, n_h, n_h1, n_y):random.seed(int(time.time()))W1 = random.randn(n_h, n_x) * 0.5          # dot(W1,X.T)W2 = random.randn(n_h1, n_h) * 0.5         # dot(W2,Z1)W3 = random.randn(n_y, n_h1) * 0.5         # dot(W2,Z1)b1 = zeros((n_h, 1))                       # Column vectorb2 = zeros((n_h1, 1))                      # Column vectorb3 = zeros((n_y, 1))                       # Column vectorparameters = {'W1':W1,'b1':b1,'W2':W2,'b2':b2,'W3':W3,'b3':b3}return parameters#------------------------------------------------------------
# Forward propagattion
def forward_propagate(X, parameters):W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']W3 = parameters['W3']b3 = parameters['b3']Z1 = dot(W1, X.T) + b1                    # X:row-->sample; Z1:col-->sampleA1 = 1/(1+exp(-Z1))Z2 = dot(W2, A1) + b2                     # Z2:col-->sampleA2 = 1/(1+exp(-Z2))                       # A:col-->sampleZ3 = dot(W3, A2) + b3                     # Z2:col-->sample
#    A3 = 1/(1+exp(-Z3))                       # A:col-->sampleA3 = Z3                                   # Linear outputcache = {'Z1':Z1,'A1':A1,'Z2':Z2,'A2':A2,'Z3':Z3,'A3':A3}return Z3, cache#------------------------------------------------------------
# Calculate the cost
def calculate_cost(A3, Y, parameters):err = [x1-x2 for x1,x2 in zip(A3.T, Y.T)]cost = [dot(e,e) for e in err]return mean(cost)#------------------------------------------------------------
# Backward propagattion
def backward_propagate(parameters, cache, X, Y):m = X.shape[0]                  # Number of the samplesW1 = parameters['W1']W2 = parameters['W2']W3 = parameters['W3']A1 = cache['A1']A2 = cache['A2']A3 = cache['A3']dZ3 = (A3 - Y) #* (A2 * (1-A2))dW3 = dot(dZ3, A2.T) / mdb3 = sum(dZ3, axis=1, keepdims=True) / mdZ2 = dot(W3.T, dZ3) * (A2 * (1-A2))dW2 = dot(dZ2, A1.T) / mdb2 = sum(dZ2, axis=1, keepdims=True) / mdZ1 = dot(W2.T, dZ2) * (A1 * (1-A1))dW1 = dot(dZ1, X) / mdb1 = sum(dZ1, axis=1, keepdims=True) / mgrads = {'dW1':dW1,'db1':db1,'dW2':dW2,'db2':db2,'dW3':dW3,'db3':db3}return grads#------------------------------------------------------------
# Update the parameters
def update_parameters(parameters, grads, learning_rate):W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']W3 = parameters['W3']b3 = parameters['b3']dW1 = grads['dW1']db1 = grads['db1']dW2 = grads['dW2']db2 = grads['db2']dW3 = grads['dW3']db3 = grads['db3']W1 = W1 - learning_rate * dW1W2 = W2 - learning_rate * dW2W3 = W3 - learning_rate * dW3b1 = b1 - learning_rate * db1b2 = b2 - learning_rate * db2b3 = b3 - learning_rate * db3parameters = {'W1':W1,'b1':b1,'W2':W2,'b2':b2,'W3':W3,'b3':b3}return parameters#------------------------------------------------------------
# Define the training
DISP_STEP           = 500def train(X, Y, num_iterations, learning_rate, print_cost=False):
#    random.seed(3)n_x = 2n_y = 3n_h = 5n_h1 = 5lr = learning_rateparameters = initialize_parameters(n_x, n_h, n_h1, n_y)XX,YY = shuffledata(X, Y)costdim = []for i in range(0, num_iterations):A3, cache = forward_propagate(XX, parameters)cost = calculate_cost(A3, YY, parameters)grads = backward_propagate(parameters, cache, XX, YY)parameters = update_parameters(parameters, grads, lr)if print_cost and i % DISP_STEP == 0:printf('Cost after iteration:%i: %f'%(i, cost))costdim.append(cost)if cost < 0.1:breakreturn parameters, costdim#------------------------------------------------------------
parameter,costdim = train(x_data, y_data, 10000, 0.5, True)A3, cache = forward_propagate(x_data, parameter)
#printf(A3, y_data)A33 = array([[1 if e >= 0 else -1 for e in l] for l in A3])
res = [1 if any(x1!=x2) else 0 for x1,x2 in zip(A33.T, y_data.T)]
printf(res, sum(res))#------------------------------------------------------------plt.plot(arange(len(costdim))*DISP_STEP, costdim)
plt.xlabel("Step(10)")
plt.ylabel("Cost")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
#        END OF FILE : HW12BP2.PY
#============================================================

4.利用MATLAB求解

(1) 建立网络

使用nntool建立人工神经网络。在MATLAB中输入变量:

xx =
0.2500 0.7500 0.2500 0.5000 0.7500 0.2500 0.2500 0.5000 0.7500
0.2500 0.1250 0.7500 0.1250 0.2500 0.7500 0.5000 0.5000 0.5000
yy =
1 1 1 -1 -1 -1 -1 -1 -1
-1 -1 -1 1 1 1 -1 -1 -1
-1 -1 -1 -1 -1 -1 1 1 1

▲ 建立的人工神经网络结构

利用train(network1, xx, yy)训练神经网络。

▲ 训练网络和训练性能图

使用sim(network1, xx)来获得网络的实际输出:

1.4681    1.1752    0.7062    1.4357    0.9579    0.7062    1.5045    1.5136    0.5356
-3.2535   -1.6658   -2.1844   -2.6814   -1.6547   -2.1844   -2.9406   -3.3396   -2.4400
0.7569   -0.1324    0.7854    1.0982   -0.2075    0.7854    0.4232    0.2140   -0.6326

网络输出的均方误差为:3.548

string = ('1.4681    1.1752    0.7062    1.4357    0.9579    0.7062    1.5045    1.5136    0.5356',\'-3.2535   -1.6658   -2.1844   -2.6814   -1.6547   -2.1844   -2.9406   -3.3396   -2.4400',\'0.7569   -0.1324    0.7854    1.0982   -0.2075    0.7854    0.4232    0.2140   -0.6326',)strdim = [[float(s) for s in str.split() if len(s) > 0] for str in string]
#printf(strdim)var = array(strdim)
y_data = array([[1,-1,-1],[1,-1,-1],[1,-1,-1],[-1,1,-1],[-1,1,-1],[-1,1,-1],[-1,-1,1],[-1,-1,1],[-1,-1,1]]).Tprintf(var)err = [x1-x2 for x1,x2 in zip(y_data.T, var.T)]
printf(err)
printf(mean([dot(e,e)/3 for e in err]))

5.使用径向基网络

(1) 使用正则RBF网络

隐层选取N=9N = 9N=9个神经元。个数与样本的个数相同,因此,每个神经元的中心与样本相同。

根据样本都分布在(0,1)×(0,1)之内,所以选择隐层神经元的方差(宽度)σ=0.5\sigma = 0.5σ=0.5。

x_data = array([[0.25, 0.25],[0.75, 0.125],[0.25, 0.75],[0.5, 0.125], [0.75, 0.25], [0.25, 0.75],[0.25, 0.5], [0.5, 0.5], [0.75, 0.5]])
y_data = array([[1,-1,-1],[1,-1,-1],[1,-1,-1],[-1,1,-1],[-1,1,-1],[-1,1,-1],[-1,-1,1],[-1,-1,1],[-1,-1,1]])#------------------------------------------------------------
# calculate the rbf hide layer output
# x: Input vector
# H: Hide node : row->sample
# sigma: variance of RBFdef rbf_hide_out(x, H, sigma):Hx = H - xHxx = [exp(-dot(e,e)/(sigma**2)) for e in Hx]return Hxx#------------------------------------------------------------
Hdim = array([rbf_hide_out(x, x_data, 0.5) for x in x_data]).T
W = dot(y_data.T, dot(linalg.inv(eye(9)*0.001+dot(Hdim.T,Hdim)),Hdim.T))
yy = dot(W, Hdim)yy1 = array([[1 if e > 0 else -1 for e in l] for l in yy])
printf(yy1)err = [1 if any(x1!=x2) else 0 for x1,x2 in zip(yy1.T, y_data)]
printf(err)

对于每个样本,可以计算出中间隐层的输出:hˉi\bar h_ihˉi​,它们组成隐层输出矩阵:H=[h1,h2,⋯,h9]H = \left[ {h_1 ,h_2 , \cdots ,h_9 } \right]H=[h1​,h2​,⋯,h9​]

RBF网络的隐层,再通过隐层到输出层的矩阵WWW,可以计算出样本的输出:W⋅H=YW \cdot H = YW⋅H=Y

由此,可以得到:W=Y⋅H−1W = Y \cdot H^{ - 1}W=Y⋅H−1
通过实际运算可以知道,H−1H^{ - 1}H−1是奇异矩阵。在上述计算公式中增加正则项:
W=Y⋅(H+λ⋅I)−1W = Y \cdot \left( {H + \lambda \cdot I} \right)^{ - 1}W=Y⋅(H+λ⋅I)−1
在实际计算中,选取λ=0.001\lambda = 0.001λ=0.001。由此可以获得W。

经过实际检验,对于所有九个样本输入,获得输出的结果为:

[[ 1 1 -1 -1 -1 -1 -1 -1 -1]
[-1 -1 -1 1 1 -1 -1 -1 -1]
[-1 -1 -1 -1 -1 -1 1 1 1]]

其中存在两个错误样本。

2020人工神经网络第一次作业-参考答案第二部分相关推荐

  1. 2020人工神经网络第一次作业-参考答案第十部分-第三小题

    本文是 2020人工神经网络第一次作业 的参考答案第十部分 ➤第十题参考答案-第3小题 1.题目分析 识别图像是在黑色背景下的四个点组成的目标.它具有特定的方向. ▲ 图片样例 图片的基本参数为: 图 ...

  2. 2020人工神经网络第一次作业-参考答案第十部分

    本文是 2020人工神经网络第一次作业 的参考答案第十部分 ➤第十题参考答案-第1小题 1.题目分析 (1)数据集分析 数据集合包括有两个目录:test, train.其中分别包括有95,510张车牌 ...

  3. 2020人工神经网络第一次作业-参考答案第九部分

    本文是 2020人工神经网络第一次作业 的参考答案第九部分 ➤09 第九题参考答案 1.数据整理 根据char7data.txt中的文件将训练样本(21个字符)以及对应的输出值转化到两个矩阵:char ...

  4. 2020人工神经网络第一次作业-参考答案第八部分

    本文是 2020人工神经网络第一次作业 的参考答案第八部分 ➤08 第八题参考答案 1.题目分析 (1) 数据下载 从https://www.cosy.sbg.ac.at/~pmeerw/Waterm ...

  5. 2020人工神经网络第一次作业-参考答案第七部分

    本文是 2020人工神经网络第一次作业 的参考答案第七部分 ➤07 第七题参考答案 1.题目分析 使用AutoEncoder对于下面样本进行压缩: ▲ 样本英文字符 说明:上面数据可以从作业文件:AB ...

  6. 2020人工神经网络第一次作业-参考答案第六部分

    本文是 2020人工神经网络第一次作业 的参考答案第六部分 ➤06 第六题参考答案 1.题目分析 按照题意,构造如下的神经网络. 隐层的传递函数使用sigmoid函数,输出层的传递函数采用线性传递函数 ...

  7. 2020人工神经网络第一次作业-参考答案第五部分

    本文是 2020人工神经网络第一次作业 的参考答案第五部分 ➤05 第五题参考答案 1.题目分析 MATLAB中的Peaks函数是一个二元函数,构造BP网络来逼近该函数,网络的输入节点数量为2,输出节 ...

  8. 2020人工神经网络第一次作业-参考答案第四部分

    本文是 2020人工神经网络第一次作业 的参考答案第四部分 ➤04 第四题参考答案 1.使用BP网络逼近Hermit函数 f(x)=1.1(1−x+2x2)⋅e−x22f\left( x \right ...

  9. 2020人工神经网络第一次作业-参考答案第三部分

    本文是 2020人工神经网络第一次作业 的参考答案第三部分 ➤03 第三题参考答案 1.构造BP网络进行函数逼近 (1) 逼近简单函数 构建单隐层的神经网络,隐层节点个数20,传递函数为sigmoid ...

最新文章

  1. HDU 1080 Human Gene Functions
  2. 关于定位的一些知识:
  3. cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么
  4. Android笔记 pacth图形
  5. Ubuntu 12.04中设置安装Google拼音输入法
  6. LeetCode 求解电话号码组合(分治法求解)
  7. 带你玩转Visual Studio——带你高效开发
  8. 生成特定区间的随机数
  9. 20191123每日一句
  10. StackPanel 控件自动出现滚动条
  11. ADMM算法(交替方向乘子法)
  12. swagger常用注解
  13. vue3 ref函数用法
  14. 计算机网络重要知识点总结(期末复习笔记)
  15. WPF基础五:UI②内容元素Frame
  16. 嵌入式系统词汇表(Embedded System Vocabulary List)
  17. 如何将微信公众号内容同步到头条自媒体?
  18. SAP-MM知识精解-采购标准业务(02-01)-消耗性物料的采购之基于成本中心的采购
  19. window.onload和window.document.readystate的探究
  20. 国家医保的线上支付接口,需要签名算法SM2、加密算法SM4

热门文章

  1. JSBridge深度剖析
  2. 实战2--应用EL表达式显示投票结果
  3. 手把手教你如何建立自己的Linux系统(二)
  4. 对tmemorystream的一些改进_delphi教程
  5. 大数据开发实战:Hive表DDL和DML
  6. 12.1 LNMP架构介绍;12.2 MySQL安装;12.3-2.4 PHP安装(上下);12.5
  7. 公开仓库中Docker镜像的漏洞分析结果发布
  8. Java8 HashMap实现原理探究
  9. servlet 访问项目
  10. html5 Web Workers