1. myfun=function(a=x1,b=x2,c=wi) #构造myfun函数计算加权欧式距离 2. {dis2=wi[1]*(a[1]-b[1])^2+wi[2]*(a[2]-b[2])^2+wi[3]*(a[3]-b[3])^2 3. +wi[4]*(a[4]-b[4])^2 4. dis=sqrt(dis2) 5. return(dis) 6. } 7. errRatio=vector() 8. for(m in 1:20){ #m为近邻个数 9. jc=vector() 10. for(q in -1:-4) 11. {fit=knn(train=newtrain[,q],test=newtest[,q],cl=blood_train[,5],k=m) 12. CT=table(blood_test[,5],fit) 13. errDeltex=c(errDeltex,(1-sum(diag(CT))/sum(CT))*100) 14. } 15. FI=errDeltex[-1]+1/4 #FI为变量重要性(k=m时) 16. wi=FI/sum(FI) #wi为各变量权重(k=m时) 17. for(i in 1:95){ #i为测试集样本编号 18. jqdis=apply(newtrain,1,myfun,a=newtest[i,],c=wi) 19. jl=which(order(jqdis)<m+1) #输出近邻位置(k=m时) 20. if(length(which(blood_train$donated[jl]==0))>length(which(blood_train$don ated[jl]==1))){ 21. jc=c(jc,0)} else { 22. jc=c(jc,1)} 23. } 24. CT=table(blood_test[,5],jc) 25. errRatio=c(errRatio,(1-sum(diag(CT))/sum(CT))*100) 26. } 27. plot(errRatio,type='b',xlab='近邻个数',ylab='错判率(%)',main='近邻数k与错判率')