
#includeiostream#includevector#includestring#includemap#includealgorithm#includestdexcept// 计算混淆矩阵// group: 真实标签// grouphat: 预测标签// order: 指定行列的顺序可选。若为空则自动使用所有出现过的唯一标签按字典序std::vectorstd::vectorintconfusionmat(conststd::vectorstd::stringgroup,conststd::vectorstd::stringgrouphat,conststd::vectorstd::stringorder{}){if(group.size()!grouphat.size()){throwstd::invalid_argument(group and grouphat must have the same number of observations.);}// 1. 确定标签顺序std::vectorstd::stringlabelsorder;if(labels.empty()){std::mapstd::string,booluniqueLabels;for(size_t i0;igroup.size();i){if(!group[i].empty())uniqueLabels[group[i]]true;if(!grouphat[i].empty())uniqueLabels[grouphat[i]]true;}for(constautopair:uniqueLabels){labels.push_back(pair.first);}}// 建立标签到索引的映射std::mapstd::string,intlabelToIdx;for(size_t i0;ilabels.size();i){labelToIdx[labels[i]]static_castint(i);}// 2. 初始化混淆矩阵labels.size() x labels.size()全 0size_t nlabels.size();std::vectorstd::vectorintC(n,std::vectorint(n,0));// 3. 填充混淆矩阵for(size_t k0;kgroup.size();k){// 跳过包含缺失值的样本用空字符串模拟 NaNif(group[k].empty()||grouphat[k].empty())continue;autoitTruelabelToIdx.find(group[k]);autoitPredlabelToIdx.find(grouphat[k]);// 标签不在指定 order 内则跳过对应行列保持 0if(itTruelabelToIdx.end()||itPredlabelToIdx.end())continue;C[itTrue-second][itPred-second];}returnC;}// 辅助函数打印混淆矩阵及标签顺序voidprintConfusionMatrix(conststd::vectorstd::vectorintC,conststd::vectorstd::stringlabels){std::coutOrder: ;for(size_t k0;klabels.size();k){if(k0)std::cout ;std::coutlabels[k];}std::cout\n;for(size_t i0;iC.size();i){for(size_t j0;jC[i].size();j){if(j0)std::cout ;std::coutC[i][j];}std::cout\n;}}intmain(){// 示例 1基本用法自动推断 orderstd::vectorstd::stringtrueLabels{1,1,2,2,3,3};std::vectorstd::stringpredLabels{1,1,2,3,4,};// 模拟 NaNautoC1confusionmat(trueLabels,predLabels);std::vectorstd::stringinferredOrder{1,2,3,4};std::cout Example 1 std::endl;printConfusionMatrix(C1,inferredOrder);// 示例 2指定 orderstd::cout\n Example 2 (specified order) std::endl;std::vectorstd::stringcustomOrder{4,3,2,1};autoC2confusionmat(trueLabels,predLabels,customOrder);printConfusionMatrix(C2,customOrder);return0;}