2020年人工神经网络第二次作业-参考答案第四题

如下是 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网络结构

  • 第二个数据集合
    第二个数据集合SOFM网络结构:输入节点长度5;竞争层神经网络节点组成7×10的二维拓扑结构矩阵。

▲ SOFM网络结构

▲ 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\| yijxi=n1,2,16minyijxn

训练过程:

  • 训练步骤: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
  1. 竞争层的神经元对应的样本分布也同样具有“保序特性”;
  2. 竞争层的神经元所对应的样本并没有涵盖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
#============================================================
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页