fitcknn - Matlab的kNN分类器

在Matlab下使用kNN (k近邻,k-Nearest Neighbor)分类器实现数据分类预测。

fitcknn - Matlab的kNN分类器

1 构造kNN分类器

1.1 fitcknn函数

使用fitcknn函数即可构造 (construct) kNN分类器。

输入:

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

输出:

  • ClassificationKNN对象

1.2 运行实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> kNNClassifier = fitcknn(TrainData', TrainLabels', 'NumNeighbors', 1)

kNNClassifier =

ClassificationKNN
ResponseName: 'Y'
CategoricalPredictors: []
ClassNames: [1x38 double]
ScoreTransform: 'none'
NumObservations: 1140
Distance: 'euclidean'
NumNeighbors: 1


Properties, Methods

>>
  • 此例设置NumNeighbors属性为1,即kNN的k值为1,取1近邻。

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

2.1 predict函数

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

输入:

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

输出:

  • 分类结果
    • 维度,数据项数×1列

2.2 运行实例

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
>> cls = predict(kNNClassifier, TestData(:,1:60)')

cls =

1
3
34
36
36
1
1
1
1
1
1
1
1
1
1
1
37
1
30
4
4
4
4
30
4
4
4
4
10
10
10
10
10
10
36
2
34
36
36
2
2
2
2
2
2
2
2
2
2
2
33
2
2
2
33
2
4
33
4
28

>>
  • 输出了60项数据的分类预测
    • 可以看到,预测效果尚可,有一定的预测能力。
    • 考虑到我是用了较高维度的数据(1024维),且仅做简单实验测试之用,k值限制在了1近邻,错误预测较多也在意料之中。