R语言机器学习(1)-R的近邻分析—K近邻法

转载请注明出处:https://blog.csdn.net/xiezhiliang22
对应书籍:《R数据挖掘》薛薇 中国人民大学出版社

1 前言

下面这几个部分主要讲述如何使用R语言来实现几个经典的机器学习以及统计学之中的算法,在这里原理部分就一带而过,如果想要学习的话可以参考其他博主。这里主要介绍如何直接上手使用几个经典算法。

2 K近邻原理

数学原理:简单来说就是基于已经给定的样本数据,通过各种各样的数学定义距离,这个新加入的点靠哪一个近,就属于那一类。
误差评估
(1)旁置法————样本集合比较多的情况,分为2个集合分别为训练集合测试集
(2)留一法————样本集合比较少的情况,比如有n个样本,抽取出来一个作为测试集,重复n次计算误差率
适用范围:低维度的分类问题,高维度不太适用

3 R应用函数

注意:先下载class包
在这里插入图片描述
第一式子prob取TRUE代表函数的返回值是预测类别的概率,use.all表示当有多个等距离时候多个都参与。
第二个式子表示1-近邻算法
第三个式子是K近邻和之前误差分析中的留一法合在一起,这里不用指定训练样本集了

4 K近邻方法的特点+改进

(1)特征选择
选择对分类结果影响比较大的结果,可以使用数理统计之中的方法来做相关性检验看变量与其的影响因子之间有没相关性,可以使用相关分析,方差分析,卡方检验等等
此外还有选取不同的特征会导致有不同的误差,误差下降率越大说明这个特征选择越强
(2)基于变量重要性的加权K近邻法
这里有点类似于神经网络之中的权重影响对于最终结果的影响
公式:在这里插入图片描述
在下面的这段文字之前,先说明一下每一个的意思,w(i)权重 是由后面的FI(i)错判率得到的
在这里插入图片描述
(3)基于变量相似性的加权K近邻法
在普通的K近邻之中,默认的K个近邻有同等强度的影响,实际上越近的影响越大。所以距离越近。
具体处理办法:第一数值型变量做归一化处理,分类变量做-1或者+1这样,因为其没有实际距离上面的意义,只是分类上面的意义。
在这里插入图片描述
**函数公式:**注意提前加载kknn包
在这里插入图片描述

5 代码实例数据分析


##########KNN分类
set.seed(12345)#随机数的设置
x1<-runif(60,-1,1)  
x2<-runif(60,-1,1)  
y<-sample(c(0,1),size=60,replace=TRUE,prob=c(0.3,0.7))   
Data<-data.frame(Fx1=x1,Fx2=x2,Fy=y)  
SampleId<-sample(x=1:60,size=18)  
DataTest<-Data[SampleId,]   
DataTrain<-Data[-SampleId,]  

par(mfrow=c(2,2),mar=c(4,6,4,4))
plot(Data[,1:2],pch=Data[,3]+1,cex=0.8,xlab="x1",ylab="x2",main="全部样本")
plot(DataTrain[,1:2],pch=DataTrain[,3]+1,cex=0.8,xlab="x1",ylab="x2",main="训练样本和测试样本")
points(DataTest[,1:2],pch=DataTest[,3]+16,col=2,cex=0.8)

library("class")
errRatio<-vector()   
for(i in 1:30){    
 KnnFit<-knn(train=Data[,1:2],test=Data[,1:2],cl=as.factor(Data[,3]),k=i)
 CT<-table(Data[,3],KnnFit)  
 errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)     
}
plot(errRatio,type="l",xlab="近邻个数K",ylab="错判率(%)",main="近邻数K与错判率",ylim=c(0,80))

errRatio1<-vector()   
for(i in 1:30){
 KnnFit<-knn(train=DataTrain[,1:2],test=DataTest[,1:2],cl=as.factor(DataTrain[,3]),k=i) 
 CT<-table(DataTest[,3],KnnFit) 
 errRatio1<-c(errRatio1,(1-sum(diag(CT))/sum(CT))*100)    
}
lines(1:30,errRatio1,lty=2,col=2)

set.seed(12345)
errRatio2<-vector()   
for(i in 1:30){   
 KnnFit<-knn.cv(train=Data[,1:2],cl=as.factor(Data[,3]),k=i) 
 CT<-table(Data[,3],KnnFit)  
 errRatio2<-c(errRatio2,(1-sum(diag(CT))/sum(CT))*100)     
}
lines(1:30,errRatio2,col=2)

##############KNN回归
set.seed(12345)
x1<-runif(60,-1,1)  
x2<-runif(60,-1,1)  
y<-runif(60,10,20)   
Data<-data.frame(Fx1=x1,Fx2=x2,Fy=y)
SampleId<-sample(x=1:60,size=18)  
DataTest<-Data[SampleId,]  
DataTrain<-Data[-SampleId,]  
mseVector<-vector()    
for(i in 1:30){
 KnnFit<-knn(train=DataTrain[,1:2],test=DataTest[,1:2],cl=DataTrain[,3],k=i,prob=FALSE) 
 KnnFit<-as.double(as.vector(KnnFit))   
 mse<-sum((DataTest[,3]-KnnFit)^2)/length(DataTest[,3])   
 mseVector<-c(mseVector,mse)
}
plot(mseVector,type="l",xlab="近邻个数K",ylab="均方误差",main="近邻数K与均方误差",ylim=c(0,80))

############天猫数据加工
GetRatio<-function(data,days){    
 data<-within(data,{
  BuyHit<-ifelse(data$hitN!=0,round(data$buyN/data$hitN*100,2),NA)  
  BuyBBrand<-ifelse(data$brandN!=0,round(data$buyBrandN/data$brandN*100,2),NA)   
  ActDNTotalDN<-round(data$actDateN/days*100,2)            
  BuyDNactDN<-ifelse(data$actDateN!=0,round(data$buyDateN/data$actDateN*100,2),NA)  
  BuyOrNot<-sapply(data$buyN,FUN=function(x) ifelse(x!=0,"1","0")) 
  BuyOrNot<-as.factor(BuyOrNot)
 })
 return(data)
}
Tmall_train<-read.table(file="天猫_Train.txt",header=TRUE,sep=",")
Tmall_train<-GetRatio(Tmall_train,92)
Tmall_train<-Tmall_train[complete.cases(Tmall_train),]   
Tmall_test<-read.table(file="天猫_Test.txt",header=TRUE,sep=",")
Tmall_test<-GetRatio(Tmall_test,31)
Tmall_test<-Tmall_test[complete.cases(Tmall_test),]   

write.table(Tmall_train[,-(1:9)],file="天猫_Train_1.txt",sep=",",quote=FALSE,append=FALSE,row.names=FALSE,col.names=TRUE)
write.table(Tmall_test[,-(1:9)],file="天猫_Test_1.txt",sep=",",quote=FALSE,append=FALSE,row.names=FALSE,col.names=TRUE)

####天猫数据KNN分类讨论变量重要性
library("class")  
par(mfrow=c(2,2))
errRatio<-vector()
for(i in 1:30){   
 fit<-knn(train=Tmall_train[,-(1:9)],test=Tmall_test[,-(1:9)],cl=Tmall_train[,10],k=i)
 CT<-table(Tmall_test[,10],fit)
 errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)   
}
plot(errRatio,type="l",xlab="参数K",ylab="错判率(%)",main="参数K与错判率",cex.main=0.8)

errDelteX<-errRatio[7]
for(i in -11:-14){
 fit<-knn(train=Tmall_train[,c(-(1:9),i)],test=Tmall_test[,c(-(1:9),i)],cl=Tmall_train[,10],k=7)
 CT<-table(Tmall_test[,10],fit)
 errDelteX<-c(errDelteX,(1-sum(diag(CT))/sum(CT))*100)
}
plot(errDelteX,type="l",xlab="剔除变量",ylab="剔除错判率(%)",main="剔除变量与错判率(K=7)",cex.main=0.8)
xTitle=c("1:全体变量","2:消费活跃度","3:活跃度","4:成交有效度","5:活动有效度")
legend("topright",legend=xTitle,title="变量说明",lty=1,cex=0.6)   
FI<-errDelteX[-1]+1/4   
wi<-FI/sum(FI)       
GLabs<-paste(c("消费活跃度","活跃度","成交有效度","活动有效度"),round(wi,2),sep=":")
pie(wi,labels=GLabs,clockwise=TRUE,main="输入变量权重",cex.main=0.8)
ColPch=as.integer(as.vector(Tmall_test[,10]))+1
plot(Tmall_test[,c(11,13)],pch=ColPch,cex=0.7,xlim=c(0,50),ylim=c(0,50),col=ColPch,
     xlab="消费活跃度",ylab="成交有效度",main="二维特征空间中的观测",cex.main=0.8)

############天猫数据加权KNN分类
install.packages("kknn")
library("kknn")
par(mfrow=c(2,1))
Tmall_train<-read.table(file="天猫_Train_1.txt",header=TRUE,sep=",")
Tmall_train$BuyOrNot<-as.factor(Tmall_train$BuyOrNot)
fit<-train.kknn(formula=BuyOrNot~.,data=Tmall_train,kmax=11,distance=2,kernel=c("rectangular","triangular","gaussian"),na.action=na.omit())
plot(fit$MISCLASS[,1]*100,type="l",main="不同核函数和近邻个数K下的错判率曲线图",cex.main=0.8,xlab="近邻个数K",ylab="错判率(%)")
lines(fit$MISCLASS[,2]*100,lty=2,col=1)
lines(fit$MISCLASS[,3]*100,lty=3,col=2)
legend("topleft",legend=c("rectangular","triangular","gaussian"),lty=c(1,2,3),col=c(1,1,2),cex=0.7)   #给出图例

Tmall_test<-read.table(file="天猫_Test_1.txt",header=TRUE,sep=",")
Tmall_test$BuyOrNot<-as.factor(Tmall_test$BuyOrNot)
fit<-kknn(formula=BuyOrNot~.,train=Tmall_train,test=Tmall_test,k=7,distance=2,kernel="gaussian",na.action=na.omit())
CT<-table(Tmall_test[,1],fit$fitted.values)
errRatio<-(1-sum(diag(CT))/sum(CT))*100

library("class")
fit<-knn(train=Tmall_train,test=Tmall_test,cl=Tmall_train$BuyOrNot,k=7)
CT<-table(Tmall_test[,1],fit)
errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)
errGraph<-barplot(errRatio,main="加权K近邻法与K近邻法的错判率对比图(K=7)",cex.main=0.8,xlab="分类方法",ylab="错判率(%)",axes=FALSE)
axis(side=1,at=c(0,errGraph,3),labels=c("","加权K-近邻法","K-近邻法",""),tcl=0.25)
axis(side=2,tcl=0.25)



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值