SVM算法的R語言實現
1.SVM分類
(1)標准分類模型
library(e1071) data(iris) attach(iris) model<-svm(Species~.,data=iris) #標准分類模型
(2)多分類模型
#步驟1 數據集准備
x<-subset(iris,select = Species) y<-Species
#步驟2 模型建立
model<-svm(x,y)
#步驟3 模型展示
summary(model) pred<-predict(model,x) table(pred,y)
#步驟4 多分類可視化
plot(cmdscale(dist(iris[,-5])),cex.axis=1.5,col.axis="blue", col.lab="red",cex.lab=1.5,col=as.integer(iris[,5]), pch=c("o","+")[1:150 %in% model$index+1],main="多分類可視化", xlab="Species",ylab="Species")
# "+"表示支持向量,"o"表示普通樣本點
2. SVM回歸
#步驟1 數據集准備
x<-seq(0.1,5,by=0.05) y<-log(x)+rnorm(x,sd=0.2)
#步驟2 模型建立
m<-svm(x,y) new<-predict(m,x) #支持向量機2維回歸模型
#步驟3 模型可視化
plot(x,y,main="2維回歸模型可視化",cex.axis=1.5,col.axis="blue", col.lab="red",cex.lab=1.5,cex.main=1.5)+ points(x,log(x),col=2,type="l")+ points(x,new,col=4,type="l") #回歸模型建立與可視化
3. SVM擴展包(kernlab包)
#步驟1 加載kernlab包
library(kernlab)
#步驟2 數據集准備
#svm<-ksvm(label~.,data,kernel,kpar,C,cross) x<-rbind(matrix(rnorm(120),,2),matrix(rnorm(120,mean = 3),,2)) y<-matrix(c(rep(1,60),rep(-1,60)))
#步驟3 模型建立與展示
svp<-ksvm(x,y,type="C-svc") svp
#步驟4 模型可視化
plot(svp,data=x) #得到數據的散點分類示意圖
案例1:SVM算法應用與iris數據據(e1071包)
library(lattice) library(e1071) xyplot(Petal.Length~Petal.Width,data=iris,groups=Species,auto.key=list(corner=c(1,0))) #在正式建模之前,我們通過一個圖形來初步判定數據的分布情況
data("iris") attach(iris) subdata<-iris[iris$Species!="virginica",] subdata$Species<-factor(subdata$Species) model<-svm(Species~Petal.Length+Petal.Width,data=subdata) plot(model,subdata,Petal.Length~Petal.Width)
SVM算法案例分析iris數據集
#SVM算法案例
library(e1071)
data(iris)
summary(iris)
m<-svm(Species~.,data=iris) #以Species為標簽,建立SVM模型
m #模型結果
x=iris[,-5] y=iris[,5] m<-svm(x,y,kernel="radial",gamma=if(is.vector(x))1 else 1/ncol(x)) summary(model) #查看m模型的相關結果
pred<-predict(m,x) #根據模型m對數據x進行預測 pred[sample(1:50,8)] #隨機挑選8個預測結果進行展示
table(pred,y)
plot(cmdscale(dist(iris[,-5])),col=c("blue","black","red") [as.integer(iris[,5])],pch=c("o","+")[1:150 %in% model$index+1]) #SVM分類作圖,"+"表示支持向量,"o"表示普通樣本點 legend(2,-0.8,c("setosa","versicolor","virginica"),col=c("blue","black","red"),lty=1)
#plot函數還可以從其他角度對SVM模型進行可視化分析
data(iris) model<-svm(Species~.,data=iris) plot(model,iris,Petal.Width~Petal.Length,fill=F, symbolPalette=c("blue","black","red"),svSymbol="+") #繪制模型類別關於花瓣寬度核長度的分類情況 legend(1,2.5,c("setosa","versicolor","virginica"),col=c("blue","black","red"),lty=1)
案例2:SVM算法在基因表達數據的應用
library(ISLR) names(Khan)
dim(Khan$xtrain) #查看數據的維度
dim(Khan$xtest)
length(Khan$ytrain)
length(Khan$ytest)
結果分析:數據集由 2308 個基因的表達測定組成,訓練集和測試集分別由 63和 20 個觀測組成。
table(Khan$ytrain) #訓練集中的類別及觀測數目
table(Khan$ytest) ##測試集中的類別及觀測數目
#在這個數據集中,相對於觀測的數目來說,特征的數目非常多,基於這一特點建議使用線性核函數,因為使用多項式核函數和徑向核函數得到更高光滑性是沒有必要的。
dat=data.frame(x=Khan$xtrain, y=as.factor(Khan$ytrain)) #訓練數據集 out=svm(y~., data=dat, kernel="linear",cost=10) summary(out)
table(out$fitted, dat$y) #訓練集混淆矩陣
結果分析:混淆矩陣結果顯示,訓練集的誤裝為0,事實上,這並不奇怪,因為相對於觀測的數目來說,變量的數目較多意味着很容易找到把這些類別完全分開的超平面。
dat.te=data.frame(x=Khan$xtest, y=as.factor(Khan$ytest)) #測試集 pred.te=predict(out, newdata=dat.te) table(pred.te, dat.te$y) #測試集混淆矩陣
結果分析:混淆矩陣結果顯示,測試集中有2個樣本被錯誤分類了。