机器学习——支持向量机SVM在R中的实现

支持向量机是一个相对较新和较先进的机器学习技术,最初提出是为了解决二类分类问题,现在被广泛用于解决多类非线性分类问题和回归问题。继续阅读本文,你将学习到支持向量机如何工作,以及如何利用R语言实现支持向量机。

支持向量机如何工作?

简单介绍下支持向量机是做什么的:

假设你的数据点分为两类,支持向量机试图寻找最优的一条线(超平面),使得离这条线最近的点与其他类中的点的距离最大。有些时候,一个类的边界上的点可能越过超平面落在了错误的一边,或者和超平面重合,这种情况下,需要将这些点的权重降低,以减小它们的重要性。

这种情况下,“支持向量”就是那些落在分离超平面边缘的数据点形成的线。

无法确定分类线(线性超平面)时该怎么办?

此时可以将数据点投影到一个高维空间,在高维空间中它们可能就变得线性可分了。它会将问题作为一个带约束的最优化问题来定义和解决,其目的是为了最大化两个类的边界之间的距离。

我的数据点多于两个类时该怎么办?

此时支持向量机仍将问题看做一个二元分类问题,但这次会有多个支持向量机用来两两区分每一个类,直到所有的类之间都有区别。

工程实例

让我们看一下如何使用支持向量机实现二元分类器,使用的数据是来自MASS包的cats数据集。在本例中你将尝试使用体重和心脏重量来预测一只猫的性别。我们拿数据集中20%的数据点,用于测试模型的准确性(在其余的80%的数据上建立模型)。

1

2

3

4

# Setup

# 先需要安装SVM包e1071;

library(e1071)

data(cats, package="MASS")

inputData <- data.frame(cats[, c (2,3)], response = as.factor(cats$Sex)) # response as factor

线性支持向量机

传递给函数svm()的关键参数是kernel、cost和gamma。Kernel指的是支持向量机的类型,它可能是线性SVM、多项式SVM、径向SVM或Sigmoid SVM。Cost是违反约束时的成本函数,gamma是除线性SVM外其余所有SVM都使用的一个参数。还有一个类型参数,用于指定该模型是用于回归、分类还是异常检测。但是这个参数不需要显式地设置,因为支持向量机会基于响应变量的类别自动检测这个参数,响应变量的类别可能是一个因子或一个连续变量。所以对于分类问题,一定要把你的响应变量作为一个因子。

1

2

3

4

5

6

# linear SVM

svmfit<-svm(response~.,data=inputData,kernel="linear",cost=10,scale=FALSE)#
linear svm, scaling turned OFF

print(svmfit)

plot(svmfit,inputData)

compareTable<-table(inputData$response,predict(svmfit))  #
tabulate

mean(inputData$response!=predict(svmfit))#
19.44% misclassification error

径向支持向量机

径向基函数作为一个受欢迎的内核函数,可以通过设置内核参数作为“radial”来使用。当使用一个带有“radial”的内核时,结果中的超平面就不需要是一个线性的了。通常定义一个弯曲的区域来界定类别之间的分隔,这也往往导致相同的训练数据,更高的准确度。

1

2

3

4

5

6

# radial SVM

svmfit <- svm(response ~ ., data = inputData, kernel = "radial", cost = 10, scale = FALSE) # radial svm, scaling turned OFF

print(svmfit)

plot(svmfit, inputData)

compareTable <- table (inputData$response, predict(svmfit))  # tabulate

mean(inputData$response != predict(svmfit)) # 18.75% misclassification error

寻找最优参数

你可以使用tune.svm()函数,来寻找svm()函数的最优参数。

1

2

3

4

5

6

7

8

9

10

### Tuning

# Prepare training and test data

set.seed(100)#
for reproducing results

rowIndices<-1:nrow(inputData)#
prepare row indices

sampleSize<-0.8*length(rowIndices)#
training sample size

trainingRows<-sample(rowIndices,sampleSize)#
random sampling

trainingData<-inputData[trainingRows,]#
training data

testData<-inputData[-trainingRows,]#
test data

tuned<-tune.svm(response~.,data=trainingData,gamma=10^(-6:-1),cost=10^(1:2))#
tune

summary(tuned)#
to select best gamma and cost

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# Parameter tuning of ‘svm‘:

#   - sampling method: 10-fold cross validation

#

# - best parameters:

#   gamma cost

# 0.001  100

#

# - best performance: 0.26

#

# - Detailed performance results:

#   gamma cost error dispersion

# 1  1e-06   10  0.36 0.09660918

# 2  1e-05   10  0.36 0.09660918

# 3  1e-04   10  0.36 0.09660918

# 4  1e-03   10  0.36 0.09660918

# 5  1e-02   10  0.27 0.20027759

# 6  1e-01   10  0.27 0.14944341

# 7  1e-06  100  0.36 0.09660918

# 8  1e-05  100  0.36 0.09660918

# 9  1e-04  100  0.36 0.09660918

# 10 1e-03  100  0.26 0.18378732

# 11 1e-02  100  0.26 0.17763883

# 12 1e-01  100  0.26 0.15055453

结果证明,当cost为100,gamma为0.001时产生最小的错误率。利用这些参数训练径向支持向量机。

1

2

3

4

5

svmfit<-svm(response~.,data=trainingData,kernel="radial",cost=100,gamma=0.001,scale=FALSE)#
radial svm, scaling turned OFF

print(svmfit)

plot(svmfit,trainingData)

compareTable<-table(testData$response,predict(svmfit,testData))  #
comparison table

mean(testData$response!=predict(svmfit,testData))#
13.79% misclassification error

1

2

3

F   M

F   6   3

M  1   19

网格图

一个2-色的网格图,能让结果看起来更清楚,它将图的区域指定为利用SVM分类器得到的结果的类别。在下边的例子中,这样的网格图中有很多数据点,并且通过数据点上的倾斜的方格来标记支持向量上的点。很明显,在这种情况下,有很多越过边界违反约束的点,但在SVM内部它们的权重都被降低了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# Grid Plot

n_points_in_grid=60
#num
grid points in a line

x_axis_range&lt;-range(inputData[,2])#
range of X axis

y_axis_range&lt;-range(inputData[,1])#
range of Y axis

X_grid_points&lt;-seq(from=x_axis_range[1],to=x_axis_range[2],length=n_points_in_grid)#
grid points along x-axis

Y_grid_points&lt;-seq(from=y_axis_range[1],to=y_axis_range[2],length=n_points_in_grid)#
grid points along y-axis

ll_grid_points&lt;-expand.grid(X_grid_points,Y_grid_points)#
generate all grid points

names(all_grid_points)&lt;-c(&quot;Hwt&quot;,&quot;Bwt&quot;)#
rename

all_points_predited&lt;-predict(svmfit,all_grid_points)#
predict for all points in grid

color_array&lt;-c(&quot;red&quot;,&quot;blue&quot;)[as.numeric(all_points_predited)]#
colors for all points based on predictions

plot(all_grid_points,col=color_array,pch=20,cex=0.25)#
plot all grid points

points(x=trainingData$Hwt,y=trainingData$Bwt,col=c(&quot;red&quot;,&quot;blue&quot;)[as.numeric(trainingData$response)],pch=19)#
plot data points

points(trainingData[svmfit$index,c(2,1)],pch=5,cex=2)#
plot support vectors

时间: 2024-10-10 17:04:25

机器学习——支持向量机SVM在R中的实现的相关文章

吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm from sklearn.model_selection import train_test_split def load_data_classfication(): ''' 加载用于分类问题的数据集 ''' # 使用 scikit-learn 自带的 iris 数据集 iris=datasets.lo

机器学习——支持向量机(SVM)之核函数(kernel)

对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行某种形式的转换,从而得到某些新的变量来表示数据.在这种表示情况下,我们就更容易得到大于0或者小于0的测试结果.在这个例子中,我们将数据从一个特征空间转换到另一个特征空间,在新的空间下,我们可以很容易利用已有的工具对数据进行处理,将这个过程称之为从一个特征空间到另一个特征空间的映射.在通常情况下,这种

机器学习:SVM(scikit-learn 中的 SVM:LinearSVC)

一.基础理解 Hard Margin SVM 和 Soft Margin SVM 都是解决线性分类问题,无论是线性可分的问题,还是线性不可分的问题: 和 kNN 算法一样,使用 SVM 算法前,要对数据做标准化处理: 原因:SVM 算法中设计到计算 Margin 距离,如果数据点在不同的维度上的量纲不同,会使得距离的计算有问题: 例如:样本的两种特征,如果相差太大,使用 SVM 经过计算得到的决策边界几乎为一条水平的直线--因为两种特征的数据量纲相差太大,水平方向的距离可以忽略,因此,得到的最大

机器学习:SVM(scikit-learn 中的 RBF、RBF 中的超参数 γ)

一.高斯核函数.高斯函数 μ:期望值,均值,样本平均数:(决定告诉函数中心轴的位置:x = μ) σ2:方差:(度量随机样本和平均值之间的偏离程度:, 为总体方差,  为变量,  为总体均值,  为总体例数) 实际工作中,总体均数难以得到时,应用样本统计量代替总体参数,经校正后,样本方差计算公式:S^2= ∑(X-  ) ^2 / (n-1),S^2为样本方差,X为变量,  为样本均值,n为样本例数. σ:标准差:(反应样本数据分布的情况:σ 越小高斯分布越窄,样本分布越集中:σ 越大高斯分布越

机器学习——支持向量机(SVM)

1.基于最大间隔分隔数据

在R中使用支持向量机(SVM)进行数据挖掘(上)

在R中,可以使用e1071软件包所提供的各种函数来完成基于支持向量机的数据分析与挖掘任务.请在使用相关函数之前,安装并正确引用e1071包.该包中最重要的一个函数就是用来建立支持向量机模型的svm()函数.我们将结合后面的例子来演示它的用法. 下面这个例子中的数据源于1936年费希尔发表的一篇重要论文.彼时他收集了三种鸢尾花(分别标记为setosa.versicolor和virginica)的花萼和花瓣数据.包括花萼的长度和宽度,以及花瓣的长度和宽度.我们将根据这四个特征来建立支持向量机模型从而

在R中使用支持向量机(SVM)进行数据挖掘(下)

书接上文 在R中使用支持向量机(SVM)进行数据挖掘(上) http://blog.csdn.net/baimafujinji/article/details/49885481 第二种使用svm()函数的方式则是根据所给的数据建立模型.这种方式形式要复杂一些,但是它允许我们以一种更加灵活的方式来构建模型.它的函数使用格式如下(注意我们仅列出了其中的主要参数). svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",

Stanford机器学习---第八讲. 支持向量机SVM

本文原始文章见http://blog.csdn.net/abcjennifer/article/details/7849812,本文添加了一些自己的理解 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Sta

机器学习第7周-炼数成金-支持向量机SVM

支持向量机SVM 原创性(非组合)的具有明显直观几何意义的分类算法,具有较高的准确率源于Vapnik和Chervonenkis关于统计学习的早期工作(1971年),第一篇有关论文由Boser.Guyon.Vapnik发表在1992年(参考文档见韩家炜书9.10节)思想直观,但细节异常复杂,内容涉及凸分析算法,核函数,神经网络等高深的领域,几乎可以写成单独的大部头与著.大部分非与业人士会觉得难以理解.某名人评论:SVM是让应用数学家真正得到应用的一种算法 思路 简单情况,线性可分,把问题转化为一个