我在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
我制作了一些示例代码,以便重现这个问题:
%创建合成数据集。双变量高斯混合p1 = 0.7;p2 = 1 - p1;%数据点数量N = 50;%均值mu1 = [0; 0];mu2 = [2.5; 2.5];%协方差Sigma = eye(2);%损失矩阵L = [0 1; 1 0];%创建数据,2个类别D1 = mvnrnd(mu1, Sigma, round(N*p1));D2 = mvnrnd(mu2, Sigma, round(N*p2));% 使用kNN分类器可视化决策边界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)); %<----- 问题?axis tighttitle(['k = ' num2str(k)]);
我的函数kNNdbEval如下:
function dbEval = kNNdbEval(x,y,X1,X2,k,L);%通过模式识别中的公式2.116计算决策边界%%X1:类别1的数据%X2:类别2的数据%x:要评估点的第一个坐标%y:要评估点的第二个坐标%k:最近邻参数%dbEval=x.^2+y*x+sqrt(x.^2+y.^2);[N1 d] = size(X1);[N2 d] = size(X2);%估计先验概率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搜索组成)在任何点上不一定正好为零,但我有兴趣检测它何时从正值变为负值。关于如何让ezplot达到这个目的,或者通过其他方法,有什么建议吗?
回答:
我找到了使用下载的工具箱的方法,效果很好:http://cmp.felk.cvut.cz/cmp/software/stprtool/dwstprtool.html
如何获得附件中图形的详细步骤可以从包中的pboundary.m文件中了解: