dbscan用 java代码_聚类算法之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; //區(qū)域半徑
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){//使用街區(qū)距離//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); //設(shè)為visited后就已經(jīng)確定了它是核心點還是邊界點
Vector neighbors=getNeighbors(p,objects);if(neighbors.size()
p.setCid(-1); //cid初始為0,表示未分類;分類后設(shè)置為一個正數(shù);設(shè)置為-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);
}
}
總結(jié)
以上是生活随笔為你收集整理的dbscan用 java代码_聚类算法之DBScan(Java实现)[转]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java项目几个月能完成_c#项目转JA
- 下一篇: java获取jtable的路径,Java