Не в состоянии правильно классифицировать функции - PullRequest
1 голос
/ 11 января 2012

Я следую примеру на этой странице: Пример 10-кратной классификации SVM в MATLAB .

По сути, я следую примеру, чтобы выполнить свою классификацию.Проблема, с которой я сталкиваюсь, состоит в том, что пред всегда положительный.Он не может обнаружить отрицательные данные.

clear all;
clc;
load('C:\Users\HP\Documents\MATLAB\TrainLabel');
load('C:\Users\HP\Documents\MATLAB\TrainVec');
cvFolds = crossvalind('Kfold', TrainLabel, 10);  
cp = classperf(TrainLabel);   
for i = 1:10                                   
    testIdx = (cvFolds == i);                   
    trainIdx = ~testIdx;                             
%     Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx),'showplot',true); 
    Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx), ...              
     'Autoscale',true, 'Showplot',false, 'Method','QP', ...              
     'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);
    pred = svmclassify(Model, TrainVec(testIdx,:),'Showplot',false);      
    cp = classperf(cp, pred, testIdx);
end 
cp.CorrectRate 
cp.CountingMatrix 

Значения для pred [1; 1; 1; 1; 1; 1], но мой корректный коэффициент равен 0,65 (65%), а TrainLabel <60x1 double> и TrainVec равен <60x5900 double>.

Еще два qns:

  1. должны ли значения TrainLabel быть 0 и 1?это нормально, если это -1 или 1

  2. TrainVec таков, что каждая функция из изображения размещается в ряд.Элемент из следующего изображения находится в следующем ряду.Это правильно?или каждая из функций должна быть размещена в отдельном столбце?

Нужна помощь в этом ... спасибо

Ответы [ 2 ]

4 голосов
/ 11 января 2012

У вас просто много функций.

Вы пытаетесь найти разделяющую 5899-мерную гиперплоскость, используя только 60 тренировочных точек.Это просто не сработает из-за Проклятия размерности (он же эффект Хьюза).

Сначала нужно извлечь соответствующие функции и работать только с ними.Это называется Извлечение функций .

Один простой способ сделать это - использовать pcacov для преобразования ваших данных с использованием Принципиального анализа компонентов , а затем сохранить только определенную часть(используйте третий результат EXPLAINED, чтобы k-PC объяснил уровень дисперсии определенного уровня, например 98%).Это сократит размерность вашей проблемы и, скорее всего, улучшит ваши результаты.

Не забудьте преобразовать все ваши данные, а не только обучающий набор.

Кроме того, ваш подход кажется мне правильным.Различные выборки идут в разных строках, причем их элементы охватывают столбцы.

Вектор метки может быть любым, что вам нужно:

Y является переменной группировки, т. Е. Можетбыть категориальным, числовым или логическим вектором;вектор ячеек строк;или символьная матрица с каждой строкой, представляющей метку класса (см. справку по группировке переменных)

0 голосов
/ 19 января 2012

Масштабировать значения от 0 до 1. Это решит проблему

...