2020年人工神经网络第二次作业-参考答案第七题
如下是 2020年人工神经网络第二次作业 中第七题的参考答案。
➤01 第七题参考答案
1.题目分析
根据题目要求,使用CPN(Counterpropagation Network: 对偶传播网络 )
f(x)=1.1(1−x+2x2)e−x22f\left( x \right) = 1.1\left( {1 - x + 2x^2 } \right)e^{ - {{x^2 } \over 2}}f(x)=1.1(1−x+2x2)e−2x2
下图显示了在(-4,4)之间的Hermit函数曲线,以及在(-4,4)之间随机选取的50个训练数据的分布。
▲ Hermit多项式以及随机选取的训练数据
(1) 单向CPN网络结构
由于逼近的是Hermit一元函数,所以构建的网络结构为:
- 输入节点:xxx
- 输出节点:f(x)f\left( x \right)f(x)
- 中间隐层节点的个数根据题目要求:20个。
▲ 单向CPN网络结构
(2) 双向CPN网络结构
双向CPN网络的结构如下:
- 输入节点:x,f′(x)x,f'\left( x \right)x,f′(x)
- 输出节点:x′,f(x)x',f\left( x \right)x′,f(x)
- 中间隐层节点:20个。
相比于单向CPN,它的输入,输出节点都进行了扩增。
▲ 双向CPN网络结构
(3) 网络训练
根据CPN的启发式的学习模式,对于广义CPN网络,在确定了隐层节点个数N=20N = 20N=20的情况下,网络训练过程需要确定网络的三组参数:
- 隐层节点的中心位置:{vi}i=1,2,⋯,20\left\{ {v_i } \right\}_{i = 1,2, \cdots ,20}{vi}i=1,2,⋯,20
- 隐层节点的方差:在这里去方差为σi=8/N=8/20=0.4\sigma _i = 8/N = 8/20 = 0.4σi=8/N=8/20=0.4。
- 隐层节点输出到网络输出层的链接权系数:W={wij}i=1,2,⋯,20;j=1W = \left\{ {w_{ij} } \right\}_{i = 1,2, \cdots ,20;j = 1}W={wij}i=1,2,⋯,20;j=1
通过计算伪逆的方式来确定该权系数W。
设V={vi}i=1,2,⋯,MV = \left\{ {v_i } \right\}_{i = 1,2, \cdots ,M} \,V={vi}i=1,2,⋯,M是M个样本对应的隐层输出向量组成的矩阵。网络隐层到输出的权系数矩阵为:
W=Y⋅(VTV+λI)−1⋅VTW = Y \cdot \left( {V^T V + \lambda I} \right)^{ - 1} \cdot V^TW=Y⋅(VTV+λI)−1⋅VT
其中λ=0.00001\lambda = 0.00001λ=0.00001是为了防止求取伪逆矩阵时出现奇异数值的正则项系数。
2.单向CPN求解过程
求解过程中相关程序参见后面附录中 作业中的程序。
(1) 第一阶段
- 阶段1:对隐层实施K-近邻聚类,或者隐层节点的中心位置:
K近邻聚类的参数:- 迭代步数:N=100
- 修正速率:η\etaη 从0.1线性降低到0.01
下图显示了隐层20个中心位置随着训练迭代演化的过程。
▲ 隐层节点K-近邻聚类过程
在第一阶段k-聚类过程中,如果采用随机初始化的方式,可会存在着一些死节点:即从来没有胜出过的节点。这些节点在第二阶段中,会使得它所对应的权系数为0.从而会造成网络输出输出之间存在着 0-值 区域。
为了避免死节点的产生,在初始化隐层节点的时候,在训练样本中随机选择N=20个的所在位置进行初始化。
(2) 第二阶段:
- 阶段2:计算隐层到输出层的权系数矩阵:W
通过计算样本隐层输出矩阵的伪逆,利用对应样本的输出可以直接计算出权系数矩阵W。
对于每个输入样本,就可以计算出网络对应的输出值。
为了表现网络性能随着训练的变化,下面显示了随着阶段1的迭代,网络的输出变化情况。
▲ 对于每个样本对应的网络输出
注:在实际操作中,第二阶段是在第一阶段结束之后进行初次计算。上面的动图只是为了显示第一阶段的聚类结果如何影响网络的输出性能的。
为了显示网络的推广性能,在(-4,4)之间均匀采集500个x值,送入网络,绘制出网络的输出值,如下图的红线所示:
▲ 网络的推广性能
(3) 处理第一阶段的死节点
观察上述的红线,会发现存在两处奇怪的地方,也就是在-3和2.5附近,网络的 输出值为 0!
重新训练网络,上述奇怪的地方依然存在,网络输出为0的区域的个数和分布也发生了变化。、
如果将隐层节点所对应的W矩阵值绘制出来,如下图中的绿点所示,可以看到存在存在部分隐层节点所对应的输出wiw_iwi为0,也就是那些位于X轴上的节点。
究其原因,就是这些节点在第一阶段的时候属于“死节点”,即它们不对应任何x训练样本。这样就在第二阶段计算W矩阵的时候,它们的输出值为0。
▲ 将隐层节点所对应的W取值绘制出来
解决这个问题可以从以下两个方面:
- 将所有的隐层节点所对应的x以及对应的Hermit函数值添加到训练样本中去;
- 在隐层竞争的时候,对于所有在第一阶段中的“死节点”所对应的隐层都不作为隐层胜出候选者。
- 对于隐层节点的初始化的值在训练样本中随机选择N=20个的样本的取值。
下面采取第一种方法,将所有的隐层节点所对应的x以及它的函数取值添加到训练样本中去,用它来计算隐层到输出节点的权系数矩阵W,此时就不再会有函数值为0的区间出现了。
下图显示了这种结果。
下面是另外一次重新训练的结果:
如果在第一阶段中,对于隐层节点初始化的值随机选择训练样本的x值进行初始化,则可以避免“死节点”的存在。
下面的过程,就是对第一阶段中的隐层节点使用随机选择的训练样本的x值进行初始化,所对应的训练结果。后面的过程中,就不在将隐层节点增加到训练样本中去了。
3.双向CPN的求解过程
(1) 第一阶段
对于双向CPN,它的第一阶段的K-聚类是利用训练样本的(x,y)同时进行二维空间的聚类过程。
聚类参数:
- 隐层节点初始化:随机选取训练样本中的N=20个点对隐层节点进行初始化;
- 聚类学习速率:η\etaη 从0.1线性降低到0
- 聚类循环次数:N=100。
下图显示了隐层节点(绿色点)随着聚类迭代过程所产生的变化。
▲ 联合x-f(x)的聚类过程
(2) 第二阶段
由于本题并不要求实际进行双相应设,也就是不需要获得函数y=f(x)y = f\left( x \right)y=f(x)的逆函数:x=f−1(y)x = f^{ - 1} \left( y \right)x=f−1(y)。所以对于第二阶段的计算和单向CPN的计算过程是一致的。
通过求取样本在隐层输出矩阵的伪逆方法,可以计算出隐层到输出层的权系数矩阵:W。
为了评估网络的推广性,在(-4,4)之间均匀采样500个点,通过网络计算出对应的输出值,这样可以绘制出网络在(-4,4)区间上的映射函数。
下面动图给出了在整个第一阶段聚类过程中,网络输入输出之间的映射函数应变过程(红色曲线)。
注:演示上面动态过程,只是为了说明第一阶段聚类的结果是如何影响网络的整体性能的。实际工作中,第一阶段结束之后,才进行第二阶段的计算。
4.结果讨论
在CPN训练过程中,对于第一阶段中所出现的“”死节点,即在进行k-均值聚类的时候,从来没有胜出的节点,需要进行特殊的考虑。如果不进行处理,则有会在网络上的映射函数中存在着一些 0 值区间;
为了避免“死节点”所造成的影响,可以使用随机选择的训练样本作为K-聚类的初始化值。
对于只有50个训练赝本来讲,单向CPN和双向CPN对于函数逼近的结果基本相同。下面给出训练样本为500时,单向和双向CPN网络对于函数逼近的结果对比。
▲ 单向CPN函数逼近结果
▲ 双向CPN函数逼近结果
- 下面给出了训练样本为500, 隐层节点数量为50的两种CPN的函数逼近结果对比。
▲ 单向CPN函数逼近的结果
▲ 双向CPN函数逼近的结果
通过上述(3)(4)两个对比,可以看到双向CPN的函数逼近结果要好于单向CPN的函数逼近结果。
➤※ 作业中的程序
1.单向CPN实验程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW27.PY -- by Dr. ZhuoQing 2020-11-26
#
# Note:
#============================================================from headm import *#------------------------------------------------------------
def f_hermit(x):return 1.1 * (1 - x + 2 * x**2) * exp(-x**2/2)#------------------------------------------------------------
TRAIN_DATA_NUM = 500
x_train = random.uniform(-4, 4, TRAIN_DATA_NUM)
y_train = f_hermit(x_train)plt.draw()
plt.pause(.2)
#------------------------------------------------------------
def show_res(x, y):x_line = linspace(-4, 4, 250)plt.clf()plt.plot(x_line, f_hermit(x_line), '--', c='grey', linewidth=1, label='Hermit Func')plt.scatter(x, y, s=10, c='darkviolet', label='Train Data')plt.xlabel("x")plt.ylabel("f(x)")plt.grid(True)plt.legend(loc='upper right')plt.tight_layout()
# plt.draw()
# plt.pause(.01)#------------------------------------------------------------
#show_res(x_train, y_train)
#plt.show()#------------------------------------------------------------
def WTA_nearest(x, v):err = [x - vv for vv in v]dist = [dot(e,e) for e in err]id = where(dist==amin(dist))[0][0]return iddef K_neighbor(v, x, eta):for xx in x:id = WTA_nearest(xx, v)v[id] = v[id] + eta*(xx-v[id])return vdef CPN_v_out(x, v):H = []for xx in x:h = zeros(v.shape[0])id = WTA_nearest(xx, v)h[id] = 1H.append(list(h))return array(H).Tdef CPN_W(h, y):vv = h.T.dot(h) + 0.000001 * eye(h.shape[1])vvv = linalg.inv(vv).dot(h.T)return y.reshape(1, -1).dot(vvv)#------------------------------------------------------------
NODE_NUM = 50
#v_data = random.uniform(-4, 4, NODE_NUM)
v_data = x_train[0:NODE_NUM]#------------------------------------------------------------
ETA_BEGIN = 0.1
ETA_END = 0.0
TRAIN_STEP = 100
pltgif = PlotGIF()for id,eta in enumerate(linspace(ETA_BEGIN,ETA_END, TRAIN_STEP)):v_data = K_neighbor(v_data, x_train, eta)# x_train_ex = hstack((x_train, v_data))x_train_ex = x_trainy_train_ex = f_hermit(x_train_ex)H = CPN_v_out(x_train_ex, v_data)W = CPN_W(H, y_train_ex)yy = W.dot(H)y_train = f_hermit(x_train)show_res(x_train, y_train)
# plt.scatter(x_train_ex, yy, s=30, c='blue', label='Net out')x_line = linspace(-4, 4, 500)Hx = CPN_v_out(x_line, v_data)y_line = W.dot(Hx)plt.plot(x_line, y_line[0], c='red', linewidth=1, label='Net Performance')v_H = CPN_v_out(v_data, v_data)v_yy = W.dot(v_H)plt.scatter(v_data, v_yy[0], s = 30, c='darkcyan', label='V value')plt.title('Step:%d, Eta:%4.2f'%(id, eta))plt.tight_layout()plt.legend(loc='upper right')plt.draw()plt.pause(.01)pltgif.append(plt)# plt.show()pltgif.save(r'd:\temp\1.gif')
plt.show()#------------------------------------------------------------'''for id,eta in enumerate(linspace(ETA_BEGIN, ETA_END, TRAIN_STEP)):v_data = K_neighbor(v_data, x_train, eta)show_res(x_train, y_train)plt.scatter(v_data, zeros(len(v_data)), s=30, c='blue', label='X cluster')plt.title('Step:%d, Eta:%4.2f'%(id, eta))plt.tight_layout()plt.legend(loc='upper right')plt.draw()plt.pause(.01)pltgif.append(plt)pltgif.save(r'd:\temp\1.gif')
plt.show()'''printf('\a')
#------------------------------------------------------------
# END OF FILE : HW27.PY
#============================================================
2.双向CPN实验程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW27_1.PY -- by Dr. ZhuoQing 2020-11-26
#
# Note:
#============================================================from headm import *#------------------------------------------------------------
def f_hermit(x):return 1.1 * (1 - x + 2 * x**2) * exp(-x**2/2)#------------------------------------------------------------
TRAIN_DATA_NUM = 500
x_train = random.uniform(-4, 4, TRAIN_DATA_NUM)
y_train = f_hermit(x_train)plt.draw()
plt.pause(.2)
#------------------------------------------------------------
def show_res(x, y):x_line = linspace(-4, 4, 250)plt.clf()plt.plot(x_line, f_hermit(x_line), '--', c='grey', linewidth=1, label='Hermit Func')plt.scatter(x, y, s=10, c='darkviolet', label='Train Data')plt.xlabel("x")plt.ylabel("f(x)")plt.grid(True)plt.legend(loc='upper right')plt.tight_layout()
# plt.draw()
# plt.pause(.01)#------------------------------------------------------------
#show_res(x_train, y_train)
#plt.show()#------------------------------------------------------------
def WTA_nearest(x, v):err = [x - vv for vv in v]dist = [dot(e,e) for e in err]id = where(dist==amin(dist))[0][0]return iddef K_neighbor(v, x, eta):for xx in x:id = WTA_nearest(xx, v)v[id] = v[id] + eta*(xx-v[id])return vdef CPN_v_out(x, v):H = []for xx in x:h = zeros(v.shape[0])id = WTA_nearest(xx, v)h[id] = 1H.append(list(h))return array(H).Tdef CPN_W(h, y):vv = h.T.dot(h) + 0.000001 * eye(h.shape[1])vvv = linalg.inv(vv).dot(h.T)return y.reshape(1, -1).dot(vvv)#------------------------------------------------------------
NODE_NUM = 50
#v_data = random.uniform(-4, 4, NODE_NUM)
v_seed_x = x_train[0:NODE_NUM]
v_seed_y = f_hermit(v_seed_x)
v_data = vstack((v_seed_x, v_seed_y)).T
xy_train = vstack((x_train, y_train)).T#------------------------------------------------------------
ETA_BEGIN = 0.1
ETA_END = 0.0
TRAIN_STEP = 100
pltgif = PlotGIF()for id,eta in enumerate(linspace(ETA_BEGIN,ETA_END, TRAIN_STEP)):v_data = K_neighbor(v_data, xy_train, eta)H = CPN_v_out(x_train, squeeze(v_data[:,0]))W = CPN_W(H, y_train)yy = W.dot(H)show_res(x_train, y_train)plt.scatter(squeeze(v_data[:,0]), squeeze(v_data[:,1]), s = 30, c='green', label='Hide Node')# plt.scatter(x_train, yy, s=30, c='blue', label='Net out')x_line = linspace(-4, 4, 500)Hx = CPN_v_out(x_line, squeeze(v_data[:,0]))y_line = W.dot(Hx)plt.plot(x_line, y_line[0], c='red', linewidth=1, label='Net Performance')# v_H = CPN_v_out(v_data, v_data)
# v_yy = W.dot(v_H)
# plt.scatter(v_data, v_yy[0], s = 30, c='darkcyan', label='V value')plt.title('Step:%d, Eta:%4.2f'%(id, eta))plt.tight_layout()plt.legend(loc='upper right')plt.draw()plt.pause(.01)pltgif.append(plt)# plt.show()pltgif.save(r'd:\temp\1.gif')
printf('\a')
plt.show()#------------------------------------------------------------
#------------------------------------------------------------
# END OF FILE : HW27_1.PY
#============================================================
2020年人工神经网络第二次作业-参考答案第七题相关推荐
- 2020年人工神经网络第二次作业-参考答案第八题
如下是 2020年人工神经网络第二次作业 中第八题的参考答案. ➤01 第八题参考答案 1.题目分析 (1) 训练样本 根据题目中的两类样本点在坐标系的位置,可以获得训练样本输入数据矩阵x_train ...
- 2020年人工神经网络第二次作业-参考答案第六题
如下是 2020年人工神经网络第二次作业 中第六题的参考答案. ➤01 第六题参考答案 1.题目分析 (1) 数据处理 将题目中给定的十个景点位置{xi,yi}i=1,2,⋯,10\left\{ {x ...
- 2020年人工神经网络第二次作业-参考答案第五题
如下是 2020年人工神经网络第二次作业 中第五题的参考答案. ➤01 第五题参考答案 1.题目分析 (1) 数据产生 100个样本随机均匀分布在三角形区域内,训练样本{xi,yi}\left\{ { ...
- 2020年人工神经网络第二次作业-参考答案第四题
如下是 2020年人工神经网络第二次作业 中第四题的参考答案. ➤01 第四题参考答案 1.题目分析 (1) 训练数据 第一个数据集合 这个数据集合包括有16中动物.它们的属性编码在题目中的表格中给出 ...
- 2020年人工神经网络第二次作业-参考答案第三题
如下是 2020年人工神经网络第二次作业 中第三题的参考答案. ➤01 第三题参考答案 1.题目分析 本题实际上是课件中例题的重现问题. 对于7个字符(三种字体),21个训练样本,它们分别属于7大类. ...
- 2020年人工神经网络第二次作业-参考答案第二题
如下是 2020年人工神经网络第二次作业 中第二题的参考答案. ➤01 第二题参考答案 1.题目分析 (1) 训练样本 训练样本是低分辨率(5×5)字符,可以使用长度为25的向量表示,下面就是字母C, ...
- 2020年人工神经网络第二次作业-参考答案第一题
如下是 2020年人工神经网络第二次作业 中第一题的参考答案. ➤01 第一题参考答案 1.题目分析 (1) 已知条件 本题中的建立的是一个由两个竞争节点组成的竞争网络.竞争层的神经元和五个训练样本都 ...
- 2020年人工神经网络第二次作业
第二次作业TEASOFT-DOP文档所在云端目录 ➤01 第一题 1.题目描述 建立起一个竞争网络,有输入层和竞争层组组成,如下图所示,初始权向量为已经归一化为: 训练集合有五个样本向量 xn,n=1 ...
- 2021年春季学期-信号与系统-第二次作业参考答案-第九小题
本文是 2021年春季学期-信号与系统-第二次作业参考答案 的参考答案. ▌第九题 9. 已知三个系统的输入输出关系分别为: 把上述三个子系统进行如下的级联,求系统的输入输出关系,它是线性.时不变系统 ...
最新文章
- HTML学习04之内联框架和表单
- Ubuntu Server 16.04 LTS上安装Docker(使用脚本的方式)
- 【plupload】单易用且功能强大的上传组件
- “约见”面试官系列之常见面试题第五篇说说vuex登录信息(建议收藏)
- java实例化对象数组_java对象实例化
- 浅谈MyBatis持久层框架
- Sublime LiveReload
- 笔记3:STM32F103与STM32F030的区别
- 计算机的文件怎么加密码怎么设置,文件夹怎么设置密码,教您怎么设置
- 深度测评 | 五大主流多端开发框架全面对比
- 如何把Word的默认页面颜色由白色改为绿色
- 欢迎来到大数据时代-----赶快来了解一些大数据的基础知识
- 自学编程的好方法,直接省了几万块钱报班,不收藏就可惜了
- 网络安全初创企业Illumio融资1.25亿美元 摩根领投
- vs:dll缺少依赖文件的解决方法
- 如何合理的规划用户运营方案?
- linux停止tomcat 8005,严重:无法联系localhost:8005 . 关闭时Tomcat可能没有运行错误...
- 【Axure教程】随机抽奖原型
- Python批量转换doc为docx格式
- C语言小功能实现--停车场功能
热门文章
- Androidn Notification的使用,解决找不到setLatestEventInfo方法
- Node.js-提供了四种形式的定时器
- Apache - AH00526 – server.crt
- CCRD_TOC_2008年第6期
- 黄聪:基于Linq to edmx的实体数据模型(EDM)类名批量修改工具
- util.promisify 的那些事儿
- Zabbix实现微信告警
- POJ 1018 Communication System
- 老手讲解在JSP开发中与Web的中文问题解决方法
- 如何修改安装包程序的产品描述和版权信息