Linear SVM
- 这里的loss function max() 是convex的,参数的模*
λ
λ
也是convex但是可以分段微分
R中的kernal function
rbfdot(sigma=) polydot(degree=,scale=,offset=) tanhdot(scale=, offset=) vanilladot() laplacedot(sigma=) besseldot(sigma=,order=,degree=) anovadot(sigma=,degree=) splinedot()
现在来说一下kerlab里边的predict.ksvm
predict(object,newdata,type="respon")
object:ksvm中的变量
If type(object) is C-svc, nu-svc, C-bsvm or spoc-svc the vector returned depends on the argument
type :
probabillilties 分为A或B类的概率
votes: 分为A或B 01 表示
今天先到这里。明天继续学习SVM附上代码一篇:
#准备数据
data(promotergene)
ind <- sample(1:dim(promotergene)[1],20)
train.da <- promotergene[-ind,]
test.da <- promotergene[ind,]
#train a svm
gene <- ksvm(Class~.,data=train.da,kernal="rbfdot",kpar=list(sigma=0.015),C=70,cross=4,prob.model=T)
gene
#predict on the testing data
genepredict <- predict(gene,test.da,type='votes')
genepredict
#########################################################################
n <- 1000 # 样本数
p <- 2 # 变量数
sigma <- 1 # 分布的标准差
meanpos <- 0 # 正样本分布的均值
meanneg <- 3 # 负样本分布的均值
npos <- round(n/2) # 正样本数目
nneg <- n-npos # 负样本数目
# 生成正样本
##设置种子,为了试验可重复性
set.seed(1234)
xpos <- matrix(rnorm(npos*p,mean=meanpos,sd=sigma),npos,p)
##生成负样本
set.seed(1234)
xneg <- matrix(rnorm(nneg*p,mean=meanneg,sd=sigma),npos,p)
##正样本和负样本合并
x <- rbind(xpos,xneg)
# 生成标签
y <- matrix(c(rep(1,npos),rep(-1,nneg)))
#数据可视化
plot(x,col=ifelse(x>0,1,2))
#数据集划分
ntrain <- round(n*0.8) # number of training examples
tindex <- sample(n,ntrain) # indices of training samples
xtrain <- x[tindex,]
xtest <- x[-tindex,]
ytrain <- y[tindex]
ytest <- y[-tindex]
#训练模型
svm <- ksvm(xtrain,ytrain,kernel='vanilladot',type="C-svc",C=100,scaled=c())
svp <- ksvm(xtrain,ytrain,type="C-svc",kernel='vanilladot',C=100,scaled=c())
#结果可视化
plot(svm,data=xtrain)
ypred <- predict(svm,xtest) ##应用到测试集
table(ytest,ypred) ##利用table()生成混淆矩阵
sum(ypred==ytest)/length(ytest) #准确率0.975