fitcsvm - Matlab的SVM分类器

在Matlab下使用SVM(支持向量机,support vector machine)分类器实现数据分类预测。

fitcsvm - Matlab的SVM分类器

1 构造SVM分类器

Matlab已经开始提示,推荐使用fitcsvm,且未来版本将删除 svmclassify。因此,本文介绍fitcsvm。

1.1 fitcsvm函数

使用fitcsvm函数即可构造 (construct) SVM分类器。

输入:

  • 分类集数据
  • 分类集标记
  • 参数表
    • 属性 key
    • 参数 value
1
svmClassifier = fitcsvm(TrainData',TrainLabels')
  • TrainDataTrainLabels,是我分离出的训练集数据,此处做了矩阵转置,因为MatLab的fitcknn函数接收的参数是一行一条数据,一列一个特征维度的。
    • 具体地,TrainData是一个1024×1140 double的数据集,原始数据的结构是每列一条数据,每条数据有1024个特征(feature)。
    • TrainLabels是一个1×1140 double的数据集,原始数据的结构是每列一个标记,与TrainData一一对应,实现标定。
  • 实际上,fitcknnTrainLabels识别为ClassNames,也就是说,可以输入非数值型标记,只要区分出类别即可。
  • 注意:fitcsvm只支持二分类!

输出:

  • ClassificationSVM对象

1.2 运行实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> svmClassifier = fitcsvm(TrainData',Labels)

svmClassifier =

ClassificationSVM
ResponseName: 'Y'
CategoricalPredictors: []
ClassNames: [0 1]
ScoreTransform: 'none'
NumObservations: 1140
Alpha: [32x1 double]
Bias: -0.8187
KernelParameters: [1x1 struct]
BoxConstraints: [1140x1 double]
ConvergenceInfo: [1x1 struct]
IsSupportVector: [1140x1 logical]
Solver: 'SMO'


Properties, Methods

>>

2 使用SVM分类器实现预测分类

2.1 predict函数

使用predict函数即可根据分类器,对输入的测试数据进行分类预测。

输入:

  • 分类器 classifier
  • 测试数据
1
[labels, scores] = predict(svmClassifier{i}, TestData');
  • TestData(:,1:60)'做了转置,使得一行一条数据,示例选取60条数据
  • 输出的cls是一个60条类信息的60×1维度矩阵

输出:

  • 分类结果

    • 维度,数据项数×1列
  • 分数 score

    • The SVM classification score for classifying observation x is the signed distance from x to the decision boundary ranging from -∞ to +∞. A positive score for a class indicates that x is predicted to be in that class, a negative score indicates otherwise.

      (Matlab Documentation)

    • score 是输入点x到决策边界的有符号距离。也就是x(...)所在的高维度空间内,x点与分类超平面的有向距离。绝对值越大,说明离分类超平面越远,则更加属于对应类别。

2.2 运行实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> [labels, scores] = predict(svmClassifier, TestData(:,1:5)')

labels =

0
0
0
0
0


scores =

4.1200 -4.1200
3.9809 -3.9809
2.5742 -2.5742
3.0851 -3.0851
2.2911 -2.2911

>>
  • 输出了1~5项数据的分类预测

    • 在我的测试例中,实际上都是判定1~5条数据不属于第38个标定类。