如下是 2020年人工神经网络第二次作业 中第四题的参考答案。
➤01 第四题参考答案
1.题目分析
(1) 训练数据
- 第一个数据集合
这个数据集合包括有16中动物。它们的属性编码在题目中的表格中给出了。编码长度为13维。对于每个动物之后又增加一个16维的向量,使用one-hot编码来表面不同动物的类别。
-
十六中动物特征编码就是29维,它们组成16×29的数据矩阵。
-
十六种动物的名称:‘鸽子’, ‘母鸡’, ‘鸭’, ‘鹅’, ‘猫鹰’, ‘隼’, ‘鹰’, ‘狐狸’, ‘狗’, ‘狼’, ‘猫’, ‘虎’, ‘狮’, ‘马’, ‘斑马’, ‘牛’
[[1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
[0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
[0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
[0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
[1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
[0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
[0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
[0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]]
- 第二个数据集合
- 32个样本的命名:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456
- 三个样本对应的特征矩阵:
[[1 2 3 4 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]
[0 0 0 0 0 1 2 3 4 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]
[0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 3 3 3 3 6 6 6 6 6 6 6 6 6 6]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 1 2 3 4 2 2 2 2 2 2]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6]]
(2) 网络结构
对应的两个数据集合所使用的SOFM竞争层神经网络都使用二维的拓扑结构。
- 第一个数据集合
第一个数据集合对应的SOFM网络,输入层节点的个数为29,输出层的节点组成10×10的二维拓扑结构矩阵:
▲ SOFM网络结构
- 第二个数据集合
第二个数据集合SOFM网络结构:输入节点长度5;竞争层神经网络节点组成7×10的二维拓扑结构矩阵。
▲ SOFM网络结构
2.求解过程
求解过程中相关程序参见后面附录中 作业中的程序。
(1) 第一个数据集合
网络在进行随机初始化之后,竞争层的所有神经元与样本集合之间的映射关系如下图所示:
鸭 鸽子 母鸡 斑马 虎 猫 猫 虎 猫鹰 斑马
隼 猫 狼 鸭 狐狸 狐狸 狼 鹅 鹰 猫
猫 马 狐狸 狐狸 母鸡 鸭 猫 狼 马 牛
鸽子 鸭 狗 狐狸 牛 猫 牛 马 斑马 猫
隼 鸭 猫 鹰 鹰 鸭 狗 鹰 狼 虎
鸽子 鸭 鹅 牛 狼 鹅 斑马 猫 虎 马
马 鹅 鹰 鸽子 鹅 猫 猫鹰 鸭 斑马 牛
狮 斑马 狗 马 鹅 鸭 鸭 母鸡 猫 鹰
母鸡 鸽子 鹰 猫 鹅 虎 狐狸 牛 狮 鹅
鸽子 鹅 鹰 隼 狗 狗 狐狸 鹅 猫鹰 猫鹰
上述竞争层神经元 { y i j } i , j ∈ [ 1 , 2 , ⋯ , 10 ] \left\{ {y_{ij} } \right\}_{i,j \in \left[ {1,2, \cdots ,10} \right]} {yij}i,j∈[1,2,⋯,10]与训练样本之间 { x i } i ∈ [ 1 , 2 , ⋯ , 16 ] \left\{ {x_i } \right\}_{i \in \left[ {1,2, \cdots ,16} \right]} {xi}i∈[1,2,⋯,16]的映射关系:对于任意一个 y i j y_{ij} yij,在 { x i } \left\{ {x_i } \right\} {xi}中寻找一个 x i ∗ x_{i*}^{} xi∗满足: ∥ y i j − x i ∗ ∥ = min n ∈ 1 , 2 , ⋯ 16 ∥ y i j − x n ∥ \left\| {y_{ij} - x_{i*} } \right\| = \mathop {\min }\limits_{n \in 1,2, \cdots 16} \left\| {y_{ij} - x_n } \right\| ∥yij−xi∗∥=n∈1,2,⋯16min∥yij−xn∥
训练过程:
- 训练步骤:1000
- 学习速率:从0.6线性递减到0.01
- 收敛半径:从5线性递减到0
训练结果:
鸭 鸽子 隼 猫鹰 猫鹰 鹰 鹰 猫 猫 猫
鸽子 鸽子 鸽子 猫鹰 猫鹰 鹰 狐狸 猫 猫 猫
斑马 马 马 马 狐狸 狐狸 狐狸 狼 狼 狼
斑马 马 马 马 狐狸 狐狸 狐狸 狼 狼 狼
马 马 马 虎 狐狸 狐狸 狐狸 狼 狼 狼
虎 虎 虎 虎 虎 虎 狼 狼 狼 狼
牛 牛 虎 虎 虎 狮 狗 狗 狗 狗
牛 虎 虎 虎 虎 狗 狗 狗 狗 狗
牛 牛 狮 狮 狮 狗 狗 狗 狗 狗
牛 牛 狮 狮 狮 狗 狗 狗 狗 狗
从上述训练结果来看,竞争神经元层对应动物属性具有保序特性。也就是在竞争层中相近的神经元对应的动物的属性(高位空间的位置)也相近。
下图显示了在训练过程中,竞争层对应的动物属性的动态改变过程。
▲ 竞争层在训练过程动态演变
(2) 数据集合2
下图是网络在初始化之后,竞争层神经元对应数据的关系:
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
训练过程参数:
- 训练次数:10000
- 学习速率:从0.6线性递减到0.01
- 学习半径:从5 线性递减到0
下面显示了网络训练完之后,竞争层神经元对应的样本分布。
Step:9900, eta:0.02, R:0
5 F A K H H H G C E
Y U K K I J I I I I
2 T S S L K J J I I
Q M S S L L J J J J
P N M M L L J J J J
N N M M M M K J J J
N N N M M M K J J J
- 竞争层的神经元对应的样本分布也同样具有“保序特性”;
- 竞争层的神经元所对应的样本并没有涵盖32个样本全部。因此,反过来,对于32样本映射到7×10的竞争层上,会出现多个样本映射到同一个神经元的情况。反映出聚类结果存在着某些误差。
下面是竞争层网络在训练过程中的演变过程。
➤※ 作业中的程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW24.PY -- by Dr. ZhuoQing 2020-11-24
#
# Note:
#============================================================
from headm import *
import hw24data
#x_data = hw24data.body_data
x_data = hw24data.train_data
#W = random.rand(100, x_data.shape[1])
W = random.rand(70, x_data.shape[1])
#------------------------------------------------------------
def WTA2(x, w):
""" Win-Take-All
In: x-sample(x1,x2)
w-net argument
Ret: id-Win ID of w
"""
dist = array([(x-ww).dot(x-ww) for ww in w])
return list(where(dist==amin(dist)))[0][0]
#------------------------------------------------------------
NAME_DIST = 5
def shownet0(w): # Show net result: 0-dimension
global x_data
outstr = ''
for id,ww in enumerate(w):
iidd = WTA2(ww, x_data)
namestr = hw24data.name_data[iidd]
namelen = len(namestr)*2
if namelen < NAME_DIST: namestr += ' ' * (NAME_DIST - namelen)
outstr += namestr
if id%10 == 9:
printf(outstr)
outstr = ''
def shownet1(w):
global x_data
outstr = ''
for id,ww in enumerate(w):
iidd = WTA2(ww, x_data)
namestr = '%3s'%hw24data.train_data_name[iidd:iidd+1]
outstr += namestr
if id%10 == 9:
printf(outstr)
outstr = ''
#------------------------------------------------------------
def neighborid2(id, row, col, r):
rown = id // col
coln = id % col
if r <= 0: return [id]
iddim = []
for i in range(-r,r):
if rown + i < 0: continue
if rown + i >= row: continue
for j in range(-r,r):
if coln + j < 0: continue
if coln + j >= col: continue
iidd = (rown+i) * col + coln + j
iddim.append(iidd)
return iddim
def compete2(x, w, eta, r):
for xx in x:
id = WTA2(xx, w)
# iddim = neighborid2(id, 10, 10, r)
iddim = neighborid2(id, 7, 10, r)
for iidd in iddim:
w[iidd] = w[iidd] + eta * (xx - w[iidd])
return w
#------------------------------------------------------------
STEPS = 10000
shownet1(W)
#exit()
gifid = 26
tspgiffirst(gifid)
for i in range(STEPS):
eta = 0.6 - (0.59 * i/STEPS)
R = int(5 - 5 * i / STEPS - 0.5)
x = x_data.copy()
random.shuffle(x)
W = compete2(x, W, eta, R)
if i % 100 == 0:
tspclr()
printf(' Step:%d, eta:%4.2f, R:%d'%(i, eta, R))
printf(' ')
shownet1(W)
tspgifappend(gifid)
#------------------------------------------------------------
# END OF FILE : HW24.PY
#============================================================