Построение данных из svm fit - гиперплоскость - PullRequest
12 голосов
/ 05 ноября 2011

Я использовал svm, чтобы найти регрессию гиперплоскости, наиболее подходящую для q, где у меня есть 4 измерения: x, y, z, q.

fit <- svm(q ~ ., data=data,kernel='linear')

и вот мой подходящий объект:

Call:
svm(formula = q ~ ., data = data, kernel = "linear")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  1 
      gamma:  0.3333333 

Number of Support Vectors:  1800

У меня есть трехмерный график моих данных, где 4-е измерение - цвет, используя plot3d. Как я могу наложить гиперплоскость, найденную SVM? Как я могу построить гиперплоскость? Я хотел бы визуализировать гиперплоскость регресса.

Ответы [ 2 ]

38 голосов
/ 05 ноября 2011

Вы писали:

Я использовал svm, чтобы найти регрессию гиперплоскости, наилучшим образом подходящую

Но в соответствии с:

Call:
svm(formula = q ~ ., data = data, kernel = "linear")

Parameters:
SVM-Type:  C-classification

вы делаете классификацию .

Итак, прежде всего решите, что вам нужно: для классификации или подгонки регрессии, из ?svm мы видим:

type: ‘svm’ can be used as a classification machine, as a
      regression machine, or for novelty detection.  Depending of
      whether ‘y’ is a factor or not, the default setting for
      ‘type’ is ‘C-classification’ or ‘eps-regression’,
      respectively, but may be overwritten by setting an explicit
      value.

Поскольку я считаю, что вы не изменили параметр type по умолчанию, вы, вероятно, решаете classification, поэтому я покажу, как это визуализировать для классификации.

Предположим, есть 2 классы, сгенерируйте некоторые данные:

> require(e1071) # for svm()                                                                                                                                                          
> require(rgl) # for 3d graphics.                                                                                                                                                                                    
> set.seed(12345)                                                                                                                                                                     
> seed <- .Random.seed                                                                                                                                                                
> t <- data.frame(x=runif(100), y=runif(100), z=runif(100), cl=NA)
> t$cl <- 2 * t$x + 3 * t$y - 5 * t$z                                                                                                                                                 
> t$cl <- as.factor(ifelse(t$cl>0,1,-1))
> t[1:4,]
           x         y         z cl
 1 0.7209039 0.2944654 0.5885923 -1
 2 0.8757732 0.6172537 0.8925918 -1
 3 0.7609823 0.9742741 0.1237949  1
 4 0.8861246 0.6182120 0.5133090  1

Так как вы хотите kernel='linear' граница должна быть w1*x + w2*y + w3*z - w0 - гиперплоскость. Наша задача делится на 2 подзадачи: 1) оценить уравнение этой граничной плоскости 2) нарисовать эту плоскость.

1) Оценка уравнения граничной плоскости

Сначала давайте запустим svm():

> svm_model <- svm(cl~x+y+z, t, type='C-classification', kernel='linear',scale=FALSE)

Я написал здесь явно type=C-classification просто для акцента, мы хотим сделать классификацию . scale=FALSE означает, что мы хотим, чтобы svm() запускался напрямую с предоставленными данными без масштабирования данных (как это происходит по умолчанию). Я сделал это для будущих оценок, которые станут проще.

К сожалению, svm_model не хранит уравнение граничной плоскости (или просто его нормальный вектор), поэтому мы должны его оценить. Из svm-алгоритма мы знаем, что мы можем оценить такие веса по следующей формуле:

w <- t(svm_model$coefs) %*% svm_model$SV

Отрицательный перехват сохраняется в svm_model и доступен через svm_model$rho.

2) Рисование плоскости .

Я не нашел никакой полезной функции plane3d, поэтому, опять же, мы должны сделать некоторую удобную работу. Мы просто берем сетку пар (x,y) и оцениваем соответствующее значение z граничной плоскости.

detalization <- 100                                                                                                                                                                 
grid <- expand.grid(seq(from=min(t$x),to=max(t$x),length.out=detalization),                                                                                                         
                    seq(from=min(t$y),to=max(t$y),length.out=detalization))                                                                                                         
z <- (svm_model$rho- w[1,1]*grid[,1] - w[1,2]*grid[,2]) / w[1,3]

plot3d(grid[,1],grid[,2],z)  # this will draw plane.
# adding of points to the graphics.
points3d(t$x[which(t$cl==-1)], t$y[which(t$cl==-1)], t$z[which(t$cl==-1)], col='red')
points3d(t$x[which(t$cl==1)], t$y[which(t$cl==1)], t$z[which(t$cl==1)], col='blue')

Мы сделали это с пакетом rgl, вы можете повернуть это изображение и наслаждаться им:)

enter image description here

1 голос
/ 20 ноября 2012

Я только начинаю в R, но есть неплохое руководство по использованию пакета e1071 в R для регрессии вместо классификации:

http://eric.univ -lyon2.fr / ~ Ricco / Tanagra / fichiers / en_Tanagra_Support_Vector_Regression.pdf

с zip-файлом набора тестовых данных и сценарием R в:

http://eric.univ -lyon2.fr / ~ Ricco / Tanagra / fichiers / qsar.zip

Пропустите первый раздел на Танагре и пройдите прямо к разделу 6 (стр. 14). У него есть свои недостатки, но он дает примеры использования R для линейной регрессии, SVR с эпсилон-регрессией и с ню-регрессией. Это также делает попытку демонстрации метода tune () (но может быть лучше, ИМХО).

(Примечание: если вы решите запустить примеры в этом документе, не пытайтесь найти рабочую копию xlsReadWrite - гораздо проще экспортировать qsar.xls в виде файла .csv и просто использовать read.csv () для загрузки набора данных.)

...