超限学习机(ExtremeLearningMachine,ELM)

本文深入探讨了超限学习机(ELM)的工作原理,详细解释了如何通过构建随机矩阵和使用激活函数使隐层权矩阵成为可逆矩阵。ELM仅需学习从隐层到输出层的权矩阵,简化了神经网络的学习过程。文中还提供了基于Python的实现代码,展示了如何使用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 )X=x11,x21,...,xN1x21,x22,...,xN2...xn1,xn2,...,xnN
样本空间Xn∗NX_{n*N}XnN为N个样本,n个特征的矩阵。
进行扩展后令:
X(n+1)∗N′=(Xn∗N,bN∗1)X'_{(n+1)*N}=(X_{n*N},b_{N*1})X(n+1)N=(XnN,bN1)
即:
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 )X(n+1)N=x11,x21,...,xN1x21,x22,...,xN2...xn1,xn2,...,xnN1,1,...,1
其中bN∗1b_{N*1}bN1为元素为1的行向量,表示偏置。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值