极限学习机(Extreme Learning Machine,ELM)是一种用于单隐层前馈神经网络(Single Hidden Layer Feedforward Neural Network,SLFN)的训练算法。ELM以其训练速度快、泛化能力强而著称,广泛应用于分类、回归等任务中。本文将详细介绍ELM的基本概念、原理、简单案例、手动计算步骤以及在Python中的实现,包括从零开始编写和利用高级库函数。
1. 基本概念
极限学习机(ELM):
- 一种用于单隐层前馈神经网络的训练算法。
- 与传统神经网络不同,ELM随机初始化隐藏层参数(权重和偏置),然后通过求解线性最小二乘问题来确定输出权重。
- 具有训练速度快、避免局部最优等优势。
单隐层前馈神经网络(SLFN):
- 由输入层、一个隐藏层和输出层组成。
- 输入层与隐藏层之间的连接权重随机初始化,且在训练过程中保持不变。
- 输出层权重通过最小化误差直接确定。
2. 核心原理
ELM的核心思想是:
- 随机生成隐藏层的输入权重和偏置,不需要迭代调整。
- 计算隐藏层的输出矩阵(H),也称为特征映射矩阵。
- 通过线性最小二乘法求解输出层权重β,使得输出值尽可能接近期望值。
数学表达:
假设有训练数据集 { ( x i , y i ) } i = 1 N \{(x_i, y_i)\}_{i=1}^N {(xi,yi)}i=1N,输入层到隐藏层的权重为 W \mathbf{W} W 和偏置为 b \mathbf{b} b,激活函数为 g ( ⋅ ) g(\cdot) g(⋅),则隐藏层输出矩阵 H \mathbf{H} H 的第 $ i$ 行为:
H i = g ( W ⋅ x i + b ) \mathbf{H}_{i} = g(\mathbf{W} \cdot \mathbf{x}_i + \mathbf{b}) Hi=g(W⋅xi+b)
然后通过最小化误差:
min β ∥ H β − Y ∥ 2 \min_{\beta} \|\mathbf{H}\beta - \mathbf{Y}\|^2 βmin∥Hβ−Y∥2
得出输出层权重:
β
=
H
†
Y
\beta = \mathbf{H}^\dagger \mathbf{Y}
β=H†Y
其中,
H
†
\mathbf{H}^\dagger
H† 是
H
\mathbf{H}
H 的伪逆。
3. 简单案例与手动计算
假设我们有一个简单的二分类问题,数据集包含两个特征和一个标签:
样本 | x1 | x2 | y |
---|---|---|---|
1 | 0.1 | 0.2 | 1 |
2 | 0.4 | 0.2 | 0 |
3 | 0.3 | 0.6 | 1 |
步骤1:随机初始化隐藏层权重和偏置
假设隐藏层有2个神经元,随机生成权重和偏置:
W = [ w 11 w 12 w 21 w 22 ] = [ 0.5 − 0.3 0.8 0.1 ] \mathbf{W} = \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \end{bmatrix} = \begin{bmatrix} 0.5 & -0.3 \\ 0.8 & 0.1 \end{bmatrix} W=[w11w21w12w22]=[0.50.8−0.30.1]
b = [ b 1 b 2 ] = [ 0.1 − 0.2 ] \mathbf{b} = \begin{bmatrix} b_1 \\ b_2 \end{bmatrix} = \begin{bmatrix} 0.1 \\ -0.2 \end{bmatrix} b=[b1b2]=[0.1−0.2]
步骤2:计算隐藏层输出(使用激活函数如Sigmoid)
激活函数 g ( z ) = 1 1 + e − z g(z) = \frac{1}{1 + e^{-z}} g(z)=1+e−z1
对于样本1:
z 1 = 0.5 × 0.1 + ( − 0.3 ) × 0.2 + 0.1 = 0.05 − 0.06 + 0.1 = 0.09 z_1 = 0.5 \times 0.1 + (-0.3) \times 0.2 + 0.1 = 0.05 - 0.06 + 0.1 = 0.09 z1=0.5×0.1+(−0.3)×0.2+0.1=0.05−0.06+0.1=0.09
z 2 = 0.8 × 0.1 + 0.1 × 0.2 − 0.2 = 0.08 + 0.02 − 0.2 = − 0.10 z_2 = 0.8 \times 0.1 + 0.1 \times 0.2 - 0.2 = 0.08 + 0.02 - 0.2 = -0.10 z2=0.8×0.1+0.1×0.2−0.2=0.08+0.02−0.2=−0.10
h 1 = g ( z 1 ) = 1 1 + e − 0.09 ≈ 0.522 h_1 = g(z_1) = \frac{1}{1 + e^{-0.09}} \approx 0.522 h1=g(z1)=1+e−0.091≈0.522
h 2 = g ( z 2 ) = 1 1 + e 0.10 ≈ 0.475 h_2 = g(z_2) = \frac{1}{1 + e^{0.10}} \approx 0.475 h2=g(z2)=1+e0.101≈0.475
同理计算其他样本的 h 1 , h 2 h_1, h_2 h1,h2,得到隐藏层输出矩阵 H \mathbf{H} H。
步骤3:求解输出权重 β \beta β
假设有标签向量 Y = [ 1 , 0 , 1 ] T \mathbf{Y} = [1, 0, 1]^T Y=[1,0,1]T,通过最小二乘法求解:
β = ( H T H ) − 1 H T Y \beta = (\mathbf{H}^T \mathbf{H})^{-1} \mathbf{H}^T \mathbf{Y} β=(HTH)−1HTY
手动计算可能较为繁琐,但上述步骤展示了ELM的基本计算过程。
4. Python编程实现
4.1 从零实现ELM
以下是一个简化的ELM实现示例:
import numpy as np
class ELM:
def __init__(self, input_dim, hidden_units, activation='sigmoid'):
self.input_dim = input_dim
self.hidden_units = hidden_units
# 随机初始化输入权重和偏置
self.W = np.random.randn(self.hidden_units, self.input_dim)
self.b = np.random.randn(self.hidden_units)
# 选择激活函数
if activation == 'sigmoid':
self.activation = self._sigmoid
elif activation == 'relu':
self.activation = self._relu
else:
raise NotImplementedError("Activation function not implemented.")
def _sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def _relu(self, x):
return np.maximum(0, x)
def fit(self, X, Y):
# 计算隐藏层输出
H = self.activation(np.dot(X, self.W.T) + self.b)
# 计算输出权重beta
self.beta = np.linalg.pinv(H).dot(Y)
def predict(self, X):
H = self.activation(np.dot(X, self.W.T) + self.b)
return np.dot(H, self.beta)
# 示例使用
if __name__ == "__main__":
# 训练数据
X = np.array([
[0.1, 0.2],
[0.4, 0.2],
[0.3, 0.6]
])
Y = np.array([1, 0, 1])
# 创建ELM实例
elm = ELM(input_dim=2, hidden_units=2, activation='sigmoid')
# 训练ELM
elm.fit(X, Y)
# 预测
predictions = elm.predict(X)
print("预测结果:", predictions)
解释:
- 初始化:随机生成权重
W
和偏置b
。 - 激活函数:支持Sigmoid和ReLU。
- 训练 (
fit
方法):计算隐藏层输出H
,然后通过伪逆np.linalg.pinv
计算输出权重beta
。 - 预测 (
predict
方法):利用计算得到的beta
对新数据进行预测。
4.2 使用高级库函数实现
虽然ELM没有在标准机器学习库(如scikit-learn)中作为直接的实现,但可以利用现有的矩阵运算和线性代数库来简化实现。此外,有一些第三方库已经实现了ELM,例如hpelm
。
以下示例展示如何使用hpelm
库来实现ELM:
首先,需安装hpelm
:
pip install hpelm
使用hpelm
实现ELM:
import numpy as np
import hpelm
# 训练数据
X = np.array([
[0.1, 0.2],
[0.4, 0.2],
[0.3, 0.6]
])
Y = np.array([1, 0, 1])
# 初始化ELM,输入维度为2,输出维度为1,激活函数为Sigmoid
elm = hpelm.ELM(X.shape[1], 1, classification='c')
# 添加隐藏层神经元,假设有2个
elm.add_neurons(2, 'sigm')
# 训练ELM
elm.train(X, Y, 'c')
# 预测
predictions = elm.predict(X)
print("预测结果:", predictions)
解释:
- 使用
hpelm.ELM
类初始化ELM模型,指定输入和输出维度。 - 添加隐藏层神经元,指定激活函数。
- 训练模型,
'c'
表示分类任务。 - 进行预测。
注意:hpelm
库针对更大规模的数据和更复杂的网络结构进行了优化,适用于实际应用中更加复杂的ELM需求。
5. 总结
极限学习机(ELM)作为一种高效的单隐层前馈神经网络训练方法,以其快速的训练速度和良好的泛化性能在机器学习领域占有一席之地。
如果这篇文章对你有一点点的帮助,欢迎点赞、关注、收藏、转发、评论哦!
我也会在微信公众号“智识小站”坚持分享更多内容,以期记录成长、普及技术、造福后来者!