我正在使用来自这个来源的R代码来实现SVM-RFE
算法 http://www.uccor.edu.ar/paginas/seminarios/Software/SVM_RFE_R_implementation.pdf,但我做了一个小的修改,使R代码使用gnum
库。代码如下:
svmrfeFeatureRanking = function(x,y){ n = ncol(x) survivingFeaturesIndexes = seq(1:n) featureRankedList = vector(length=n) rankedFeatureIndex = n while(length(survivingFeaturesIndexes)>0){ #训练支持向量机 svmModel = SVM(x[, survivingFeaturesIndexes], y, C = 10, cache_size=500,kernel="linear" ) #计算排名标准 rankingCriteria = svmModel$w * svmModel$w #对特征进行排名 ranking = sort(rankingCriteria, index.return = TRUE)$ix #更新特征排名列表 featureRankedList[rankedFeatureIndex] = survivingFeaturesIndexes[ranking[1]] rankedFeatureIndex = rankedFeatureIndex - 1 #删除排名标准最小的特征 (survivingFeaturesIndexes = survivingFeaturesIndexes[-ranking[1]]) } return (featureRankedList)}
该函数接收一个matrix
作为x
的input
,以及一个factor
作为y
的input
。我使用该函数处理一些数据,在最后几次迭代中收到了以下错误消息:
Error in if (nrow(x) != length(y)) { : argument is of length zero
调试代码后,我得到了以下结果:
3 SVM.default(x[, survivingFeaturesIndexes], y, C = 10, cache_size = 500, kernel = "linear") 2 SVM(x[, survivingFeaturesIndexes], y, C = 10, cache_size = 500, kernel = "linear") 1 svmrfeFeatureRanking(sdatx, ym)
那么,函数的错误是什么?
回答:
看起来当只剩下一个特征时,你的矩阵会被转换成一个列表。试试这个:
svmModel = SVM(as.matrix(x[, survivingFeaturesIndexes]), y, C = 10, cache_size=500,kernel="linear" )