通俗易懂之极限学习机ELM

极限学习机(Extreme Learning Machine,ELM)是一种用于单隐层前馈神经网络(Single Hidden Layer Feedforward Neural Network,SLFN)的训练算法。ELM以其训练速度快、泛化能力强而著称,广泛应用于分类、回归等任务中。本文将详细介绍ELM的基本概念、原理、简单案例、手动计算步骤以及在Python中的实现,包括从零开始编写和利用高级库函数。

1. 基本概念

极限学习机(ELM)

  • 一种用于单隐层前馈神经网络的训练算法。
  • 与传统神经网络不同,ELM随机初始化隐藏层参数(权重和偏置),然后通过求解线性最小二乘问题来确定输出权重。
  • 具有训练速度快、避免局部最优等优势。

单隐层前馈神经网络(SLFN)

  • 由输入层、一个隐藏层和输出层组成。
  • 输入层与隐藏层之间的连接权重随机初始化,且在训练过程中保持不变。
  • 输出层权重通过最小化误差直接确定。

2. 核心原理

ELM的核心思想是:

  1. 随机生成隐藏层的输入权重和偏置,不需要迭代调整。
  2. 计算隐藏层的输出矩阵(H),也称为特征映射矩阵。
  3. 通过线性最小二乘法求解输出层权重β,使得输出值尽可能接近期望值。

数学表达:

假设有训练数据集 { ( 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(Wxi+b)

然后通过最小化误差:

min ⁡ β ∥ H β − Y ∥ 2 \min_{\beta} \|\mathbf{H}\beta - \mathbf{Y}\|^2 βminHβY2

得出输出层权重:

β = H † Y \beta = \mathbf{H}^\dagger \mathbf{Y} β=HY
其中, H † \mathbf{H}^\dagger H H \mathbf{H} H 的伪逆。

3. 简单案例与手动计算

假设我们有一个简单的二分类问题,数据集包含两个特征和一个标签:

样本x1x2y
10.10.21
20.40.20
30.30.61

步骤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.80.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.10.2]

步骤2:计算隐藏层输出(使用激活函数如Sigmoid)

激活函数 g ( z ) = 1 1 + e − z g(z) = \frac{1}{1 + e^{-z}} g(z)=1+ez1

对于样本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.050.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.20.2=0.08+0.020.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+e0.0910.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.1010.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)

解释

  1. 初始化:随机生成权重 W 和偏置 b
  2. 激活函数:支持Sigmoid和ReLU。
  3. 训练 (fit 方法):计算隐藏层输出 H,然后通过伪逆 np.linalg.pinv 计算输出权重 beta
  4. 预测 (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)

解释

  1. 使用hpelm.ELM类初始化ELM模型,指定输入和输出维度。
  2. 添加隐藏层神经元,指定激活函数。
  3. 训练模型,'c'表示分类任务。
  4. 进行预测。

注意hpelm库针对更大规模的数据和更复杂的网络结构进行了优化,适用于实际应用中更加复杂的ELM需求。

5. 总结

极限学习机(ELM)作为一种高效的单隐层前馈神经网络训练方法,以其快速的训练速度和良好的泛化性能在机器学习领域占有一席之地。


如果这篇文章对你有一点点的帮助,欢迎点赞、关注、收藏、转发、评论哦!
我也会在微信公众号“智识小站”坚持分享更多内容,以期记录成长、普及技术、造福后来者!

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智识小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值