K最近邻,顾名思义,就是K个最邻近的样本的意思。如果一个样本的最接近的K个邻居里,绝大多数属于某个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。KNN算法有两个关键点要注意。第一个关键点是K的确定,选择一个最佳的K值取决于数据分布情况。总的来说,较小的K值能使模型更不容易受样本不均衡的影响,而较大的K值能够减小噪声的影响。第二个关键点是最近邻的定义,也就是距离定义,常用的有欧式距离、余弦距离等,具体采用哪种距离定义要根据实际的数据和业务确定。由于KNN在确定分类决策上只依据最邻近的几个样本的类别来决定待分样本所属的类别,它只与极少量的相邻样本有关,因此它是非线性的,对于类域的交叉或重叠较多的待分样本集来说,KNN方法非常适用。
#选择iris数据集为例,iris共有150条1数据
#对iris进行归一化处理,scale归一化的公式为(x-mean(x))/sqrt(var(x))
iris_s=data.frame(scale(iris[,1:4]))iris_s<-cbind(iris_s,iris[,5])#对iris数据集随机选择其中的前100条数据作为已知分类的样本集(训练集)
sample.list<-sample(1:150,size=100)iris.known<-iris_s[sample.list,]#剩余50条数据作为位置分类的样本集(测试集)
iris.unknown<-iris_s[-sample.list,]#对测试集中的每个样本计算其与已知样本的距离,因为已经归一化,此处直接使用欧氏距离
案例1:股票市场数据的应用
#K=1时的结果不理想,只有50%的观测得到正确的预测,这可能因为K=1的模型过于光滑,使用K=3重复上述实验。
案例2:大篷车保险数据的一个应用
对ISLR库中的Caravan(大篷车)数据集运用KNN方法。该数据集包括85个预测变量,测量了5822人的人口特征。响应变最为Purchase(购买状态).表示一个人是否会购买大篷车保险险种。在该数据集中,只有6%的人购买了大篷车保险。
结果分析:事实表明K=1在被预测有购买倾向性的客户上KNN模型比随机预测效果好得多,77名这样的客户,其中9名,也就是11.7%事实上购买了保险。这个结果的概率是随机猜测得到结果概率的两倍。
结果分析:K=3时,成功率增加至19%,而当K=5时,成功率变为26.7%,这比随机猜想所得成功率的四倍还多。这似乎表明KNN在一个复杂数据集中可以发现一些真实的模式。
#案例3:鸢尾花数据集
library("class")train.idx<-sample(1:nrow(iris),100)iris.train<-iris[train.idx,]iris.test<-iris[-train.idx,]resknn<-knn(train=subset(iris.train,select=-Species),test=subset(iris.test,select=-Species),cl=iris.train$Species,k=2)table(iris.test$Species,resknn,dnn=c("Actual","predicted"))