超限学习机(ExtremeLearningMachine,ELM)

超限学习机


X = ( x 11 , x 21 , . . . , x N 1 x 21 , x 22 , . . . , x N 2 . . . x n 1 , x n 2 , . . . , x n N ) 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 )
样本空间 X n N X_{n*N} 为N个样本,n个特征的矩阵。
进行扩展后令:
X ( n + 1 ) N = ( X n N , b N 1 ) X'_{(n+1)*N}=(X_{n*N},b_{N*1})
即:
X ( n + 1 ) N = ( x 11 , x 21 , . . . , x N 1 x 21 , x 22 , . . . , x N 2 . . . x n 1 , x n 2 , . . . , x n N 1 , 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 )
其中 b N 1 b_{N*1} 为元素为1的行向量,表示偏置。

构建随机矩阵 W N ( n + 1 ) W_{N*(n+1)}

若W中的元素都是取自一个连续分布,激活函数f(X)为一个无穷连续可导的非多项式函数,则矩阵:
f ( W X ) f(WX)
是一个依概率1为可逆的矩阵。这样隐层权矩阵是不需要学习的,只需要学习从隐层到输出层的权矩阵 β \beta , w β w和\beta 即为超限学习机的模型,其中w为一个固定的随机矩阵, β \beta 是通过计算得到的参数(也是该模型中唯一的参数),如果取实际输出等于期望输出,这是一个求逆矩阵或M-P广义逆矩阵的过程。对于权矩阵行数小于样本数的情况也采用相同的方法来处理。即:
β H = Y \beta H=Y
其中:
H = f ( W X ) , H H=f(WX), H表示第二层的权重
则:
β = Y H + \beta =YH^+
其中 H + H^+ 表示 H H 的M-P广义逆。
正则化求权矩阵\beta ,对式子
β H = Y \beta H=Y
转换为:
β H H T = Y H T \beta HH^T=YH^T
由于 H H T HH^T 是半正定矩阵,可以进行正则化,即将 H H T HH^T 修改为 λ I + H H T \lambda I+HH^T 后,即:
β ( λ I + H H T ) = Y H T \beta (\lambda I+HH^T)=YH^T
其中 λ > 0 \lambda >0 是一个常数,而 I I 是一个单位矩阵,从而有
β = Y H T ( λ I + H H T ) 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在训练和预测中为同一个。

猜你喜欢

转载自blog.csdn.net/mbshqqb/article/details/84378402