在机器学习中,支持向量机(SVM)是有监督的学习模型,具有相关的学习算法,用于分析用于分类和回归分析的数据。它主要用于分类问题。在该算法中,每个数据项被绘制为n维空间中的一个点(其中n是多个特征),每个特征的值是特定坐标的值。然后,通过找到最能区分这两类的超平面来进行分类。 除了执行线性分类,支持向量机还可以有效地执行非线性分类,将其输入隐式映射到高维特征空间。
null
支持向量机的工作原理
支持向量机(SVM)是一种由分离超平面正式定义的判别分类器。换句话说,在给定标记训练数据(监督学习)的情况下,该算法输出一个对新示例进行分类的最优超平面。 在使用支持向量机时,最重要的问题是如何确定正确的超平面。考虑以下情景:
- 情景1: 在这种情况下,有三个超平面称为A、B、C。现在的问题是确定最能区分恒星和圆的正确超平面。
- 在找到正确的超平面之前,我们要知道的一条经验法则是,应该选择能更好地分隔两个类的超平面来对恒星和圆进行分类。 在这种情况下,B更好地对恒星和圆进行分类,因此它是一个右超平面。
- 情景2: 现在再看另一个场景,三架飞机都很好地隔离了等级。现在的问题是,在这种情况下,如何识别正确的飞机。
- 在这种情况下,计算最近的数据点和超平面之间的距离。具有最大距离的平面将被视为正确的超平面,以便更好地分类。 这里C有最大的边界,因此它将被视为一个右超平面。
以上是一些识别正确超平面的场景。 注: 有关在Python中使用SVM进行分类的详细信息,请参阅 在Python中使用支持向量机(SVM)对数据进行分类
SVM在R中的实现
这里,以导入 来自社交文件的社交网络辅助数据集。csv 以下步骤对实现进行了说明:
- 导入数据集
R
# Importing the dataset dataset = read.csv ( 'Social_Network_Ads.csv' ) dataset = dataset[3:5] |
- 输出:
- 选择第3-5列 这样做是为了便于计算和实现(保持示例简单)。
R
# Taking columns 3-5 dataset = dataset[3:5] |
- 输出:
- 对目标特征进行编码
R
# Encoding the target feature as factor dataset$Purchased = factor (dataset$Purchased, levels = c (0, 1)) |
- 输出:
- 拆分数据集
R
# Splitting the dataset into the Training set and Test set install.packages ( 'caTools' ) library (caTools) set.seed (123) split = sample.split (dataset$Purchased, SplitRatio = 0.75) training_set = subset (dataset, split == TRUE ) test_set = subset (dataset, split == FALSE ) |
- 输出:
- 拆分器
- 训练数据集
- 测试数据集
- 特征缩放
R
# Feature Scaling training_set[-3] = scale (training_set[-3]) test_set[-3] = scale (test_set[-3]) |
- 输出:
- 特征尺度训练数据集
- 特征缩放测试数据集
- 将支持向量机拟合到训练集
R
# Fitting SVM to the Training set install.packages ( 'e1071' ) library (e1071) classifier = svm (formula = Purchased ~ ., data = training_set, type = 'C-classification' , kernel = 'linear' ) |
- 输出:
- 详细分类
- 简言之,分类器
- 预测测试集结果
R
# Predicting the Test set results y_pred = predict (classifier, newdata = test_set[-3]) |
- 输出:
- 制造混乱矩阵
R
# Making the Confusion Matrix cm = table (test_set[, 3], y_pred) |
- 输出:
- 可视化训练集结果
R
# installing library ElemStatLearn library (ElemStatLearn) # Plotting the training data set results set = training_set X1 = seq ( min (set[, 1]) - 1, max (set[, 1]) + 1, by = 0.01) X2 = seq ( min (set[, 2]) - 1, max (set[, 2]) + 1, by = 0.01) grid_set = expand.grid (X1, X2) colnames (grid_set) = c ( 'Age' , 'EstimatedSalary' ) y_grid = predict (classifier, newdata = grid_set) plot (set[, -3], main = 'SVM (Training set)' , xlab = 'Age' , ylab = 'Estimated Salary' , xlim = range (X1), ylim = range (X2)) contour (X1, X2, matrix ( as.numeric (y_grid), length (X1), length (X2)), add = TRUE ) points (grid_set, pch = '.' , col = ifelse (y_grid == 1, 'coral1' , 'aquamarine' )) points (set, pch = 21, bg = ifelse (set[, 3] == 1, 'green4' , 'red3' )) |
- 输出:
- 可视化测试集结果
R
set = test_set X1 = seq ( min (set[, 1]) - 1, max (set[, 1]) + 1, by = 0.01) X2 = seq ( min (set[, 2]) - 1, max (set[, 2]) + 1, by = 0.01) grid_set = expand.grid (X1, X2) colnames (grid_set) = c ( 'Age' , 'EstimatedSalary' ) y_grid = predict (classifier, newdata = grid_set) plot (set[, -3], main = 'SVM (Test set)' , xlab = 'Age' , ylab = 'Estimated Salary' , xlim = range (X1), ylim = range (X2)) contour (X1, X2, matrix ( as.numeric (y_grid), length (X1), length (X2)), add = TRUE ) points (grid_set, pch = '.' , col = ifelse (y_grid == 1, 'coral1' , 'aquamarine' )) points (set, pch = 21, bg = ifelse (set[, 3] == 1, 'green4' , 'red3' )) |
- 输出:
因为在结果中,在训练集结果中发现了一个超平面,并在测试集结果中验证为最佳超平面。因此,支持向量机在R。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END