java dbscan_聚类算法之DBScan(Java实现)[转]

package orisun;

import java.io.File;

import java.util.ArrayList;

import java.util.Vector;

import java.util.Iterator;public classDBScan {double Eps=3; //区域半径

int MinPts=4; //密度//由于自己到自己的距离是0,所以自己也是自己的neighbor

public Vector getNeighbors(DataObject p,ArrayListobjects){

Vector neighbors=new Vector();

Iterator iter=objects.iterator();while(iter.hasNext()){

DataObject q=iter.next();double[] arr1=p.getVector();double[] arr2=q.getVector();int len=arr1.length;if(Global.calEditDist(arr1,arr2,len)<=Eps){ //使用编辑距离//if(Global.calEuraDist(arr1, arr2, len)<=Eps){//使用欧氏距离//if(Global.calCityBlockDist(arr1, arr2, len)<=Eps){//使用街区距离//if(Global.calSinDist(arr1, arr2, len)<=Eps){//使用向量夹角的正弦

neighbors.add(q);

}

}returnneighbors;

}public int dbscan(ArrayListobjects){int clusterID=0;

boolean AllVisited=false;while(!AllVisited){

Iterator iter=objects.iterator();while(iter.hasNext()){

DataObject p=iter.next();if(p.isVisited())continue;

AllVisited=false;

p.setVisited(true); //设为visited后就已经确定了它是核心点还是边界点

Vector neighbors=getNeighbors(p,objects);if(neighbors.size()

p.setCid(-1); //cid初始为0,表示未分类;分类后设置为一个正数;设置为-1表示噪声。

}else{if(p.getCid()<=0){

clusterID++;

expandCluster(p,neighbors,clusterID,objects);

}else{int iid=p.getCid();

expandCluster(p,neighbors,iid,objects);

}

}

AllVisited=true;

}

}returnclusterID;

}private void expandCluster(DataObject p, Vectorneighbors,int clusterID,ArrayListobjects) {

p.setCid(clusterID);

Iterator iter=neighbors.iterator();while(iter.hasNext()){

DataObject q=iter.next();if(!q.isVisited()){

q.setVisited(true);

Vector qneighbors=getNeighbors(q,objects);if(qneighbors.size()>=MinPts){

Iterator it=qneighbors.iterator();while(it.hasNext()){

DataObject no=it.next();if(no.getCid()<=0)

no.setCid(clusterID);

}

}

}if(q.getCid()<=0){ //q不是任何簇的成员

q.setCid(clusterID);

}

}

}public static voidmain(String[] args){

DataSource datasource=newDataSource();//Eps=3,MinPts=4

datasource.readMatrix(new File("/home/orisun/test/dot.mat"));

datasource.readRLabel(new File("/home/orisun/test/dot.rlabel"));//Eps=2.5,MinPts=4//datasource.readMatrix(new File("/home/orisun/text.normalized.mat"));//datasource.readRLabel(new File("/home/orisun/text.rlabel"));

DBScan ds=newDBScan();int clunum=ds.dbscan(datasource.objects);

datasource.printResult(datasource.objects,clunum);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值