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与错判率')