1. 程式人生 > >超限學習機(ExtremeLearningMachine,ELM)

超限學習機(ExtremeLearningMachine,ELM)

超限學習機


X=(x11,x21,...,xN1x21,x22,...,xN2...xn1,xn2,...,xnN)X=\left( \begin{matrix} x_{11},x_{21},...,x_{N1} \\ x_{21},x_{22},...,x_{N2}\\.\\.\\.\\x_{n1},x_{n2},...,x_{nN} \end{matrix} \right )
樣本空間XnNX_{n*N}為N個樣本,n個特徵的矩陣。
進行擴充套件後令:
X
(n+1)N=(XnN,bN1)X'_{(n+1)*N}=(X_{n*N},b_{N*1})

即:
X(n+1)N=(x11,x21,...,xN1x21,x22,...,xN2...xn1,xn2,...,xnN1,1,...,1)X'_{(n+1)*N}=\left( \begin{matrix} x_{11},x_{21},...,x_{N1} \\ x_{21},x_{22},...,x_{N2}\\.\\.\\.\\x_{n1},x_{n2},...,x_{nN}\\1,1,...,1 \end{matrix} \right )

其中bN1b_{N*1}為元素為1的行向量,表示偏置。

構建隨機矩陣WN(n+1)W_{N*(n+1)}

若W中的元素都是取自一個連續分佈,啟用函式f(X)為一個無窮連續可導的非多項式函式,則矩陣:
f(WX)f(WX)
是一個依概率1為可逆的矩陣。這樣隱層權矩陣是不需要學習的,只需要學習從隱層到輸出層的權矩陣β\beta, wβw和\beta

即為超限學習機的模型,其中w為一個固定的隨機矩陣,β\beta是通過計算得到的引數(也是該模型中唯一的引數),如果取實際輸出等於期望輸出,這是一個求逆矩陣或M-P廣義逆矩陣的過程。對於權矩陣行數小於樣本數的情況也採用相同的方法來處理。即:
βH=Y\beta H=Y
其中:
H=f(WX),HH=f(WX), H表示第二層的權重
則:
β=YH+\beta =YH^+
其中H+H^+表示HH的M-P廣義逆。
正則化求權矩陣\beta ,對式子
βH=Y\beta H=Y
轉換為:
βHHT=YHT\beta HH^T=YH^T
由於HHTHH^T是半正定矩陣,可以進行正則化,即將HHTHH^T修改為λI+HHT\lambda I+HH^T後,即:
β(λI+HHT)=YHT\beta (\lambda I+HH^T)=YH^T
其中λ>0\lambda >0是一個常數,而II是一個單位矩陣,從而有
β=YHT(λI+HHT)1\beta =YH^T(\lambda I+HH^T)^{-1}
正則化優勢在於在沒有損失精度的條件下,計算速度提高很多。

為了進行二維繪圖,我們將n定為1,即只有一個特徵。

import numpy as np
import matplotlib.pyplot as plt
x_num=100
w_num=16
x=np.linspace(-20,20,x_num)
y=np.sin(x)/x
w = np.random.rand(w_num, 2) - 0.5
def train(x,y,w):
    N = np.size(x, axis=0)
    x = np.reshape(x, (1, N))
    y = np.reshape(y, (1, N))
    ones = np.ones((1, N))
    x = np.vstack((x, ones))

    g = np.dot(w, x)
    h = 1 / (1 + np.exp(-g))
    hn = np.linalg.pinv(h)
    beta = np.dot(y, hn)
    return beta

x_test_num=100
x_test=np.linspace(-10,10,x_test_num)
def predict(x_test,beta,w):
    M=np.size(x_test,axis=0)
    x_test=np.reshape(x_test,(1,M))
    ones=np.ones((1,M))
    x_test=np.vstack((x_test,ones))
    g=np.dot(w,x_test)
    h=1/(1+np.exp(-g))
    y_pre=np.dot(beta,h)
    return y_pre

beta=train(x,y,w)
y_pre=predict(x_test,beta,w)
print(y_pre)

plt.plot(x,y,'b')
plt.plot(x_test,y_pre[0],'r')
plt.show()

需要注意的是w在訓練和預測中為同一個。