R语言,SVM

来源:毕业留言 时间:2016-09-27 12:30:39 阅读:

【www.zhuodaoren.com--毕业留言】

R语言,SVM(一)
R语言与机器学习(4)支持向量机

算法四:支持向量机

说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。

一、SVM的想法

回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢?

要回答这个问题,我们首先必须思考如何确定点的代表性?我想关于代表性至少满足这样一个条件:无论非代表性点存在多少,存在与否都不会影响我们的决策结果。显然如果仍旧使用KNN算法的话,是不会存在训练集的点不是代表点的情况。那么我们应该选择一个怎样的“距离”满足仅依靠代表点就能得到全体点一致的结果?

我们先看下面一个例子:假设我们的训练集分为正例与反例两类,分别用红色的圆圈与蓝色的五角星表示,现在出现了两个未知的案例,也就是图中绿色的方块,我们如何去分类这两个例子呢?

在KNN算法中我们考虑的是未知样例与已知的训练样例的平均距离,未知样例与正例和反例的“距离”谁更近,那么他就是对应的分类。

同样是利用距离,我们可以换一个方式去考虑:假设图中的红线是对正例与反例的分类标准(记为w x+b=0),那么我们的未知样例与红线的“距离”就成了一个表示分类信度的标准,而w y+b(y为未知样例的数据)的符号则可以看成是分类的标识。

但是遗憾的是我们不知道这样的一条分类标准(分类线)是什么,那么我们一个比较自然的想法就是从已知的分类数据(训练集)里找到离分割线最近的点,确保他们离分割面尽可能的远。这样我们的分类器会更稳健一些。

从上面的例子来看,虚线穿过的样例便是离分割线最近的点,这样的点可能是不唯一的,因为分割线并不确定,下图中黑线穿过的训练样例也满足这个要求:

所以“他们离分割面尽可能的远”这个要求就十分重要了,他告诉我们一个稳健的超平面是红线而不是看上去也能分离数据的黄线。

这样就解决了我们一开始提出的如何减少储存量的问题,我们只要存储虚线划过的点即可(因为在w x+b=-1左侧,w x+b=1右侧的点无论有多少都不会影响决策)。像图中虚线划过的,距离分割直线(比较专业的术语是超平面)最近的点,我们称之为支持向量。这也就是为什么我们这种分类方法叫做支持向量机的原因。 至此,我们支持向量机的分类问题转化为了如何寻找最大间隔的优化问题。

二、SVM的一些细节

支持向量机的实现涉及许多有趣的细节:如何最大化间隔,存在“噪声”的数据集怎么办,对于线性不可分的数据集怎么办等。

我这里不打算讨论具体的算法,因为这些东西完全可以参阅july大神的《支持向量机通俗导论》,我们这里只是介绍遇到问题时的想法,以便分析数据时合理调用R中的函数。

几乎所有的机器学习问题基本都可以写成这样的数学表达式:

给定条件:n个独立同分布观测样本(x1 , y1 ), (x2 , y2 ),„„,(xn , yn ) 目标:求一个最优函数f (x,w* )

最理想的要求:最小化期望风险R(w)

不同的是我们如何选择f,R。对于支持向量机来说,f(x,w*)=w x+b,最小化风险就是最大化距离|w x|/||w||,即arg max{min(label (w x+b))/||w||} (也就是对最不confidence 的数据具有了最大的 confidence)

这里的推导涉及了对偶问题,拉格朗日乘子法与一堆的求导,我们略去不谈,将结果叙述如下:

我们以鸢尾花数据来说说如何利用svm做分类,由于svm是一个2分类的办法,所以我们将鸢尾花数据也分为两类,“setosa”与“versicolor”(将后两类均看做一类),那么数据按照特征:花瓣长度与宽度做分类,有分类:

从上图可以看出我们通过最优化原始问题或者对偶问题就可以得到w,b,利用 sign(w.x+b)就可以判断分类了。

我们这里取3, 10,56, 68,107, 120号数据作为测试集,其余的作为训练集,我们可以看到:

训练集 setosa virginica

setosa 48 0

R语言,SVM(二)
R语言学习

#层次聚类

Data=iris[,-5];

Means=sapply(data,mean);SD=sapply(data,sd);

dataScale=scale(data,center=means,scale=SD);

Dist=dist(dataScale,method=”euclidean”);

heatmap(as.matrix(Dist),labRow=FALSE,labCol=FALSE);

clusteModel=hclust(Dist,method=”ward”);

result=cutree(clusteModel,k=3);

table(iris[,5],result);

plot(clusteModel);

library(fastcluster); # kuaisu cengcijulei

clusteModel=hclust(Dist,method=”ward”);

library(proxy);

res=dist(data,method=”cosine”);

x=c(0,0,1,1,1,1);

y=c(1,0,1,1,0,1);

dist(rbind(x,y),method=”Jaccard”);

x=c(0,0,1.2,1,0.5,1,NA);

y=c(1,0,2.3,1,0.9,1,1);

d=abs(x-y);

Dist=sum(d[!is.na(d)])/6;

# k-means聚类

clusteModel=kmeans(dataScale,centers=3,nstart=10);

class(clusteModel);

library(proxy);

library(cluster);

clustModel=pam(dataScale,k=3,metric=”Mahalanobis”);

clustModel$medoids

table(iris$Species,clustModel$clustering);

par(mfcol=c(1,2));

plot(clustModel,which.plots=2,main=””);

Plot(clustModel,which.plots=1,main=””);

library(devtools);

install_github(“lijian13/rinds”);

rinds::bestCluster(dataScale,2:6);

library(fpc);

pka=kmeansruns(iris[,1:4],krange=2:6,critout=TRUE,runs=2,criterion=”asw”);

#基于密度的聚类

x1=seq(0,pi,lenth.out=100);

y1=sin(x1)+0.1*rnorm(100);

x2=1.5+seq(0,pi,length.out=100);

y2=cos(x2)+0.1*rnorm(100);

data=data.frame(c(x1,x2),c(y1,y2));

names(data)=c(“x”,”y”);

model1=kmeans(data,centers=2,nstart=10);

library(“fpc”);

model2=dbscan(data,eps=0.3,MinPts=4);

#自组织映射

library(kohonen);

data=as.matrix(iris[,-5]);

somModel=som(data,grid=somgrid(15,10,”hexagonal”));

plot(somModel,ncolors=10,type=”dist.neighbours”);

irisclass=as.numeric(iris[,5]);

plot(somModel,type=”mapping”,labels=irisclass,col=irisclass+3,main=”mapping plot”);

#主成分分析

library(FactoMineR);

data(decathlon);head(decathlon,n=2);

pca1=princomp(decathlon[,1:10]);

plot(pca1,type="line");

res.pca=PCA(decathlon,quanti.sup=11:12,quali.sup=13);

#对应分析

library(MASS);data(caith);

biplot(corresp(caith,nf=2),xlim=c(-0.6,0.8));

【R语言,SVM】

#多元分析的可视化

library(car);

data(mpg,package="ggplot2");

scatterplotMatrix(mpg[,c('displ',"cty","hwy")],diagonal="histogram",ellipse=TRUE);

library(corrplot);data(mtcars);【R语言,SVM】

M=cor(mtcars);

corrplot(M,order="hclust");

#Logistic回归

set.seed(1);

b0=1;b1=2;b2=3;

x1=rnorm(1000);x2=rnorm(1000);

z=b0+b1*x1+b2*x2;

pr=1/(1+exp(-z));

y=rbinom(1000,1,pr);

plotdata2=data.frame(x1,x2,y=factor(y));

library(ggplot2);

p2=ggplot(data=plotdata2,aes(x=x1,y=x2,color=y))+geom_point();

print(p2);

data=data.frame(x1,x2,y);

model=glm(y~.,data=data,family="binomial");

summary(model);

w=model$coef;

inter=-w[1]/w[3];

slope=-w[2]/w[3];

plotdata3=data.frame(cbind(x1,x2),y=factor(y));

p3=ggplot(data=plotdata3,aes(x=x1,y=x2,color=y))+geom_point()+geom_abline(intercept=inter,slope=slope);

predict(model,newdata=list(x1=1,x2=3),type="response");

snafile=system.file("examples","sna","lijian001.txt",package="rinds"); snadf=read.table(snafile,header=FALSE,stringsAsFactors=FALSE);

head(snadf)

library(igraph);

snaobj=graph.data.frame(snadf,directed=FALSE);

class(snaobj)

vcount(snaobj);

ecount(snaobj);

neighbors(snaobj,6,mode="all");

degree(snaobj,v=6);

betweenness(snaobj,v=6,directed=FALSE);

closeness(snaobj,v=6);

page.rank(snaobj,vids=6);

similarity.dice(snaobj,vids=c(6,7));

snaclass=walktrap.community(snaobj,steps=5);

cl=snaclass$membership;

V(snaobj)$color=rainbow(max(cl))[cl];

V(snaobj)$bte=betweenness(snaobj,directed=FALSE);

V(snaobj)$size=5;

V(snaobj)[bte>=1800]$size=15;

V(snaobj)$label=NA;

V(snaobj)[bte>=1800]$label= V(snaobj)[bte>=1800]$name;

plot(snaobj,layout=layout.fruchterman.reingold,vertex.size=

V(snaobj)$size,vertex.color= V(snaobj)$color,vertex.label= V(snaobj)$label,vertex.label.cex=

V(snaobj)$cex,edge.color=grey(0.5),edge.arrow.mode="-");

R语言,SVM(三)
R语言常用包分类

1、聚类

 常用的包: fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pam, pamk, clara 基于层次的方法: hclust, pvclust, agnes, diana 基于模型的方法: mclust 基于密度的方法: dbscan 基于画图的方法: plotcluster, plot.hclust 基于验证的方法: cluster.stats

2、分类

 常用的包:

rpart,party,randomForest,rpartOrdinal,tree,marginTree, maptree,survival

【R语言,SVM】

 决策树: rpart, ctree 随机森林: cforest, randomForest 回归, Logistic回归, Poisson回归: glm, predict, residuals 生存分析: survfit, survdiff, coxph

3、关联规则与频繁项集

 常用的包:

arules:支持挖掘频繁项集,最大频繁项集,频繁闭项目集和关联规则

DRM:回归和分类数据的重复关联模型

 APRIORI算法,广度RST算法:apriori, drm

 ECLAT算法: 采用等价类,RST深度搜索和集合的交集:

4、序列模式

 常用的包: arulesSequences

 SPADE算法: cSPADE

5、时间序列

 常用的包: timsac

 时间序列构建函数: ts

 成分分解: decomp, decompose, stl, tsr

6、统计

 常用的包: Base R, nlme

【R语言,SVM】

 方差分析: aov, anova

 密度分析: density

 假设检验: t.test, prop.test, anova, aov

 线性混合模型:lme eclat

 主成分分析和因子分析:princomp 方差分析对应的是Kruskal-Wallis秩和检验(R: kruskal.test)

T检验对应的是Wilcoxon符号秩和检验(R: wilcox.test)

7、图表

【R语言,SVM】

 条形图: barplot 饼图: pie 散点图: dotchart 直方图: hist 密度图: densityplot 蜡烛图, 箱形图 boxplot QQ (quantile-quantile) 图: qqnorm, qqplot, qqline Bi-variate plot: coplot 树: rpart Parallel coordinates: parallel, paracoor, parcoord 热图, contour: contour, filled.contour 其他图: stripplot, sunflowerplot, interaction.plot, matplot,

fourfoldplot,

assocplot, mosaicplot

 保存的图表格式: pdf, postscript, win.metafile, jpeg, bmp, png

8、数据操作

 缺失值:na.omit 变量标准化:scale 变量转置:t 抽样:sample 堆栈:stack, unstack 其他:aggregate, merge, reshape

9、与数据挖掘软件Weka做接口

 RWeka: 通过这个接口,可以在R中使用Weka的所有算法。

10.人工神经网络: nnet

11.支持向量机SVM:e1071

12:核函数:kernlab

13.随机森林r

本文来源:http://www.zhuodaoren.com/jiyu430715/

推荐访问:svm回归r语言 svm原理r语言实现
扩展阅读文章
热门阅读文章