#knn算法学习笔记
1.定义

图片来自https://baike.baidu.com/item/%E9%82%BB%E8%BF%91%E7%AE%97%E6%B3%95/1151153?fr=aladdin
K值若较小,这里取内圈,红色三角占2/3,则绿色的未知物被判断为红色三角;
K值若较大,这里取外圈,蓝色方块占3/5,则绿色未知物被判断为蓝色方块。
> for(i in 1:round(sqrt(dim(train)[1]))) { + pre_result <- knn(train=train,test=test,cl=train_lab,k=i) + Freq <- table(pre_result,test_lab) + print(1-sum(diag(Freq))/sum(Freq)) #误差率 + } [1] 0.08219178 [1] 0.06849315 [1] 0.08219178 [1] 0.06849315 [1] 0.05479452 [1] 0.06849315 [1] 0.05479452 [1] 0.09589041 [1] 0.04109589
一般来说就是找误差率最小的k
以UCI数据库中的鸢尾花数据集举例,UCI地址:http://archive.ics.uci.edu/ml/index.php,不过iris是R自带的数据集,可以直接加载使用。
4.1 包
R中有许多包都可以实现knn算法,以下以class包、DMwR包和kknn包为例进行说明。
4.2 class包中的knn函数
主要步骤:
> # z-score数据标准化 > iris_scale <- scale(iris[-5]) > train <- iris_scale[c(1:25,50:75,100:125),] #训练集 > test <- iris_scale[c(26:49,76:99,126:150),] #测试集 > train_lab <- iris[c(1:25,50:75,100:125),5] > test_lab <- iris[c(26:49,76:99,126:150),5] > pre <- knn(train=train,test=test,cl=train_lab,k=round(sqrt(dim(train)[1])),prob = F) > table(pre,test_lab) test_lab pre setosa versicolor virginica setosa 24 0 0 versicolor 0 24 3 virginica 0 0 22
4.3 DMwR包中的Knn
> train<-iris[c(1:25,50:75,100:125),] #训练集 > test<-iris[c(26:49,76:99,126:150),] #测试集 > pre2 <- kNN(Species~.,train,test,norm=T,k=round(sqrt(dim(train)[1]))) > table(pre2,test$Species) pre2 setosa versicolor virginica setosa 24 0 0 versicolor 0 24 3 virginica 0 0 22
kknn()函数的语法和参数如下:
kknn(formula = formula(train),train, test, na.action = na.omit(), k= 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts= c(‘unordered‘ = "contr.dummy", ordered ="contr.ordinal"))
formula一个回归模型:分类变量~特征变量;
train指定训练样本集;
test指定测试样本集;
na.action缺失值处理,默认为去掉缺失值;
k近邻数值选择,默认为7;
distance闵可夫斯基距离参数,p=2时为欧氏距离;
其他参数略,详情可以查询kknn包的说明> train<-iris[c(1:25,50:75,100:125),] #训练集 > test<-iris[c(26:49,76:99,126:150),] #测试集 > # 调用kknn > pre3 <- kknn(Species~., train, test, distance = 1, kernel = "triangular") > # 获取fitted.values > fit <- fitted(pre3) > table(fit,test$Species) fit setosa versicolor virginica setosa 24 0 0 versicolor 0 22 4 virginica 0 2 21
原文:https://www.cnblogs.com/gaowenxingxing/p/11829424.html