近邻法是一种基本的分类与回归方法,这里主要讲述在分类问题中的k近邻算法。
近邻法的三个基本要素:
(1):值的选择;
(2):距离的度量;
(3):分类决策的规则。
近邻法的基本思想:
step1:给定一个训练集;
step2:输入一个新的数据,在训练集中找到与该数据最邻近的个数据;
step3:决策,如果这k个数据的多数属于某个类,就把输入的新数据归于这个类。
所以根据它的三个基本要素及基本思想,可以很清晰的看出接下来要做的工作无非就是两个:
(1):值的选择;
(2):距离的度量。
首先介绍距离的度量问题:
近邻模型的特征空间通常是维是实数向量空间,即:,使用的距离通常是欧氏距离,当然还有曼哈顿距离以及更一般的距离。下面分别介绍这几种距离的计算:
设:,.
和的距离定义为:
,这里.
当时,为曼哈顿距离,当时,为欧式距离。
注:不同距离的选择会导致最终分类的结果也有所以不同。
再介绍值的选择
值的选择会对近邻法的结果产生重大的影响,想想为什么呢?
当选择较小的值时,就相当于用一个较小的领域中的训练集数据进行预测,这样,近似误差会减小,但是估计误差会增大,预测结果对近邻的数据非常敏感,容易发生过拟合;
当选择较大的值时,其结果恰好与选择较小的值相反,其近似误差会变大,估计误差会变小;
当选择的时,这时便完失去了预测的意义!
这里使用鸢尾花数据集
## k近邻算法
#-----利用鸢尾花数据------
iris
# 构造训练集和测试集,依旧用抽样的方式
train_ord <- sample(nrow(iris),120,replace = FALSE)
traindat <- iris[train_ord,]
testdat <- iris[-train_ord,]
## 构造分类器,并展示结果
library(class)
result <- knn(train <- traindat[,1:4],test <- testdat[,1:4],cl <- traindat$Species,k = 3)
library(gmodels)
CrossTable(testdat$Species,result)
## 调整k值为4,与k=3进行比较
result1 <- knn(train <- traindat[,1:4],test <- testdat[,1:4],cl <- traindat$Species,k = 4)
CrossTable(testdat$Species,result1)
从上述结果可以看出,当和时的结果是一样的,但是分类结果都非常不错!
参考文献
【1】李航,统计学习方法,清华大学出版社.