我需要编写一个代码,用于比较两个向量 - 一个包含参考值,另一个在一些分类过程后获得的值 - 具有相同的大小,并生成一个置信矩阵,显示哪些元素,以及多少个他们被错误分类。
让我们说这些载体是:
ref = [3;3;3;4;4;2;1;3]
和
obt = [4;2;3;1;1;3;4;3]
我希望置信度矩阵为:[0 0 0 1; 0 0 1 0;0 1 2 1 ;2 0 0 0]
怎么做?
感谢
答案 0 :(得分:3)
让我们使用accumarray
和bsxfun
:
如果可能的值始终为1
,2
,3
,... 形式:
ref = [3;3;3;4;4;2;1;3]; %// original values
obt = [4;2;3;1;1;3;4;3]; %// what the original values have been classified as
vals = 1:max([ref(:) obt(:)]); %// all possible values
result = accumarray([ref(:) obt(:)],1);
如果值是任意的:
obt = [.1 .1 5.4 5.4 3 2.2 2.2]; %// original values
ref = [.1 2.2 2.2 5.4 5.4 3 3]; %// what the original values have been classified as
vals = unique([ref(:);obt(:)]); %// all existing values
[~, refv] = max(bsxfun(@eq, ref(:).', vals(:)));
[~, obtv] = max(bsxfun(@eq, obt(:).', vals(:)));
result = accumarray([refv(:) obtv(:)],1);
输入向量可以是行或列可互换。
vals
包含所有可能的值(示例中为[1 2 3 4]
)。 result(m,n)
表示值vals(m)
被归类为vals(m)
的次数。
答案 1 :(得分:2)
num_classes = max([ref;obt]);
mat_classes = zeros(num_classes);
for i = 1:length(ref)
mat_classes(ref(i),obt(i)) = mat_classes(ref(i),obt(i))+1
end
这应该以更简单的方式做你想做的事。
这比Luis Mendo的回应效率低得多。对于matlab中的循环通常不是一个好主意。如果你打算经常使用matlab,你应该使用矢量化。
将其设为启动器http://es.mathworks.com/help/matlab/matlab_prog/vectorization.html
答案 2 :(得分:2)
你想要一个confusion matrix。使用Matlab的confusionmat函数:
>> confusionmat(ref, obt)
ans =
0 0 0 1
0 0 1 0
0 1 2 1
2 0 0 0