実験データマイニング(H):DBSCANクラスタリングR言語

まず、実験の目的

  1. DBSCANの基本原則を理解します。
  2. DBSCAN書き込みコードとデータのクラスタリングのアルゴリズムを実装

第二に、実験手順

  1. データセットを使用した:Rのfactoextraバッグmultishapes言語データセットを
    ここに画像を挿入説明
  2. 関数は、最初の2つのパラメータを決定する:
    イプシロン(1):隣接点の周りの半径領域
    (2)minPts:内側領域含むと隣接点の少なくとも数
    上記二つのパラメータに応じて、サンプル点は、次の3つのカテゴリに分けることができます。

核ポイント:フィールド> = minPts、比較サンプル点の核内のミートポイント
を満たす<当minPtsが、この点は、得られたコアポイントの数であってもよいことが点:境界点
ノイズポイント:どちらの核生成点がエッジ点ではないが、それはポイントは、このカテゴリーに属していません

  • 計算点とヨーロッパからの点の間のDisMatrix距離行列
  • 訪問したデータセットの列を追加し、未訪問は1が訪問し、0を表し、
  • DATA_Nに保存されているタイプ判定ポイント
  • DATA_Cに格納された削除ノイズ・ポイント
  • の交差点に関連した、フィールドから再計算
  • ポイントラベルの異なるタイプについて
  • 描きます

第三に、実験コード

library(factoextra)
library(ggplot2)

data<-data.frame(multishapes[,1:2])

ggplot(data,aes(x,y))+geom_point()

#主函数
DBSCAN = function(data,eps,MinPts){

rows = nrow(data)
disMatrix<-as.matrix(dist(data, method = "euclidean"))#求距离

data$visited <- rep(0,rows)
names(data)<-c("x","y","visited")

data_N = data.frame(matrix(NA,nrow =rows,ncol=3)) #领域集N,存放索引、领域内的点数、点的类型
names(data_N)<-c("index","pts","cluster")
 
#判断点的类型,1核心点,2边界点,0噪声点

for(i in 1:rows){
  if(data$visited[i] == 0){ #未被访问的点
    data$visited[i] = 1  #标记已经被访问
    index <- which( disMatrix[i,] <= eps)
    pts <- length(index)
     
   
     if(pts >= MinPts){
      data_N[i,]<-c(i,pts,"1")
    }else if(pts>1 && pts< MinPts){
      data_N[i,]<-c(i,pts,"2")
    }else{
      data_N[i,]<-c(i,pts,"0")
    }
  }
}

   #删除噪声点
  data_C<-data[which(data_N$cluster!=0),]
  
  #去掉噪声点之后的领域
  disMatrix2<-as.matrix(dist(data_C, method = "euclidean"))
  Cluster<-list()
  for(i in 1:nrow(data_C)){
    Cluster[[i]]<-names(which(disMatrix2[i,]<= eps))
  }
  
#合并有交集的邻域,生成一个新簇

  for(i in 1:length(Cluster)){
    for(j in 1:length(Cluster)){
      if(i!=j && any(Cluster[[j]] %in% Cluster[[i]])){
        if(data_N[Cluster[[i]][1],]$cluster=="1"){
          Cluster[[i]]<-unique(append(Cluster[[i]],Cluster[[j]])) #合并,删除重复
          Cluster[[j]]<-list()
        }
      }
    }
  }

  newCluster<-list()       #去掉空列表
  for(i in 1:length(Cluster)){
    if(length(Cluster[[i]])>0){
      newCluster[[length(newCluster)+1]]<-Cluster[[i]]
    }
  }
  
  #为相同簇中的对象赋相同的标签

  
  data_C[,4]<-as.character()
  for(i in 1:length(newCluster)){
    for(j in 1:length(newCluster[[i]])){
      data_C[newCluster[[i]][j],4]<-i
    }
    
  }
  return(data_C)
}


  
  
  #运行
test<-DBSCAN(data,0.15,6)  #设定eps为0.15,minpts为6


ggplot(test,aes(x,y,colour=factor(test[,4])))+
  geom_point(shape=factor(test[,4]))

第四に、業績

元のデータ
ここに画像を挿入説明
のクラスタリング後
ここに画像を挿入説明

公開された11元の記事 ウォンの賞賛0 ビュー63

おすすめ

転載: blog.csdn.net/qq_43863790/article/details/104069549