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

本文介绍了基于密度的聚类算法DBScan,并通过Java实现了该算法。DBScan能够发现噪声并形成核心点簇。文章展示了算法的核心代码,包括获取邻居点、DBScan遍历过程和簇的扩展。实例中还提供了数据读取和结果打印的功能。
摘要由CSDN通过智能技术生成

本文接数据挖掘-基于Kmeans算法、MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上). (update 2012.12.28 关于本项目下载及运行的常见问题 FAQ见 newsgroup18828文本分类器、文本聚类器、关联分析频繁模式挖掘算法的Java实现工程下载及运行FAQ

DBScan是一种基于密度的聚类算法,它有一个核心点的概念:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点。核心和它Eps范围内的邻居形成一个簇。在一个簇内如果出现多个点都是核心点,则以这些核心点为中心的簇要合并。

下图给出DBScan的聚类结果:

a6adae0c2989ffe2c0ad8840ad59ef04.pngJava实现的快速排序算法,分享出来共同学习交流~ public class QuickSort{ public static void main(String args[]){ int[]a={1,5,7,5,7,55,8,7,9,2,1,5}; quickSort(a,0,a.length-1); for(int i:a){ System.out.pri

可以看到DBScan可以发现噪声,即它把(3,14)判定为噪声。

到这里你一定有个疑问:为什么(8,3)一个点形成了一个簇,不是一个簇最少应该包含MinPts个点吗,如果只有一个点,那(8,3)应该归为噪声才对呀?

其实你仔细阅读下面的代码就会发现原因。在算法运行的早期,(8,3)、(5,3)、(8,6)、(10,4)被划分为一个簇,并且此时判定(8,3)是核心点—这个决定不会再更改。只是到后来(5,3)、(8,6)、(10,4)又被划分到其他簇中去了。

下面给出DBScan算法的核心代码:

package orisun;

import java.io.File;

import java.util.ArrayList;

import java.util.Vector;

import java.util.Iterator;

public class DBScan {

double Eps=3;//区域半径

int MinPts=4;//密度

//由于自己到自己的距离是0,所以自己也是自己的neighbor

public Vector getNeighbors(DataObject p,ArrayList objects){

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);

}

}

return neighbors;

}

public int dbscan(ArrayList objects){

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()

if(p.getCid()<=0)

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;

}

}

return clusterID;

}

private void expandCluster(DataObject p, Vector neighbors,

int clusterID,ArrayList objects) {

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 void main(String[] args){

DataSource datasource=new DataSource();

//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=new DBScan();

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

datasource.printResult(datasource.objects,clunum);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值