MATLAB - 从分类器生成混淆矩阵
MATLAB - generate confusion matrix from classifier
我有一些测试数据和标签:
testZ = [0.25, 0.29, 0.62, 0.27, 0.82, 1.18, 0.93, 0.54, 0.78, 0.31, 1.11, 1.08, 1.02];
testY = [1 1 1 1 1 2 2 2 2 2 2 2 2];
然后我对它们进行排序:
[sZ, ind] = sort(testZ); %%Sorts Z, and gets indexes of Z
sY = testY(ind); %%Sorts Y by index
[N, n] = size(testZ');
这将给出排序后的 Y 数据。在已排序的 Y 数据的每个元素中,我想 class 将左侧的每个点确认为类型 1,右侧的所有点都为 class 2;然后将对数据的每个点重复此操作。我该怎么做并找出每个元素的变量:
- TP(true positive) - 正确标记为 1
的元素
- FP(false positive) - 元素被错误标记为 1
- TN(true negative) - 正确标记为 2
的元素
- FN(false negatives) - 被错误标记为 2
的元素
这样做的目的是为了让我可以为 classifier 创建一条 ROC 曲线,作为一些学校作业的一部分。
您可以遍历这些点,然后使用逻辑索引和元素智能布尔运算符来获得您想要的大部分内容。
for i = 1:length(sY)
classification = [ones(1,i-1) 2*ones(1,length(sy)-i+1)];
isTruePositive = ( (sY == classification) & (sY == 1) );
numberOfTruePositive = sum(isTruePositive);
% Similar for other cases.
% Use the result in the loop or store it somewhere - as written here
% variables are over-written each iteration in the loop.
end
我没有运行这个,所以你可能需要一些调整,但这应该能帮助你完成大部分工作。
这是绘制 ROC 和查找 AUC 值的代码:
tot_op = testZ;
targets = testY;
th_vals= sort(tot_op);
for i = 1:length(th_vals)
b_pred = (tot_op>=th_vals(i,1));
TP = sum(b_pred == 1 & targets == 2);
FP = sum(b_pred == 1 & targets == 1);
TN = sum(b_pred == 0 & targets == 1);
FN = sum(b_pred == 0 & targets == 2);
sens(i) = TP/(TP+FN);
spec(i) = TN/(TN+FP);
end
figure(2);
cspec = 1-spec;
cspec = cspec(end:-1:1);
sens = sens(end:-1:1);
plot(cspec,sens,'k');
AUC = sum(0.5*(sens(2:end)+sens(1:end-1)).*(cspec(2:end) - cspec(1:end-1)));
fprintf('\nAUC: %g \n',AUC);
以上代码是http://www.dcs.gla.ac.uk/~srogers/firstcourseml/matlab/chapter5/svmroc.html
上给出的修改版本
我有一些测试数据和标签:
testZ = [0.25, 0.29, 0.62, 0.27, 0.82, 1.18, 0.93, 0.54, 0.78, 0.31, 1.11, 1.08, 1.02];
testY = [1 1 1 1 1 2 2 2 2 2 2 2 2];
然后我对它们进行排序:
[sZ, ind] = sort(testZ); %%Sorts Z, and gets indexes of Z
sY = testY(ind); %%Sorts Y by index
[N, n] = size(testZ');
这将给出排序后的 Y 数据。在已排序的 Y 数据的每个元素中,我想 class 将左侧的每个点确认为类型 1,右侧的所有点都为 class 2;然后将对数据的每个点重复此操作。我该怎么做并找出每个元素的变量:
- TP(true positive) - 正确标记为 1 的元素
- FP(false positive) - 元素被错误标记为 1
- TN(true negative) - 正确标记为 2 的元素
- FN(false negatives) - 被错误标记为 2 的元素
这样做的目的是为了让我可以为 classifier 创建一条 ROC 曲线,作为一些学校作业的一部分。
您可以遍历这些点,然后使用逻辑索引和元素智能布尔运算符来获得您想要的大部分内容。
for i = 1:length(sY)
classification = [ones(1,i-1) 2*ones(1,length(sy)-i+1)];
isTruePositive = ( (sY == classification) & (sY == 1) );
numberOfTruePositive = sum(isTruePositive);
% Similar for other cases.
% Use the result in the loop or store it somewhere - as written here
% variables are over-written each iteration in the loop.
end
我没有运行这个,所以你可能需要一些调整,但这应该能帮助你完成大部分工作。
这是绘制 ROC 和查找 AUC 值的代码:
tot_op = testZ;
targets = testY;
th_vals= sort(tot_op);
for i = 1:length(th_vals)
b_pred = (tot_op>=th_vals(i,1));
TP = sum(b_pred == 1 & targets == 2);
FP = sum(b_pred == 1 & targets == 1);
TN = sum(b_pred == 0 & targets == 1);
FN = sum(b_pred == 0 & targets == 2);
sens(i) = TP/(TP+FN);
spec(i) = TN/(TN+FP);
end
figure(2);
cspec = 1-spec;
cspec = cspec(end:-1:1);
sens = sens(end:-1:1);
plot(cspec,sens,'k');
AUC = sum(0.5*(sens(2:end)+sens(1:end-1)).*(cspec(2:end) - cspec(1:end-1)));
fprintf('\nAUC: %g \n',AUC);
以上代码是http://www.dcs.gla.ac.uk/~srogers/firstcourseml/matlab/chapter5/svmroc.html
上给出的修改版本