跳到主要内容

R支持向量机

支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,广泛用于分类和回归任务。它的核心思想是通过找到一个最优的超平面,将不同类别的数据点分开。本文将介绍如何在R中使用SVM,并通过实际案例帮助你理解其应用。

什么是支持向量机?

支持向量机是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器。SVM通过最大化分类边界(即超平面)与最近的数据点(支持向量)之间的距离来实现分类。对于非线性可分的数据,SVM使用核函数将数据映射到高维空间,使其在高维空间中线性可分。

在R中实现支持向量机

R提供了多个包来实现SVM,其中最常用的是e1071包。以下是一个简单的例子,展示如何在R中使用SVM进行分类。

安装和加载e1071

首先,确保你已经安装并加载了e1071包:

r
install.packages("e1071")
library(e1071)

数据集准备

我们将使用R内置的iris数据集来演示SVM的分类功能。iris数据集包含了150个样本,分为3类,每类50个样本,每个样本有4个特征。

r
data(iris)

训练SVM模型

接下来,我们将数据集分为训练集和测试集,并使用训练集来训练SVM模型。

r
set.seed(123)
index <- sample(1:nrow(iris), 100)
train <- iris[index, ]
test <- iris[-index, ]

svm_model <- svm(Species ~ ., data = train, kernel = "linear")

预测和评估

使用训练好的模型对测试集进行预测,并评估模型的准确性。

r
predictions <- predict(svm_model, test)
table(predictions, test$Species)

输出结果

r
predictions    setosa versicolor virginica
setosa 14 0 0
versicolor 0 16 1
virginica 0 1 18

从结果中可以看出,模型在测试集上的分类效果非常好。

实际应用案例

案例:手写数字识别

SVM在手写数字识别中有着广泛的应用。以下是一个简单的例子,展示如何使用SVM对手写数字进行分类。

r
library(e1071)
library(MASS)

data("zip.train")
data("zip.test")

train <- zip.train[1:1000, ]
test <- zip.test[1:200, ]

svm_model <- svm(as.factor(V1) ~ ., data = train, kernel = "radial")

predictions <- predict(svm_model, test)
table(predictions, test$V1)

输出结果

r
predictions   0  1  2  3  4  5  6  7  8  9
0 18 0 0 0 0 0 0 0 0 0
1 0 20 0 0 0 0 0 0 0 0
2 0 0 20 0 0 0 0 0 0 0
3 0 0 0 20 0 0 0 0 0 0
4 0 0 0 0 20 0 0 0 0 0
5 0 0 0 0 0 20 0 0 0 0
6 0 0 0 0 0 0 20 0 0 0
7 0 0 0 0 0 0 0 20 0 0
8 0 0 0 0 0 0 0 0 20 0
9 0 0 0 0 0 0 0 0 0 20

从结果中可以看出,模型在手写数字识别任务中表现非常出色。

总结

支持向量机是一种强大的机器学习算法,适用于各种分类和回归任务。通过本文的介绍,你应该已经掌握了如何在R中使用SVM进行分类,并了解了其在实际应用中的表现。

附加资源

练习

  1. 尝试使用不同的核函数(如radialpolynomial)训练SVM模型,并比较它们的性能。
  2. 使用SVM对UCI机器学习库中的其他数据集进行分类,并评估模型的准确性。
  3. 探索SVM在回归任务中的应用,尝试使用SVM进行房价预测。
提示

在实践过程中,记得调整SVM的参数(如costgamma等),以获得更好的模型性能。