人工智能 —— 神经网络 —— 极限学习机(ELM)—— 代码示例
只有训练时候的代码:
import numpy as np
class ELM:
def __init__(self, input_dim, hidden_dim, output_dim, activation='sigmoid'):
"""
标准极限学习机
:param input_dim: 输入特征维度
:param hidden_dim: 隐层节点数
:param output_dim: 输出维度(分类=类别数,回归=1)
:param activation: 激活函数 sigmoid / relu
"""
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.activation = activation
# 随机初始化输入层权重 W 和偏置 b(固定不训练)
self.W = np.random.uniform(-1, 1, (input_dim, hidden_dim))
self.b = np.random.uniform(-1, 1, hidden_dim)
# 输出层权重 β(训练时求解)
self.beta = None
def _activate(self, x):
if self.activation == 'sigmoid':
return 1.0 / (1.0 + np.exp(-x))
elif self.activation == 'relu':
return np.maximum(0, x)
else:
raise ValueError('only sigmoid / relu supported')
def fit(self, X, T):
"""
训练 ELM
:param X: shape [n_samples, input_dim]
:param T: 标签/目标值 [n_samples, output_dim]
"""
# 隐层输出 H = g(XW + b)
H = self._activate(X @ self.W + self.b) # [N, hidden_dim]
# 闭式解 β = H⁺ T
self.beta = np.linalg.pinv(H) @ T
def predict(self, X):
H = self._activate(X @ self.W + self.b)
return H @ self.beta
class RELM:
def __init__(self, input_dim, hidden_dim, output_dim, lam=1e-3, activation='sigmoid'):
"""
正则化极限学习机(L2正则)
:param lam: 正则化系数 lambda
"""
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.lam = lam
self.activation = activation
self.W = np.random.uniform(-1, 1, (input_dim, hidden_dim))
self.b = np.random.uniform(-1, 1, hidden_dim)
self.beta = None
def _activate(self, x):
if self.activation == 'sigmoid':
return 1.0 / (1.0 + np.exp(-x))
elif self.activation == 'relu':
return np.maximum(0, x)
else:
raise ValueError('only sigmoid / relu supported')
def fit(self, X, T):
H = self._activate(X @ self.W + self.b) # [N, h]
# 正则化最小二乘
H_T_H = H.T @ H
I = np.eye(self.hidden_dim)
self.beta = np.linalg.inv(H_T_H + self.lam * I) @ H.T @ T
def predict(self, X):
H = self._activate(X @ self.W + self.b)
return H @ self.beta
if __name__ == '__main__':
# 构造简单正弦回归数据
N = 200
X = np.linspace(0, 2 * np.pi, N).reshape(-1, 1)
y = np.sin(X) + 0.1 * np.random.randn(N, 1)
# ELM
elm = ELM(input_dim=1, hidden_dim=50, output_dim=1)
elm.fit(X, y)
y_pred_elm = elm.predict(X)
# RELM(更稳定)
relm = RELM(input_dim=1, hidden_dim=50, output_dim=1, lam=1e-2)
relm.fit(X, y)
y_pred_relm = relm.predict(X)
print("ELM MSE:", np.mean((y_pred_elm - y) ** 2))
print("RELM MSE:", np.mean((y_pred_relm - y) ** 2))
训练的结果:

训练及测试时候的代码:
import numpy as np
import time
# ====================== 1. 之前定义的 ELM 和 RELM 类 ======================
class ELM:
def __init__(self, input_dim, hidden_dim, output_dim, activation='sigmoid'):
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.activation = activation
self.W = np.random.uniform(-1, 1, (input_dim, hidden_dim))
self.b = np.random.uniform(-1, 1, hidden_dim)
self.beta = None
def _activate(self, x):
if self.activation == 'sigmoid':
return 1.0 / (1.0 + np.exp(-x))
elif self.activation == 'relu':
return np.maximum(0, x)
else:
raise ValueError('only sigmoid / relu supported')
def fit(self, X, T):
H = self._activate(X @ self.W + self.b)
self.beta = np.linalg.pinv(H) @ T
def predict(self, X):
H = self._activate(X @ self.W + self.b)
return H @ self.beta
class RELM:
def __init__(self, input_dim, hidden_dim, output_dim, lam=1e-3, activation='sigmoid'):
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.lam = lam
self.activation = activation
self.W = np.random.uniform(-1, 1, (input_dim, hidden_dim))
self.b = np.random.uniform(-1, 1, hidden_dim)
self.beta = None
def _activate(self, x):
if self.activation == 'sigmoid':
return 1.0 / (1.0 + np.exp(-x))
elif self.activation == 'relu':
return np.maximum(0, x)
else:
raise ValueError('only sigmoid / relu supported')
def fit(self, X, T):
H = self._activate(X @ self.W + self.b)
H_T_H = H.T @ H
I = np.eye(self.hidden_dim)
self.beta = np.linalg.inv(H_T_H + self.lam * I) @ H.T @ T
def predict(self, X):
H = self._activate(X @ self.W + self.b)
return H @ self.beta
# ====================== 2. 生成训练集 & 测试集 ======================
if __name__ == '__main__':
# 回归任务示例(也可以改成分类)
np.random.seed(42)
# 训练数据
N_train = 2000
X_train = np.random.rand(N_train, 5) * 2 * np.pi # 5维输入
y_train = np.sin(X_train).sum(axis=1, keepdims=True) + 0.1 * np.random.randn(N_train, 1)
# 测试数据(对应论文里的 testing samples)
N_test = 481012 # 模拟你论文里的 481,012 测试样本
X_test = np.random.rand(N_test, 5) * 2 * np.pi
y_test = np.sin(X_test).sum(axis=1, keepdims=True) + 0.1 * np.random.randn(N_test, 1)
input_dim = 5
hidden_dim = 100
output_dim = 1
# ====================== ELM 测试 ======================
print("=" * 60)
print(" ELM 测试")
print("=" * 60)
start_train = time.time()
elm = ELM(input_dim, hidden_dim, output_dim)
elm.fit(X_train, y_train)
train_time_elm = time.time() - start_train
start_test = time.time()
y_pred_elm = elm.predict(X_test)
test_time_elm = time.time() - start_test
mse_elm = np.mean((y_pred_elm - y_test) ** 2)
print(f"训练时间: {train_time_elm:.4f} s")
print(f"测试时间: {test_time_elm:.4f} s")
print(f"测试 MSE: {mse_elm:.6f}\n")
# ====================== RELM 正则化 ELM 测试 ======================
print("=" * 60)
print(" RELM 测试")
print("=" * 60)
start_train = time.time()
relm = RELM(input_dim, hidden_dim, output_dim, lam=1e-2)
relm.fit(X_train, y_train)
train_time_relm = time.time() - start_train
start_test = time.time()
y_pred_relm = relm.predict(X_test)
test_time_relm = time.time() - start_test
mse_relm = np.mean((y_pred_relm - y_test) ** 2)
print(f"训练时间: {train_time_relm:.4f} s")
print(f"测试时间: {test_time_relm:.4f} s")
print(f"测试 MSE: {mse_relm:.6f}")
训练的结果:



本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2026-08-03 11:42 Angry_Panda 阅读(1) 评论(0) 收藏 举报
浙公网安备 33010602011771号