Проблемы с использованием ezplot с неявной функцией - PullRequest
1 голос
/ 25 ноября 2011

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

enter image description here

1 Ответ

1 голос
/ 28 ноября 2011

Я понял, как это сделать, используя загруженный набор инструментов, который работал очень хорошо: http://cmp.felk.cvut.cz/cmp/software/stprtool/dwstprtool.html

Подробную информацию о том, как приступить к получению прилагаемой фигуры, можно узнать из пакета pboundary.m: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...