Следующая функция ( knn_test ) принимает следующие параметры: X обозначает выборки набора данных, Y обозначает метки набора данных и filterindex соответствует фильтру столбца. Если я хочу фильтровать данные, filterIndex устанавливается в 1, в зависимости от того, какой столбец должен быть отфильтрован. Я хочу проверить два метода удержания. Один с функцией crossval , а другой с функцией cvpartition . Но когда я вызываю этот метод, переменные acc1 и acc2 показывают разные значения.
Я добавил точку останова в код и отладил код. Я изучил свойство раздела CVKNNModels, и то же самое было и с разделом de c в Model 2.
Что могло пойти не так в следующем коде?
Почему эти две переменные точности принимали разныезначения?
Если я хочу использовать эту функцию для удержания классификации, какую модель мне выбрать?
Спасибо.
function [acc1,acc2]=knn_test(X,Y,filterIndex)
columnfilterIndex = find(filterIndex==1);
%Model 1
tra1Data = X(:,[columnfilterIndex]);
tra1Label=Y;
KNNModel1=fitcknn(tra1Data, tra1Label, 'Distance', 'Euclidean', 'NumNeighbors', 3, 'DistanceWeight', 'Equal', 'Standardize', true);
rng('default');
CVKNNModel = crossval(KNNModel1,'holdout',0.3);
loss=kfoldLoss(CVKNNModel);
acc1=1-loss;
%Model 2
rng('default');
c = cvpartition(Y,'HoldOut',0.3);
tra2Data=X(c.training,[columnfilterIndex]);
tra2Label=Y(c.training,:);
test2Data=X(c.test,[columnfilterIndex]);
test2Label=Y(c.test,:);
KNNModel2 = fitcknn(tra2Data,tra2Label,'Distance', 'Euclidean','NumNeighbors',3, 'DistanceWeight', 'Equal','Standardize', true);
pre_test = predict(KNNModel2,test2Data);
correctPredictions = (pre_test == test2Label);
acc2 = sum(correctPredictions)/length(correctPredictions);
%perf=classperf(uint8(test2Label),uint8(pre_test));
%acc2=perf.CorrectRate;