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,所以自己也是自己的neighborpublic Vector<DataObject> getNeighbors(DataObject p,ArrayList<DataObject> objects){Vector<DataObject> neighbors=new Vector<DataObject>();Iterator<DataObject> 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<DataObject> objects){int clusterID=0;boolean AllVisited=false;while(!AllVisited){Iterator<DataObject> iter=objects.iterator();while(iter.hasNext()){DataObject p=iter.next();if(p.isVisited())continue;AllVisited=false;p.setVisited(true);     //设为visited后就已经确定了它是核心点还是边界点Vector<DataObject> neighbors=getNeighbors(p,objects);if(neighbors.size()<MinPts){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<DataObject> neighbors,int clusterID,ArrayList<DataObject> objects) {p.setCid(clusterID);Iterator<DataObject> iter=neighbors.iterator();while(iter.hasNext()){DataObject q=iter.next();if(!q.isVisited()){q.setVisited(true);Vector<DataObject> qneighbors=getNeighbors(q,objects);if(qneighbors.size()>=MinPts){Iterator<DataObject> 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=4datasource.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);}
}

转载于:https://www.cnblogs.com/wukong0214/p/3440482.html

聚类算法之DBScan(Java实现)[转]相关推荐

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

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

  2. dbscan用 java代码_聚类算法之DBScan(Java实现)[转]

    package orisun; import java.io.File; import java.util.ArrayList; import java.util.Vector; import jav ...

  3. (3)聚类算法之DBSCAN算法

    文章目录 1.引言 2.`DBSCAN`相关定义 3.`DBSCAN`密度聚类思想 3.1 `DBSCAN`算法定义 3.2 DBSCAN算法流程 4.`DBSCAN`算法实现 4.1 使用`nump ...

  4. 机器学习-无监督学习-聚类:聚类方法(二)--- 基于密度的聚类算法【DBSCAN文本聚类算法,密度最大值文本聚类算法】

    密度聚类方法的指导思想是,只要样本点的密度大于某阀值,则将该样本添加到最近的簇中. 基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一 ...

  5. 聚类算法(part1)--DBSCAN

    学习笔记,仅供参考,有错必纠 参考书目:<数据挖掘导论>:<R语言实战>:<应用预测建模>;<R语言与数据挖掘>:等 聚类 密度聚类 基于密度的聚类寻找 ...

  6. 聚类算法Clustering-KMeans/DBSCAN/DenPeak/NormalizeCut/RCC

    本文结构安排 经典聚类算法:线性聚类 Kmeans 经典聚类算法:非线性聚类 DBSCAN.谱聚类 新兴聚类算法:DenPeak,RCC K-means K-means clustering is a ...

  7. 基于密度的聚类算法:DBSCAN

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次聚类方法不同, ...

  8. 聚类算法之DBSCAN算法之一:经典DBSCAN

    DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类. 1.epsilon-neighborhood epsoi ...

  9. 机器学习8—聚类算法之DBSCAN和Birch算法

    聚类算法 一.基于密度的聚类DBSCAN算法 1.1DBSCAN算法的基本概念 1.2DBSCAN算法参数选择 1.3DBSCAN算法原理 1.4DBSCAN算法中dbscan()函数的说明 1.5D ...

最新文章

  1. Java 内部类分析
  2. 重磅|我国科学家成功研制全球神经元规模最大的类脑计算机
  3. java框架知识_java框架知识点总结
  4. 企业官网建设注重这四点错不了!
  5. 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )
  6. 使用nginx进行负载均衡
  7. 大数据WE阶段(十七)文件上传
  8. 十大类疫情服务紧缺 阿里广发英雄帖抗疫小程序开发者最高可获50万元奖励
  9. 在不停止mysql复制主服务器的情况下,配置一个mysql复制从服务器
  10. C#中通过Lambda表达式为委托传入更多的参数
  11. 利用IAR软件,将KEIL项目工程直接转换IAR项目工程
  12. duet二重奏hp_二重奏Duet Game pc版|二重奏电脑版下载_v1.7_9号软件下载
  13. UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx
  14. Ubuntu18.04安装Pangolin0.6
  15. POJ1555-Polynomial Showdown
  16. 安卓Android公交查询系统app资源分享
  17. 测试手机单核性能软件,跑分软件Geekbench公布“作弊”名单:华为6款手机上榜...
  18. 某鱼的兼职并不是那么好做,要钱也不是漫天要价
  19. Powerdesinger使用心得
  20. python爬虫爬取漫画(仅供学习)

热门文章

  1. Linux应急响应实战
  2. Ant在Java项目中的使用(一眼就看会)
  3. 《剑指offer》二维数组中的查找
  4. ReactNative-WebView组件
  5. python学习笔记(四)字典(dict)
  6. 深度学习笔记5:正则化与dropout
  7. 解决python2.7 UnicodeDecodeError和UnicodeEncodeError问题
  8. error: style attribute '@android:attr/windowEnterAnimation' not found.
  9. 以非泛型方式调用泛型方法(三)
  10. 4G内存服务器的MySQL配置优化