SVM支持向量机算法

说明

支持向量机的回归算法是用于解决回归问题的支持向量机算法,它是支持向量机在回归估计问题中的扩展与应用。
如果我们把支持向量机针对分类问题中得到的结论推广到回归实函数中,就变成了支持向量机回归,通常用于时间序列预测、非线性建模与预测、优化控制。

例证

LS-SVM算法,最小二乘支持向量机回归

#准备基础数据
vdata=iris[,1:4]
colnames(vdata)=c("x1","x2","x3","y")
#标准化x1~x3
vdata[,1:3]=scale(vdata[,1:3])
n=nrow(vdata)
x=as.matrix(vdata[,1:3])
y=as.matrix(vdata[,4])
y=rbind(0,y)
I=t(t(rep(1,n)))
#设置参数sigma
sigma=1
omiga=matrix(rep(0,n*n),ncol=n)
for(i in 1:n)
{
  xi=x[i,]
  deltaX=(x-matrix(rep(xi,n),byrow=T,ncol=3))^2
  omiga[i,]=exp(-rowSums(deltaX)/(sigma^2))
}
#设置平衡参数gama
gama=10
#构建矩阵A
A=(omiga+(1/gama)*diag(n))
A=cbind(I,A)
A=rbind(c(0,t(I)),A)

#求b和alpha参数
b_alpha=solve(A)%*%y
b=b_alpha[1]
alpha=b_alpha[-1]
#基于vdata进行预测
ypred=NULL
for(i in 1:n)
{
  xi=x[i,]
  deltaX=(x-matrix(rep(xi,n),byrow=T,ncol=3))^2
  ypred=c(ypred,drop(exp(-rowSums(deltaX)/(sigma^2))%*%t(t(alpha)))+b)
}
#查看数据前几行
head(data.frame(y=vdata$y,ypred))
##     y     ypred
## 1 0.2 0.2485166
## 2 0.2 0.2029999
## 3 0.2 0.1689355
## 4 0.2 0.1588311
## 5 0.2 0.2458173
## 6 0.4 0.3122185
#误差平方和
sum((vdata[,4]-ypred)^2)
## [1] 2.867035

R语言实现

观察数据

data("iris")
attach(iris)
library(lattice)
xyplot(Petal.Length ~ Petal.Width,data = iris,groups = Species,auto.key = list(corner = c(1,0)))
第一种实现方式

函数svm()在建立支持向量机分类模型时有两种形式。第一种是根据既定公式建立模型
svm(formula,data = NULL,subset,na.action = na.omit,scale = TRUE)

formula代表函数模型的形式,data代表的是模型中包括的有变量的一组可选格式数据
na.action用于指定当样本数据中存在无效的空数据时系统应该进行的处理。默认值
na.omit表明程序会忽略那些数据缺失的样本。另外一个可选的赋值是na.fail,它指示系统在遇到空数据时给出一条错误信息
参数scale为一个逻辑向量,指定特征数据是否需要标准化(均值0,方差1).索引向量subset用来指定那些将被用来
训练模型的采样数据

只区分setosa与versicolor.去掉virginica

library(e1071)
subdata = iris[iris$Species != "virginica",]
subdata$Species = factor(subdata$Species)
model1 = svm(Species ~ Petal.Length + Petal.Width,data = subdata)
plot(model1,subdata,Petal.Length ~ Petal.Width)
第二种实现方式
使用全部特征量
model2 = svm(Species ~ .,data = iris)
summary(model2)

Call:
svm(formula = Species ~ ., data = iris)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
gamma: 0.25

Number of Support Vectors: 51

SVM-Type项目说明本模型的类别为C分类器,SVM-Kernel说明本模型使用的核函数中的参数gamma取值为0.25
cost说明本模型确定的约束违反成本为1
第一类为8个支持向量,第二类为22个支持向量,第三为51个支持向量

第三种实现方式

svm()函数的方式则是根据所给的数据建立模型,这种方式要复杂一些,但是允许我们以一种更加灵活的方式建立模型

svm(x,y = NULL,scale = TRUE,type = NULL,kernel = "radaial",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数据的结果标签,它既可以是字符
向量,也可以是数值向量。x与y共同指定将要用来建模的训练数据与模型基本形式。
type用于指定建立模型的类别。
kernal是指建立模型的过程中使用的核函数
对于选定的核函数,degree参数是指核函数多项式内积函数中的参数,其默认值为3,gamma参数给出了核函数中除线性
内积函数以外的所有函数参数,默认为1。coef0参数是指核函数中多项式内积函数与sigmoid内积函数的参数。

library(e1071)
x = iris[,-5] #除第五列以外数据作为特征变量
y = iris[,5]  #提取第5列数据做为结果变量
model3 = svm(x,y,kernel = "radial",gamma = if(is.vector(x)) 1 else 1/ncol(x))
str(model3)
pred = predict(model3,x)
table(pred,y)

你可能感兴趣的:(R语言模型)