多分类问题转换成二分类问题的一个途径,来自opencv sample on boost
N分类问题中,样本总数为T,每个样本维度为M, 一行一个样本,则
样本数组sample = Mat(T,M)
类别数组cls = Mat(T,1) ,
以下的代码进行unrolling
new_sample = Mat(T*N,M+1)
new_cls = Mat(T*N,1)
for (int t = 0; t < T; t++)
{
for (int n = 0; n < N; n++)
{
new_sample(t * N + n,0:M) = sample(t,0:M); //前M维直接从原始样本复制
new_sample(t * N + n, M + 1) = n; //最后一个新增维度是当前类别数目
new_cls(t * N + n,0) = cls(t,0) == n; //0 or 1
}
}
对于boost,训练时需要指定新增的一个维度是CV_VAR_CATEGORICAL
预测阶段,对于每一个样本,要尝试N次,每次用一个类别扩充该样本特征,然后用训练出来的分类器预测这个扩充后的样本是0 or 1,达到分类的目的
但是在char ocr测试中,这种方法的recalling比bpnet低了接近30%