海林老師《數據挖掘》(韓佳煒書)課程作業系列
要求:自己寫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
結果: