ELM回归模型K折交叉验证出现矩阵形状不匹配报错如何解决
报错原因
你遇到的维度不匹配报错,根源是两处核心逻辑错误:
- 混淆了数据索引和实际数据/标签:计算隐层输出、输出权重、预测时,你传入的是
train_folds_idx/valid_folds_idx这两个存储样本索引的列表,而非索引对应的特征数据X、标签数据y;且ELM的输出权重需要用训练集隐层输出的伪逆乘训练集标签y,而非验证集索引。 - K折交叉验证逻辑错误:K折需要逐折遍历训练验证,你没有写循环逻辑,直接把5折的全部索引整体传入计算,自然维度不匹配。
报错的直接触发点:你将shape为(5,640)的折索引列表传入hidden_nodes和input_weights(shape为(特征数,26))做矩阵乘法,矩阵运算要求前一个矩阵的列数等于后一个矩阵的行数,640≠26因此触发报错。
修正后的完整代码
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from sklearn.model_selection import KFold from numpy.linalg import pinv from sklearn.metrics import mean_squared_error # 可自行替换为需要的评估指标 # 读取数据集 dataset = pd.read_excel("ss.xls") X = dataset.iloc[:,:-1].values y = dataset.iloc[:,-1:].values # 特征归一化 scaler = MinMaxScaler() X = scaler.fit_transform(X) # K折交叉验证参数设置 kfolds = KFold(n_splits=5, random_state=16, shuffle=False) # ELM模型参数设置 input_size = X.shape[1] hidden_size = 26 # ELM输入层权重和偏置仅需随机初始化一次,无需迭代更新 input_weights = np.random.normal(size=[input_size, hidden_size]) biases = np.random.normal(size=[hidden_size]) # 激活函数 def relu(x): return np.maximum(x, 0, x) # 隐层输出计算 def hidden_nodes(X): G = np.dot(X, input_weights) G = G + biases H = relu(G) return H # 预测函数 def predict(X, output_weights): out = hidden_nodes(X) out = np.dot(out, output_weights) return out # 逐折训练验证 fold_metrics = [] for fold, (train_idx, valid_idx) in enumerate(kfolds.split(X)): # 按索引提取当前折的训练、验证数据 X_train, X_valid = X[train_idx], X[valid_idx] y_train, y_valid = y[train_idx], y[valid_idx] # 计算当前折的输出权重 H_train = hidden_nodes(X_train) output_weights = np.dot(pinv(H_train), y_train) # 预测并计算评估指标 y_pred = predict(X_valid, output_weights) mse = mean_squared_error(y_valid, y_pred) fold_metrics.append(mse) print(f"第{fold+1}折验证MSE:{mse:.4f}") # 输出5折交叉验证平均结果 print(f"5折交叉验证平均MSE:{np.mean(fold_metrics):.4f}")
修改说明
- 补全了缺失的依赖库导入,将X和y转为numpy数组方便索引取值
- 增加了K折逐折遍历逻辑,每轮按索引取对应训练、验证数据
- 修正了输出权重的计算逻辑,用训练集隐层输出的伪逆乘训练集标签得到输出权重
- 预测时传入的是验证集特征数据而非索引,符合模型输入要求
内容的提问来源于stack exchange,提问作者sera
相关产品推荐
相关产品推荐

