机器学习与R之支持向量机svm-svr(下)

e1071包的svm()函数
library(lattice)  
xyplot(Petal.Length ~ Petal.Width, data = iris, groups = Species, auto.key=list(corner=c(1,0)))  #查看散点图
第一种是根据既定公式建立模型
svm(formula, data= NULL, subset, na.action = na.omit , scale= TRUE)  
formula代表的是函数模型的形式,
data代表的是在模型中包含的有变量的一组可选格式数据。
参数na.action用于指定当样本数据中存在无效的空数据时系统应该进行的处理。
默认值na.omit表明程序会忽略那些数据缺失的样本。另外一个可选的赋值是na.fail,它指示系统在遇到空数据时给出一条错误信息。
参数scale为一个逻辑向量,指定特征数据是否需要标准化(默认标准化为均值0,方差1)。
索引向量subset用于指定那些将被来训练模型的采样数据。
data(iris)
attach(iris)
subdata<-iris[iris$Species!='virginica',]
subdata$Species<-factor(subdata$Species)
library(e1071)  
model1<-svm(Species~Petal.Length + Petal.Width,data=subdata)
plot(model1, subdata, Petal.Length ~ Petal.Width)  #画出超平面和数据散点图
model2 <- svm(Species ~ ., data = iris) 
summary(model2) #查看详情
SVM-Type项目说明本模型的类别为C分类器模型
SVM-Kernel项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma的取值为0.25 
cost项目说明本模型确定的约束违反成本为l
模型找到了51个支持向量
gamma大概越大则support vectors(支持向量)越少,一般来说默认的gamma=1/dimension(维度)都不会太差
C 和 gamma 对 vairance(方差) 和 bias(倾斜)的影响
第二种使用svm()函数的方式则是根据所给的数据建立模型
svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",  
degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),  
coef0 = 0, cost = 1, nu = 0.5, subset, na.action = na.omit) 
x可以是一个数据矩阵,也可以是一个数据向量,同时也可以是一个稀疏矩阵 
y是对于x数据的结果标签
type用于指定建立模型的类别。支持向量机模型通常可以用作分类模型、回归模型或者异常检测模型
type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression这五种类型
前三种是针对于字符型结果变量的分类方式,其中第三种方式是逻辑判别,即判别结果输出所需判别的样本是否属于该类别;
而后两种则是针对数值型结果变量的分类方式。
kernel是指在模型建立过程中使用的核函数-线性核函数、多项式核函数、高斯核函数及神经网络核函数
高斯核函数(局部性核函数)与多项式核函数(全局性核函数)被认为是性能最好、也最常用的核函数。
局部性核函数仅仅在测试点附近小领域内对数据点有影响,其学习能力强、泛化性能较弱;
而全局性核函数则相对来说泛化性能较强、学习能力较弱。
degree参数是指核函数多项式内积函数中的参数,其默认值为3
gamma参数给出了核函数中除线性内积函数以外的所有函数的参数,默认值为1/dimension(维度)
coef0参数是指核函数中多项式内积函数与sigmoid内积函数中的参数,默认值为0
cost就是软间隔模型中的离群点权重
nu是用于nu-regression、nu-classification和one-classification类型中的参数
一个经验性的结论是,在利用svm()函数建立支持向量机模型时,使用标准化后的数据建立的模型效果更好
x=iris[,-5]
y=iris[,5]
model3 <- svm(x,y,kernel = "radial", gamma = if (is.vector(x)) 1 else 1 / ncol(x)) 
pre=predict(model3,x)
table(pre,y)
在R中通常使用disk函数得到样本之间的距离。MDS就是对距离矩阵进行分析cmdscale函数实现了经典MDS。
它是根据各点的欧氏距离,在低维空间中寻找各点座标,而尽量保持距离不变
plot(cmdscale(dist(iris[,-5])),col = c("orange","blue","green")[as.integer(iris[,5])],pch = c("o","+")[1:150 %in% model3$index + 1]) 
legend(1.8,-0.4, c("setosa","versicolor","virgincia"), col = c("orange","blue","green"), lty = 1)  #1.8左右位置-0.4上下位置
decision.values显示n*c的矩阵。这里n是被预测的数据量, c是二分类器的决策值
使用支持向量机对样本数据进行分类,分类结果可能是有k个类别。那么这k个类别中任意两类之间都会有一个二分类器。
所以,我们可以推算出总共的二分类器数量是k(k-1)/2
pre=predict(model3,x,decision.values=TRUE)
查看前4个样本分类结构

attr(pre,"decision.values")[1:4,]

#(1)支持向量机(SVM):
library(kernlab)
irismodel <- ksvm(Species ~ ., data = iris,              
                     type = "C-bsvc", kernel = "rbfdot",                    
                     kpar = list(sigma = 0.1), C = 10,                    
                     prob.model = TRUE) 
irismodel
predict(irismodel, iris[c(3, 10, 56, 68, 107, 120), -5], type = "probabilities")

#Ksvm支持自定义核函数。如
k <- function(x, y) { (sum(x * y) + 1) * exp(0.001 * sum((x - y)^2)) }
class(k) <- "kernel"
data("promotergene")
gene <- ksvm(Class ~ ., data = promotergene, kernel = k, C = 10, cross = 5)#训练
gene

#对于二分类问题,可以对结果用plot()进行可视化。例子如下
x <- rbind(matrix(rnorm(120), , 2), matrix(rnorm(120, mean = 3), , 2))
y <- matrix(c(rep(1, 60), rep(-1, 60)))
svp <- ksvm(x, y, type = "C-svc", kernel = "rbfdot", kpar = list(sigma = 2))
plot(svp)


library(e1071)
set.seed(1234)
ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3)) #70%为训练集 30%为测试集
train<-iris[ind==1,]
test<-iris[ind==2,]
svm<-svm(train[,1:4],train[,5],type="C-classification",
         cost=10,kernel="radial",probability=TRUE,scale=FALSE)
pred<-predict(svm,test[,1:4],decision.values=TRUE)
table(pred,test[,5])

library(e1071)
model <- svm(Species ~ ., data = iris,            
               method = "C-classification", kernel = "radial",              
               cost = 10, gamma = 0.1)
summary(model)
plot(model, iris, Petal.Width ~
       Petal.Length, slice = list(Sepal.Width = 3,                              
                                  Sepal.Length = 4))
pre=predict(model, iris,type='class') 
table(pre,iris$Species) 

library("klaR")
data("B3")
Bmod <- svmlight(PHASEN ~ ., data = B3,                  
                   svm.options = "-c 10 -t 2 -g 0.1 -v 0")
predict(Bmod, B3[c(4, 9, 30, 60, 80, 120),              
                   -1])

#(2)支持向量回归(SVR): 
library(DMwR) 
library(nnet) 
data(algae) 
algae <- algae[-manyNAs(algae), ] 
clean.algae <- knnImputation(algae[,1:12],k=10) 
norm.data <- scale(clean.algae[,4:12]) #数据标准化 

library(e1071) 
model.svm <- svm(a1~., norm.data) 
preds <- predict(model.svm, norm.data) 
plot(preds~ scale(clean.algae$a1)) 

library(rminer)
set.seed(1234)
svr<-fit(a1~., norm.data, model="svm") 
#利用模型进行预测 
norm.preds <- predict(svr, norm.data) 
#绘制预测值与真实值之间的散点图 
plot(norm.preds~ scale(clean.algae$a1)) 
#计算相对误差 
(nmse2 <- mean((norm.preds-scale(clean.algae$a1))^2)/ 
   mean((mean(scale(clean.algae$a1))- scale(clean.algae$a1))^2))


你可能感兴趣的:(R,机器学习,机器学习与R之支持向量机svm,svr)