KNN近邻分类
随机抽取1/2的样本作为训练集,另外一半的样本作为测试集来验证模型的效果
iris1<-iris
set.seed(1234)
利用caret包的createDataPartition函数按不同类别等比例抽取50%
library(caret)
ind <- createDataPartition(iris1$Species,times=1,p=0.5,list=F)
traindata <-iris1[ind,] #构建训练集
testdata <- iris1[-ind,] #构建测试集
利用class包中的knn函数对测试集的分类进行预测。
library(class)
a=knn(traindata[,1:4],testdata[,1:4],traindata[,5],k=6) #指定k值为3
a[1];a[75] # 查看第一条和最后一条测试数据的预测结果
KNN算法流程验证:
ceshi <- function(n=1,k=3){
计算第n个测试集样本与训练集样本的距离
x <- (traindata[,1:4]-testdata[rep(n,75),1:4])^2
traindata$dist1 <- apply(x,1,function(x) sqrt(sum(x)))
对距离进行升序排序,选择最近的K个邻居
mydata <- traindata[order(traindata$dist1)[1:k],5:6]
统计不同类别的频数
result <- data.frame(sort(table(mydata$Species),decreasing = T))
给出最后的预测结果
return(result[1,1])
}
ceshi() # 第一个样本的预测结果
ceshi(n=75) # 最后一个样本的预测结果