超限学习机
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}Xn∗N为N个样本,n个特征的矩阵。
进行扩展后令:
X(n+1)∗N′=(Xn∗N,bN∗1)X'_{(n+1)*N}=(X_{n*N},b_{N*1})X(n+1)∗N′=(Xn∗N,bN∗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 )X(n+1)∗N′=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛x11,x21,...,xN1x21,x22,...,xN2...xn1,xn2,...,xnN1,1,...,1⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
其中bN∗1b_{N*1}bN∗1为元素为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在训练和预测中为同一个。