gpt4 book ai didi

r - 无法在 R 中实现 SVM

转载 作者:行者123 更新时间:2023-11-30 09:05:04 26 4
gpt4 key购买 nike

我正在尝试使用 svm 运行图像分类,但遇到一个错误,虽然该论坛已报告该错误,但该解决方案不适合我的情况。

我要分类的数据是 2 层的栅格堆栈:

> S1_images
class : RasterStack
dimensions : 1000, 1414, 1414000, 2 (nrow, ncol, ncell, nlayers)
resolution : 10, 10 (x, y)
extent : 670860, 685000, 6163420, 6173420 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
names : X20180415_VH, X20180415_VV
min values : 1.621079e-05, 1.929869e-04
max values : 24.6396, 159.7452

我的训练数据是使用多边形作为引用并提取这些位置的像素值来获得的:

training_S<-raster::extract(S_images_t, training, df=TRUE)
training_S$Class<-factor(training_S$Class)

> head(training_S)
ID X20180415_VH X20180415_VV Class
1 1 0.006463605 0.05813200 1
2 1 0.006663103 0.06266786 1
3 1 0.007048910 0.06308612 1
4 1 0.006351015 0.04774158 1
5 1 0.006822301 0.05248845 1
6 1 0.007194918 0.05911565 1

> str(training_S)
'data.frame': 33239 obs. of 4 variables:
$ ID : num 1 1 1 1 1 1 1 1 1 1 ...
$ X20180415_VH: num 0.00646 0.00666 0.00705 0.00635 0.00682 ...
$ X20180415_VV: num 0.0581 0.0627 0.0631 0.0477 0.0525 ...
$ Class : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...

在选择最佳参数的tune.svm之后,我创建了模型(到目前为止,一切顺利)

SVM<-svm(x=training_S[ ,c(1:(length(training_S)-1))], y=training_S$Class, gamma = 0.1, cost = 10)

接下来,我尝试使用预测对输入数据进行分类:

LC<-predict(S1_images, model=SVM, na.rm=TRUE) 

这是我的错误:

> LC<-predict(S1_images, model=SVM, na.rm=TRUE) 
Error in newdata[, object$scaled, drop = FALSE] :
(subscript) logical subscript too long

R Bloggers 为例,我将栅格堆栈转换为数据帧,并正确重命名列:

S1_images_df <- data.frame(getValues(S1_images))
names(S1_images_df) <- c("X20180415_VH", "X20180415_VV")

尝试再次运行分类时:

LC<-predict(SVM, S1_images_df) 

> LC<-predict(SVM, S1_images_df)
Error in newdata[, object$scaled, drop = FALSE] :
(subscript) logical subscript too long

有关我的数据的一些额外信息:

> str(training_S)
'data.frame': 33239 obs. of 4 variables:
$ ID : num 1 1 1 1 1 1 1 1 1 1 ...
$ X20180415_VH: num 0.00646 0.00666 0.00705 0.00635 0.00682 ...
$ X20180415_VV: num 0.0581 0.0627 0.0631 0.0477 0.0525 ...
$ Class : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1

> str(S1_images_df)
'data.frame': 1414000 obs. of 2 variables:
$ X20180415_VH: num 0.005 0.00531 0.00514 0.0048 0.00461 ...
$ X20180415_VV: num 0.0954 0.0947 0.0933 0.0952 0.0951 ...

> dim(training_S)
[1] 33239 4


> dim(S1_images_df)
[1] 1414000 2

我一直在检查这两篇较旧的帖子,但不确定如何在我的案例中实现解决方案:

HereHere

最佳答案

看起来您在训练模型时将 ID 作为协变量包含在内。如果ID有意义并且您希望将其包含在模型中,则需要在S1_images_df中添加相应的ID字段。更有可能的是,您应该在将训练数据传递到 svm 时排除它:

SVM<-svm(x=training_S[, -c(1, ncol(training_S))], y=training_S$Class, gamma = 0.1, cost = 10)

关于r - 无法在 R 中实现 SVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54113451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com