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
相关产品推荐
相关产品推荐

