まず、実験の目的
- DBSCANの基本原則を理解します。
- DBSCAN書き込みコードとデータのクラスタリングのアルゴリズムを実装
第二に、実験手順
- データセットを使用した:Rのfactoextraバッグmultishapes言語データセットを
- 関数は、最初の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]))
第四に、業績
元のデータ
のクラスタリング後