01 學習算法
一、題目內(nèi)容
1、背景介紹
在第一章介紹了日本學者 “甘利俊一” 提出的統(tǒng)一公式,把對神經(jīng)元輸入連接權系數(shù)的修正 分成了三個獨立成分的乘積:學習速率 , 學習信號 以及輸入向量 。
▲ 圖1.1 神經(jīng)網(wǎng)絡中神經(jīng)元學習的統(tǒng)一公式當學習信號 取不同形式,可以得到神經(jīng)元的三大類不同修正方式(無監(jiān)督、有監(jiān)督、死記憶)。下面給出神經(jīng)元模型和訓練樣本數(shù)據(jù),請通過編程實現(xiàn)上述表格中的五種算法并給出計算結(jié)果。通過這個作業(yè)練習,幫助大家熟悉神經(jīng)元的各種學習算法。
2、神經(jīng)元模型
下面給出神經(jīng)元模型,根據(jù)不同的算法要求:
- 選擇相應的傳遞函數(shù)種類(離散二值函數(shù)、連續(xù) Sigmoid 函數(shù)):除了Perceptron算法選擇二值函數(shù)外,其它都選擇Sigmoid函數(shù),
- 神經(jīng)元權系數(shù)( )都初始化成 0。
3、樣本數(shù)據(jù)
訓練樣本包括 6 個數(shù)據(jù),它們的分布如下圖所示:
▲ 圖1.1.3 神經(jīng)元訓練數(shù)據(jù)【表1-2 樣本數(shù)據(jù)】
序列 | X1 | X2 | 類別 |
---|---|---|---|
1 | -0.1 | 0.3 | 1 |
2 | 0.5 | 0.7 | -1 |
3 | -0.5 | 0.2 | 1 |
4 | -0.7 | 0.3 | 1 |
5 | 0.7 | 0.1 | -1 |
6 | 0.0 | 0.5 | 1 |
import sys,os,math,time import matplotlib.pyplot as plt from numpy import * xdim = [(-0.1,0.3), (0.5,0.7), (-0.5,0.2),(-0.7,0.3),(0.7,0.1),(0,0.5)] ldim = [1,-1,1,1,-1,1] print("序列", "X1", "X2", "類別") count = 0 for x,l in zip(xdim, ldim): count += 1 print("%d %3.1f %3.1f %d"%(count, x[0], x[1], l)) if l > 0: marker = 'o' color = 'blue' else: marker = '+' color = 'red' plt.scatter(x[0], x[1], marker=marker, c=color) plt.text(x[0]+0.05,x[1],'(%3.1f,%3.1f)'%(x[0],x[1])) plt.axis([-0.8, 0.8,-0.1, 1]) plt.xlabel("X1") plt.ylabel("X2") plt.grid(True) plt.tight_layout() plt.show()
二、作業(yè)要求
1、必做內(nèi)容
1. 給出每個學習算法核心代碼;
2. 給出經(jīng)過一輪樣本學習之后神經(jīng)元的權系數(shù)數(shù)值結(jié)果(w1,w2,b);* 權系數(shù)初始化為 0;* 學習速率 ; * 訓練樣本按照 表格1-2 的順序?qū)ι窠?jīng)元進行訓練;
2、選做內(nèi)容
1. 在坐標系中繪制出經(jīng)過一輪訓練之后,權系數(shù)(w1,w2)所在的空間位置;
2. 簡單討論一下不同算法對于神經(jīng)元權系數(shù)的影響;
import sys,os,math,time import matplotlib.pyplot as plt from numpy import * xdim = [(-0.1,0.3), (0.5,0.7), (-0.5,0.2),(-0.7,0.3),(0.7,0.1),(0,0.5)] ddim = [1,-1,1,1,-1,1] def sigmoid(x): return 1/(1+exp(-x)) def hebbian(w,x,d): x1 = [1,x[0],x[1]] net = sum([ww*xx for ww,xx in zip(w, x1)]) o = sigmoid(net) w1 = [ww+o*xx for ww,xx in zip(w,x1)] return w1 def perceptron(w,x,d): x1 = [1,x[0],x[1]] net = sum([ww*xx for ww,xx in zip(w, x1)]) o = 1 if net >= 0 else -1 w1 = [ww+(d-o)*xx for ww,xx in zip(w,x1)] return w1 def delta(w,x,d): x1 = [1,x[0],x[1]] net = sum([ww*xx for ww,xx in zip(w, x1)]) o = sigmoid(net) o1 = o*(1-o) w1 = [ww+(d-o)*o1*xx for ww,xx in zip(w,x1)] return w1 def widrawhoff(w,x,d): x1 = [1,x[0],x[1]] net = sum([ww*xx for ww,xx in zip(w, x1)]) o = sigmoid(net) w1 = [ww+(d-o)*xx for ww,xx in zip(w,x1)] return w1 def correlation(w,x,d): x1 = [1,x[0],x[1]] w1 = [ww+d*xx for ww,xx in zip(w,x1)] return w1 wb = [0,0,0] # [b, w1, w2] for x,d in zip(xdim, ddim): wb = correlation(wb,x,d) print(wb)
02 感知機
一、感知機算法求解分類問題
1、樣本數(shù)據(jù)
利用單個神經(jīng)元求解下面分類問題。數(shù)據(jù)具有兩種表示形式:一種是二進制(0,1)表示形式,另一種是雙極性(-1,1)表示形式。
▲ 圖2.1.1 分類數(shù)據(jù)及其在三維坐標中的位置2、作業(yè)要求
- 繪制出網(wǎng)絡結(jié)構(gòu)圖,并給出算法核心代碼;
- 對比不同學習速率對于訓練收斂的影響;
- 對比不同數(shù)據(jù)表達式方式(二進制、雙極性)對于收斂的影響。
二、感知機識別字母
1、樣本數(shù)據(jù)
如下是三個字母 C,H,L 的 5×5 的點陣圖。
▲ 圖2.2.1 C,H,L字母的點陣圖給它們添加噪聲,形成帶有噪聲的樣本,噪聲樣本與正確樣本之間的海明距離(Hamming Distance)為1,即兩個二值向量之間不相同元素的個數(shù)為1,下面是三個字母的噪聲樣本的示例:
▲ 圖2.2.2 與三個字母Hamming距離為1的噪聲樣本帶有噪聲的樣本可以在原有正確樣本的基礎上,隨機選擇一個元素,將其從原來的0或者1,改變成1,或者0。因此字母C,H,L各自有25個與其Hamming距離為1的帶有噪聲的樣本。
按照這種方式還可以構(gòu)造出帶有兩個噪聲點的數(shù)據(jù)集合,也就是隨機在字符點陣圖上選擇兩個點,將其數(shù)據(jù)進行修改,帶有兩個噪聲的樣本有 個。
2、作業(yè)基本要求
- 建立由三個神經(jīng)元組成的簡單感知機網(wǎng)絡,完成上述三個字母的識別訓練;
- 測試訓練之后的網(wǎng)絡在帶有一個噪聲點的數(shù)據(jù)集合上的識別效果;
3、選做內(nèi)容
- 測試上述感知機網(wǎng)絡在兩個噪聲點的數(shù)據(jù)集合上的識別效果;
- 對比以下兩種情況訓練的感知機的性能。
- 第一種情況:只使用沒有噪聲的三個字母進行訓練;
- 第二種情況:使用沒有噪聲和有一個噪聲點的樣本進行訓練;
- 對比不同的學習速率對于訓練過程的影響。
對比上面兩種訓練情況在兩個噪聲點數(shù)據(jù)集合上的識別效果。
03 Adaline網(wǎng)絡
□ 這是選擇題目。
一、題目內(nèi)容
1、背景介紹
自適應線性神經(jīng)元 ADALINE(Adatpive Linear Neuron)是由 Bernard Widrow 與 Ted Hoff 在 1959年提出的算法。關于他們提出算法前后的故事,大家可以參照網(wǎng)文:The ADALINE - Theory and Implementation of the First Neural Network Trained With Gradient Descent[2] 進行了解。
下面也是根據(jù)上述網(wǎng)文中所介紹的兩種鳥類(貓頭鷹與信天翁)數(shù)據(jù)集合,產(chǎn)生相應的分類數(shù)據(jù)集合。大家使用 ADALINE 算法完成它們的分類器算法。
▲ 圖3.1.1 貓頭鷹與信天翁2、樣本數(shù)據(jù)
(1)數(shù)據(jù)參數(shù)
根據(jù)Wikipedia 中關于 信天翁 Wandering albatross[3] 和 貓頭鷹( Great horned owl[4] )的相關數(shù)據(jù),這兩種鳥類的題中和翼展長度如下表所示。
【表1-3 兩種鳥類的體型數(shù)據(jù)】
種類 | 體重(kg) | 翼展(m) |
---|---|---|
信天翁 | 9 | 3 |
貓頭鷹 | 1.2 | 1.2 |
使用計算機產(chǎn)生兩個鳥類體型隨機數(shù)據(jù)數(shù)據(jù),下表給出了每一類數(shù)據(jù)產(chǎn)生的參數(shù):
【表1-4 兩類鳥類數(shù)據(jù)產(chǎn)生參數(shù)】
鳥類 | 體重平均值 | 體重方差 | 翼展平均值 | 翼展方差 | 個數(shù) | 分類 |
---|---|---|---|---|---|---|
信天翁 | 9000 | 800 | 300 | 20 | 100 | 1 |
貓頭鷹 | 1000 | 200 | 100 | 15 | 100 | -1 |
(2)Python示例代碼
下面給出了產(chǎn)生隨機樣本數(shù)據(jù)的 Python 示例代碼。大家可以參照這些代碼,使用自己熟悉的 編程語言來實現(xiàn)。
def species_generator(mu1, sigma1, mu2, sigma2, n_samples, target, seed): '''creates [n_samples, 2] array Parameters ---------- mu1, sigma1: int, shape = [n_samples, 2] mean feature-1, standar-dev feature-1 mu2, sigma2: int, shape = [n_samples, 2] mean feature-2, standar-dev feature-2 n_samples: int, shape= [n_samples, 1] number of sample cases target: int, shape = [1] target value seed: int random seed for reproducibility Return ------ X: ndim-array, shape = [n_samples, 2] matrix of feature vectors y: 1d-vector, shape = [n_samples, 1] target vector ------ X''' rand = np.random.RandomState(seed) f1 = rand.normal(mu1, sigma1, n_samples) f2 = rand.normal(mu2, sigma2, n_samples) X = np.array([f1, f2]) X = X.transpose() y = np.full((n_samples), target) return X, y▲ 圖3.1.2 產(chǎn)生兩類數(shù)據(jù)的分布
二、作業(yè)要求
1. 構(gòu)造一個 ADALINE 神經(jīng)元,完成上述兩類鳥類的分類。由于需要進行分類,在對 ADALINE 的輸出在經(jīng)過一個符號函數(shù)(sgn)便可以完成結(jié)果的分類;
2. 利用上述數(shù)據(jù)對 ADALINE 進行訓練。觀察記錄訓練誤差變化的曲線。
3. 討論不同的學習速率對于訓練結(jié)果的影響,看是否存在一個數(shù)值,當學習速率超過這個數(shù)值之后,神經(jīng)元訓練過程不再收斂。