#include<iostream>#include<vector>#include<string>#include<map>#include<algorithm>#include<stdexcept>// 计算混淆矩阵// group: 真实标签// grouphat: 预测标签// order: 指定行列的顺序(可选)。若为空,则自动使用所有出现过的唯一标签(按字典序)std::vector<std::vector<int>>confusionmat(conststd::vector<std::string>&group,conststd::vector<std::string>&grouphat,conststd::vector<std::string>&order={}){if(group.size()!=grouphat.size()){throwstd::invalid_argument("group and grouphat must have the same number of observations.");}// 1. 确定标签顺序std::vector<std::string>labels=order;if(labels.empty()){std::map<std::string,bool>uniqueLabels;for(size_t i=0;i<group.size();++i){if(!group[i].empty())uniqueLabels[group[i]]=true;if(!grouphat[i].empty())uniqueLabels[grouphat[i]]=true;}for(constauto&pair:uniqueLabels){labels.push_back(pair.first);}}// 建立标签到索引的映射std::map<std::string,int>labelToIdx;for(size_t i=0;i<labels.size();++i){labelToIdx[labels[i]]=static_cast<int>(i);}// 2. 初始化混淆矩阵(labels.size() x labels.size(),全 0)size_t n=labels.size();std::vector<std::vector<int>>C(n,std::vector<int>(n,0));// 3. 填充混淆矩阵for(size_t k=0;k<group.size();++k){// 跳过包含缺失值的样本(用空字符串模拟 NaN)if(group[k].empty()||grouphat[k].empty())continue;autoitTrue=labelToIdx.find(group[k]);autoitPred=labelToIdx.find(grouphat[k]);// 标签不在指定 order 内则跳过(对应行列保持 0)if(itTrue==labelToIdx.end()||itPred==labelToIdx.end())continue;C[itTrue->second][itPred->second]++;}returnC;}// 辅助函数:打印混淆矩阵及标签顺序voidprintConfusionMatrix(conststd::vector<std::vector<int>>&C,conststd::vector<std::string>&labels){std::cout<<"Order: ";for(size_t k=0;k<labels.size();++k){if(k>0)std::cout<<" ";std::cout<<labels[k];}std::cout<<"\n";for(size_t i=0;i<C.size();++i){for(size_t j=0;j<C[i].size();++j){if(j>0)std::cout<<" ";std::cout<<C[i][j];}std::cout<<"\n";}}intmain(){// 示例 1:基本用法(自动推断 order)std::vector<std::string>trueLabels={"1","1","2","2","3","3"};std::vector<std::string>predLabels={"1","1","2","3","4",""};// "" 模拟 NaNautoC1=confusionmat(trueLabels,predLabels);std::vector<std::string>inferredOrder={"1","2","3","4"};std::cout<<"=== Example 1 ==="<<std::endl;printConfusionMatrix(C1,inferredOrder);// 示例 2:指定 orderstd::cout<<"\n=== Example 2 (specified order) ==="<<std::endl;std::vector<std::string>customOrder={"4","3","2","1"};autoC2=confusionmat(trueLabels,predLabels,customOrder);printConfusionMatrix(C2,customOrder);return0;}C++代码实现MATLAB中的confusionmat函数功能
RELATED READING
延伸阅读
更多一线实战笔记与深度复盘,助您持续精进