2020年人工神經網路第二次作業-參考答案第五題

卓晴發表於2020-11-26

如下是 2020年人工神經網路第二次作業 中第五題的參考答案。

 

01 第五題參考答案


1.題目分析

(1) 資料產生

100個樣本隨機均勻分佈在三角形區域內,訓練樣本 { x i , y i } \left\{ {x_i ,y_i } \right\} {xi,yi}滿足:
x i ∈ ( 0 , 1 ) ,    y i < 3 ( 0.5 − ∣ x − 0.5 ∣ ) x_i \in \left( {0,1} \right),\,\,y_i < \sqrt 3 \left( {0.5 - \left| {x - 0.5} \right|} \right) xi(0,1),yi<3 (0.5x0.5)

下面使用 作業中的程式中python子程式:generate_data_triangle()產生100隨機分佈的資料點:

▲ 100個資料點

▲ 100個資料點

(2) 網路結構

自組織特徵對映(SOFM)網路有15個競爭層的神經元,它們具有一維的拓撲結構。
▲ 一位拓撲結構的SOFM網路結構

▲ 一位拓撲結構的SOFM網路結構

競爭層的神經元引數 { w i 1 , w i 2 } i = 1 , 2 , ⋯ 15 \left\{ {w_{i1} ,w_{i2} } \right\}_{i = 1,2, \cdots 15} {wi1,wi2}i=1,2,15初始化為區域 ( 0 , 1 ) × ( 0 , 3 / 2 ) \left( {0,1} \right) \times \left( {0,\sqrt 3 /2} \right) (0,1)×(0,3 /2)中的隨機數。

初始化之後,競爭層的神經元所處的位置:
▲ 網路初始化競爭神經元所處的位置

▲ 網路初始化競爭神經元所處的位置

2.求解過程

求解過程中相關程式參見後面附錄中 作業中的程式

(1) 訓練引數

  • 訓練半徑:R從10線性遞減到0
  • 學習速率: η \eta η從0.3線性遞減到0
  • 訓練週期:N= 200

(2) 學習過程

▲ 學習訓練過程

▲ 學習訓練過程

(3) 訓練結果

下面為訓練的結果。SOFM的保序特性體現在競爭層的神經元分佈與訓練樣本分佈區域保持一致。

▲ 訓練後的結果

▲ 訓練後的結果

3.結果討論

為了更好地顯示SOFM保序特性,下面在分別對不同的取樣點和神經元個數訓練的情況進行展示。訓練引數(學習半徑、學習速率)與前面相同。

  • 訓練樣本:100; 神經元個數:25
  • 訓練樣本200;神經元個數500

  • 訓練樣本:300;神經元數量:100


 

※ 作業中的程式


#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# HW25.PY                      -- by Dr. ZhuoQing 2020-11-26
#
# Note:
#============================================================

from headm import *

#------------------------------------------------------------
def generate_data_triangle(num):
    """Generate the data point in triangle specifated in problems
    description.

    In: num-data point number.
    Out: Point array-2D.
    """

    pointdim = []

    for i in range(num):
        while True:
            x = random.uniform(0, 1)
            y = random.uniform(0, sqrt(3)/2)
            y_limit = sqrt(3) * (0.5 - abs(x-0.5))
            if y > y_limit:
                continue

            pointdim.append([x, y])
            break

    return array(pointdim)

def show_data(data, lineflag=0, title=''):
#    plt.clf()

    if lineflag ==0:
        plt.scatter(data[:,0], data[:,1], s=10, c='blue')
    else:
        plt.scatter(data[:,0], data[:,1], s=35, c='red')
        plt.plot(data[:,0], data[:,1], 'y-', linewidth=1)

    board_x = linspace(0, 1, 200)
    board_y = [sqrt(3)*(0.5-abs(x-0.5)) for x in board_x]
    plt.plot(board_x, board_y, 'c--', linewidth=1)
    plt.plot(board_x, zeros(len(board_x)), 'c--', linewidth=1)

    plt.xlabel("x1")
    plt.ylabel("x2")
    plt.axis([-0.05, 1.05, -0.05, .9])

    if len(title) > 0: plt.title(title)

    plt.grid(True)
    plt.tight_layout()
#    plt.draw()
#    plt.pause(.0001)

#------------------------------------------------------------
SAMPLE_NUM          = 300
NEURAL_NUM          = 100
x_data = generate_data_triangle(SAMPLE_NUM)
W = random.rand(NEURAL_NUM, x_data.shape[1])
W[:,1] *= sqrt(3)/2

#------------------------------------------------------------
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]

#------------------------------------------------------------
def neighborid1(id, row, r):
    if r <= 0: return [id]

    iddim = []
    for i in range(-r,r):
        if id + i < 0:    continue
        if id + i >= row: continue

        iddim.append(id + i)

    return iddim

def compete1(x, w, eta, r):
    for xx in x:
        id = WTA2(xx, w)

        iddim = neighborid1(id, w.shape[0], r)

        for iidd in iddim:
            w[iidd] = w[iidd] + eta * (xx - w[iidd])

    return w

#------------------------------------------------------------
TRAIN_NUM       = 200
ETA_BEGIN       = 0.3
ETA_END         = 0.01
RATIO_BEGIN     = 10
RATIO_END        = 0

plt.draw()
plt.pause(.2)

pltgif = PlotGIF()
for i in range(TRAIN_NUM):

    eta = (ETA_BEGIN - ETA_END) * (TRAIN_NUM - i) / (TRAIN_NUM - 1) + ETA_END
    ratio = int((RATIO_BEGIN - RATIO_END) * (TRAIN_NUM - i) / (TRAIN_NUM - 1) + RATIO_END)

    W = compete1(x_data, W, eta, ratio)

    plt.clf()
    show_data(x_data, 0)
    show_data(W, 1, "Step:%d/%d, R:%d, eta:%4.2f"%(i+1, TRAIN_NUM, ratio, eta))
    plt.draw()
    plt.pause(0.001)
    pltgif.append(plt)

pltgif.save(r'd:\temp\1.gif')
plt.show()

#------------------------------------------------------------
#        END OF FILE : HW25.PY
#============================================================

相關文章