You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中PSVM处理MNIST数据集时矩阵索引维度超限问题

排查PSVM代码维度错误的关键点

首先得说,你遇到的这个问题根源其实和独热编码的格式、PSVM的二分类特性不匹配有关,咱们一步步拆解:

1. 独热编码里没有-1,筛选逻辑完全不对

你的d是(10000,10)的独热编码矩阵,里面只有0和1,根本不存在值为-1的元素!所以find(d==-1)会返回空索引,而find(d==1)拿到的是整个矩阵中所有等于1的位置的线性索引(比如第i行第j列的1,索引是i + (j-1)*10000),这个索引数值远大于A的行数10000,用它去取A的行肯定会触发维度超出错误。

2. PSVM是二分类算法,直接用10分类独热编码不兼容

PSVM本身是为二分类设计的,而MNIST是10分类任务。你得先把10分类转换成二分类问题(比如一对多、一对一策略),再处理标签:

  • 比如做“数字0 vs 其他”的二分类:把原本独热编码中对应0的列里的1保留为1,其他所有样本的标签设为-1;
  • 或者针对每一对类别(比如1和2)单独训练PSVM,再集成结果。

3. 修正标签筛选的正确姿势

假设你现在要做某一类(比如类别k)和其他类的二分类,正确的标签处理应该是这样:

% 先从独热编码d中提取每个样本的真实类别(每行最大值的索引)
labels = argmax(d, 2); % 得到(10000,1)的列向量,每个元素是0-9的类别

% 选择目标类别,比如类别0,生成二分类标签
binary_labels = ones(size(labels));
binary_labels(labels ~= 0) = -1;

% 再筛选对应的样本矩阵
ma = A(binary_labels == 1, :); % 类别0的样本
mb = A(binary_labels == -1, :); % 其他类的样本

这样就能避免索引超出的问题,同时符合PSVM的二分类输入要求啦。

内容的提问来源于stack exchange,提问作者Bogorovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:45:55