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

 結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章