超限学习机
样本空间 为N个样本,n个特征的矩阵。
进行扩展后令:
即:
其中 为元素为1的行向量,表示偏置。
构建随机矩阵
若W中的元素都是取自一个连续分布,激活函数f(X)为一个无穷连续可导的非多项式函数,则矩阵:
是一个依概率1为可逆的矩阵。这样隐层权矩阵是不需要学习的,只需要学习从隐层到输出层的权矩阵
,
即为超限学习机的模型,其中w为一个固定的随机矩阵,
是通过计算得到的参数(也是该模型中唯一的参数),如果取实际输出等于期望输出,这是一个求逆矩阵或M-P广义逆矩阵的过程。对于权矩阵行数小于样本数的情况也采用相同的方法来处理。即:
其中:
则:
其中
表示
的M-P广义逆。
正则化求权矩阵\beta ,对式子
转换为:
由于
是半正定矩阵,可以进行正则化,即将
修改为
后,即:
其中
是一个常数,而
是一个单位矩阵,从而有
正则化优势在于在没有损失精度的条件下,计算速度提高很多。
为了进行二维绘图,我们将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在训练和预测中为同一个。