Я пытаюсь решить проблему классификации с помощью SVM, в начале мне удалось решить проблему на первом уровне, т.е. классифицировать мои данные на 2 класса (класс1 и класс2). теперь я хочу продолжить классификацию иерархически, т.е. если я хочу разделить второй класс на два класса. есть ли способ сделать это с помощью Matlab SVM. Спасибо
иерархическая классификация с SVM
comment
Не могли бы вы использовать петлю...?
- person Dan   schedule 17.12.2014
comment
на самом деле, я использую следующий код для классификации моих данных на 2 класса model=svmtrain(lab_train,train,'-t 2 -d 2 -c 7 -g 0.5'); [labeltrain,valtrain,prectrain]= svmpredict(lab_train,train,model); [labeltest, valtest, prectest] = svmpredict (lab_test, test, model); и я не знаю, как использовать результат таким образом, что я беру только второй класс и снова классифицирую его на 2 класса
- person user3127771   schedule 17.12.2014
comment
@user3127771 user3127771 Вам следует отредактировать свой вопрос, а не добавлять комментарий.
- person Michaël   schedule 17.12.2014
Ответы (1)
Вы ничего не сказали о своих функциях, потому что после первой классификации вам пришлось бы определять новые функции для нового классификатора.
Вы можете сохранить функции в матрице и использовать их в новом классификаторе.
Поскольку я точно не знаю, в чем ваша проблема, я привел пример без цикла, но вы можете легко перейти на цикл, если хотите.
x1 = 5 * rand(100,1);
y1 = 5 * rand(100,1);
data1 = [x1,y1];
x2 = -5 * rand(100,1);
y2 = 5 * rand(100,1);
data2 = [x2,y2];
x3 = -5 * rand(100,1);
y3 = -5 * rand(100,1);
data3 = [x3,y3];
plot(data1(:,1),data1(:,2),'r.'); hold on
plot(data2(:,1),data2(:,2),'bo');
plot(data3(:,1),data3(:,2),'ms');
data = [data1;data2;data3];
выше мои данные, представляющие точки в 2D-плоскости.
Теперь я разделю их на 2 класса x>0
и x<0
.
label = ones(size(data,1),1);
label(1 : size(data1,1)) = -1;
c1 = svmtrain(data,label,'Kernel_Function','linear','showplot',true);
hold on;
p1 = svmclassify(c1,data);
После первого классификатора я выбираю один класс (x<0
) и определяю новую функцию.
и я разделю их на 2 класса, y>0
и y<0
.
newdata = data(p1 == 1,:);
data1 = newdata(newdata(:,2)>=0,:);
data2 = newdata(newdata(:,2)< 0,:);
data = [data1;data2];
label = ones(size(data,1),1);
label(1 : size(data1,1)) = -1;
c2 = svmtrain(data,label,'Kernel_Function','linear','showplot',true);
Я использовал все данные для обучения, вы также можете настроить это под свою задачу.
person
Rashid
schedule
17.12.2014
для моих данных у меня есть изображения, хранящиеся в матрице формы ‹128x128x512 double›: 256 изображений для первого класса и 256 изображений для класса 2. Во-первых, я извлекаю функции из изображений. мой feture verctor имеет форму ‹512x15104 double›, и я использовал 50% для обучения и 50% для тестирования. и я классифицирую так: model=svmtrain(lab_train,train,'-t 2 -d 2 -c 7 -g 0.5'); [labeltrain,valtrain,prectrain]= svmpredict(lab_train,train,model); [labeltest, valtest, prectest] = svmpredict (lab_test, test, model); где: train — данные обучения, test — данные тестирования
- person user3127771; 17.12.2014
@ user3127771, вы можете добавить это к своему вопросу. Какие функции вы собираетесь использовать для второго классификатора?
- person Rashid; 17.12.2014
для второго классификатора я хочу использовать функции, которые были классифицированы как принадлежащие классу2
- person user3127771; 17.12.2014
@ user3127771, я не это имел в виду. В моем примере я использовал значение
x
в качестве признака для первой классификации и значение y
во второй классификации. В вашем случае я не понимаю, на чем будет основываться ваша вторая классификация.
- person Rashid; 17.12.2014