Я пытаюсь визуализировать границы решения при использовании байесовского классификатора в 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-поисков) не обязательно становится абсолютно нулевой в любой точке, но мне интересно узнать, когда она переходит с положительного на отрицательный,Есть идеи, как заставить ezplot работать с этой целью, или каким-либо другим способом?