2015-09-19 3 views
0

Поэтому я хочу использовать данные, которые я определил ниже (имеет две метки), и использовать KNN для обучения и тестирования, а также для перекрестной проверки. Я не мог найти полезные учебники MATLAB, поэтому я ценю это, если вы, ребята, можете мне помочь.KNN Matlab Train Test Cross-validation

Представьте меня

Data=rand(2000,2); 
Lables=[ones(1000,1);-1*ones(1000,1)]; 

Я хочу использовать Knn и есть:

  • 50% данных для обучения
  • 25% перекрестной проверки
  • 25% тестирование

ответ

0

Данные, которые вы дали, не так хороши d ata-set, так как между двумя наборами нет дисперсии. Вы должны использовать

Data = [rand(1000,2)+delta;rand(1000,2)-delta]; 

Самый большой треугольник, тем легче было бы классифицировать Идея, лежащая в Knn, что вам не нужно никакой подготовки.

Предположим, у вас есть набор данных с N отмеченными значениями. Теперь предположим, что у вас есть запись, которую вы хотите классифицировать.

Если вы рассматриваете классификатор 1-NN, вы вычисляете расстояние между входом и примером обучения, отмеченным знаком N. Вход, классифицированный как ярлык примера с кратчайшим расстоянием.

В классификаторе k-NN вы проверяете, каковы метки k примеров с кратчайшим расстоянием. Класс с наибольшим количеством побед NN.

В MATLAB вы можете использовать либо knnserach для поиска ближайших k-индексов, либо просто использовать knnclassify для получения метки.

вот пример для knnserach

delta = 0.3; 
N1 = 50; 
N2 = 50; 
Data1 = rand(1000,2)+delta; 
Data2 = rand(1000,2)-delta; 
train = [Data1(1:N1,:);Data2(1:N2,:)]; % create a training set 
labels = [ones(N1,1);-1*ones(N2,1)]; % create labels for the training 
plot(train(1:N1,1),train(1:N1,2),'xb',train(N1+1:end,1),train(N1+1:end,2),'or') 
k = 7; % Can't be an even number 
idx = knnsearch(train,Data1(N1+1:end,:),'K',k); % classify for the rest of data 1 
res1 = 0; 
for i=1:size(idx,1) 
    if sum(labels(idx(i,:))) < 0; 
     res1 = res1 + 0; % wrong answer 
    else 
     res1 = res1 + 1; % correct answer 
    end 
end 
idx2 = knnsearch(train,Data2(N2+1:end,:),'K',k); % classify for the rest of data 2 
res2 = 0; 
for i=1:size(idx2,1) 
    if sum(labels(idx2(i,:))) > 0; 
     res2 = res2 + 0; % wrong answer 
    else 
     res2 = res2 + 1; % correct answer 
    end 
end 
corr = res1+res2; 
tot = size(idx2,1)+size(idx,1); 
fprintf('Classified %d right out of %d. %.2f correct\n',corr,tot,corr/tot * 100) 

 Смежные вопросы

  • Нет связанных вопросов^_^