海林老师《数据挖掘》(韩佳炜书)课程作业系列
要求:自己写R/Python代码、函数实现一系列算法
其他参见:
全文逻辑:(读者可将所有代码按顺序复制到RStudio,全选ctrl+A,运行ctrl+enter,查看结果)
- 分析
- 算法/函数
- 测试数据
- 测试代码
- 测试结果(截图)
分析:
##输入数据要求:数据缺失值处理为NA,
######输入每列数据类型(向量;数值型,标称型,序数型),
######序数型数据已经转换为排位,
##不区分对称二元和非对称二元==>归为标称型
#输入:数据框,每列数据类型
#返回:对象间的距离矩阵
算法实现(编写函数):
mydis<-function(data,type){
#对于数值型数据求距离
d_num_ij<-function(xi,xj,minx,maxx){
return(abs(xi-xj)/(maxx-minx))
}
#对标称型数据求距离
d_bc_ij<-function(xi,xj){
if(xi==xj){
return(0)
}else{
return(1)
}
}
d_data<-function(data,type){
r=nrow(data)
c=ncol(data)
#对于序数型数据,先转换为z值,返回矩阵
z_matrix<-function(data,type){
index=which(type=="序数型")
yuan=as.matrix(data[,index])
result=apply(yuan,2,function(v){
return((v-1)/(max(v,na.rm = T)-1))
})
return(result)
}
xs_z=z_matrix(data,type)
#判断两个对象属性之间的距离
#定义距离矩阵
my_d=matrix(rep(0,r*r),r,r)
for(i in 1:r){#第i个对象
for(j in 1:r){#第j个对象
d_k_ij=c()
sumf=0#记录分母
kk=0#记录是第几个序数型
for (k in 1:c) {#第K个属性
f=1
if(!is.na(data[i,k]) & !is.na(data[j,k]) ){
if(type[k]=="数值型"){
maxx_k=max(data[,k],na.rm = TRUE)
minx_k=min(data[,k],na.rm = TRUE)
d_k_ij[k]=d_num_ij(data[i,k],data[j,k],minx_k,maxx_k)
}else if(type[k]=="标称型"){
d_k_ij[k]=d_bc_ij(data[i,k],data[j,k])
}else if(type[k]=="序数型"){
kk=kk+1
maxx_k=max(xs_z[,kk],na.rm = TRUE)
minx_k=min(xs_z[,kk],na.rm = TRUE)
d_k_ij[k]=d_num_ij(xs_z[i,kk],xs_z[j,kk],minx_k,maxx_k)
}
}else{
f=0
d_k_ij[k]=0
}
sumf=sumf+f
}
my_d[i,j]=sum(d_k_ij)/sumf
}
}
return(my_d)
}
return(d_data(data,type))
}
数据测试:
测试数据1:书上的测试数据
test1=c("A","B","C","A")
test2=c(3,1,2,3)#优秀、一般、好、优秀
test3=c(45,22,64,28)
testdata=data.frame(test1,test2,test3)
str(testdata)
aaa=mydis(testdata,c("标称型","序数型","数值型"))
testdata
aaa
结果:
测试数据2:存在缺失值的数据
test4<-data.frame(id=c(1,2,3,4,5),name=c("小","红","小","文","文"),like1=c(3,NA,4,1,2),like2=c(1,NA,2,2,1))
xx4<-mydis(test4,c("数值型","标称型","序数型","序数型"))
test4
xx4