我正在尝试在MATLAB中使用贝叶斯分类器时可视化决策边界。为此,我编写了一个隐式函数,它使用训练数据来确定数据点P =(x,y)所属的两个类中的哪一个。这样做是评估功能是积极的还是消极的。决策边界对应于函数为零的点。
但是,当尝试使用此功能(存储在单独的.m文件中)时,ezplot无法绘制任何行,而是发出警告: 警告:轮廓未针对常量ZData进行渲染
In contour>parseargs at 204 In contour at 72 In ezplot>ezimplicit at 312 In ezplot at 155
我已经制作了一些示例代码,以便可以重新创建问题:
%Create synthetic dataset. Bivariate gaussian mixture
p1 = 0.7;
p2 = 1 - p1;
%Number of datapoints
N = 50;
%Means
mu1 = [0; 0];
mu2 = [2.5; 2.5];
%Covariance
Sigma = eye(2);
%Loss matrix
L = [0 1; 1 0];
%Create data, 2 classes
D1 = mvnrnd(mu1, Sigma, round(N*p1));
D2 = mvnrnd(mu2, Sigma, round(N*p2));
% Visualize decision boundary using kNN classifier
f2=figure(2);
plot(D1(:,1),D1(:,2),'b.',D2(:,1),D2(:,2),'r.');
hold on;
k=5;
ezp=ezplot(@(x,y) kNNdbEval(x,y,D1,D2,k,L)); %<----- Problem?
axis tight
title(['k = ' num2str(k)]);
我的函数kNNdbEval是:
function dbEval = kNNdbEval(x,y,X1,X2,k,L);
%Calculates decision boundary by eg. 2.116 in Pattern Recognition
%
%X1:Data from class 1
%X2:Data from class 2
%x:1. coordinate of point to evaluate
%y:2. coordinate of point to evaluate
%k:nearest neighbor parameters
%dbEval=x.^2+y*x+sqrt(x.^2+y.^2);
[N1 d] = size(X1);
[N2 d] = size(X2);
%Estimate priors
N = N1+N2;
p1 = N1/N;
p2 = N2/N;
[~, d1] = knnsearch(X1,[x y],'k',k);
d1 = d1(k);
[~, d2] = knnsearch(X2,[x y],'k',k);
d2=d2(k);
dbEval = (N2*(1/(d2)^d))/(N1*(1/(d1)^d)) ...
-((p2*(L(2,1)-L(2,2)))/(p1*(L(1,2)-L(1,1))));
我相信我的分类器运行正常,因为我可以通过评估点所在的平面中的许多点并绘制kNNdbEval接近零的图像来破解决策边界的近似值。见附图。
我怀疑这个功能(由两个knn-searching组成)在任何时候都不一定完全为零,但我有兴趣检测它何时从正变为负。是否有任何想法让ezplot为此工作,或通过其他方法?
答案 0 :(得分:1)
我想出了如何使用下载的工具箱来完成它,该工具箱运行得非常好: http://cmp.felk.cvut.cz/cmp/software/stprtool/dwstprtool.html
可以从包中的pboundary.m了解如何继续获取附图的详细信息: