R-数据挖掘-求混合型数据对象距离(一)

海林老师《数据挖掘》(韩佳炜书)课程作业系列

要求:自己写R/Python代码、函数实现一系列算法

其他参见:

R-数据挖掘-求混合型数据对象距离(一)

R-数据挖掘-主成分分析PCA(二)

R-数据挖掘-关联规则(三)

R-数据挖掘-决策树ID3(四)

R-数据挖掘-贝叶斯分类(五)

R-数据挖掘-聚类Kmeans(六)

R-数据挖掘-聚类DBSCAN(七)

全文逻辑:(读者可将所有代码按顺序复制到RStudio,全选ctrl+A,运行ctrl+enter,查看结果)

  1. 分析
  2. 算法/函数
  3. 测试数据
  4. 测试代码
  5. 测试结果(截图)

分析:

##输入数据要求:数据缺失值处理为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

 结果:

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值