jsp中DBSCAN算法实现实例

DBSCAN是一种基于密度的聚类算法,它的基本原理就是给定两个参数,ξ和minp,其中 ξ可以理解为半径,算法将在这个半径内查找样本,minp是一个以ξ为半径查找到的样本个数n的限制条件,只要n>=minp,查找到的样本点就是核心样本点,算法的具体描述见参考文件1,下边是这个算法的java实现:
  首先定义一个Point类,代表样本点

  <!--[endif]-->

  

package com.sunzhenxing;

  public class Point {

  private int x;

  private int y;

  private boolean isKey;

  private boolean isClassed;

  public boolean isKey() {

  return isKey;

  }

  public void setKey(boolean isKey) {

  this.isKey = isKey;

  this.isClassed=true;

  }

  public boolean isClassed() {

  return isClassed;

  }

  public void setClassed(boolean isClassed) {

  this.isClassed = isClassed;

  }

  public int getX() {

  return x;

  }

  public void setX(int x) {

  this.x = x;

  }

  public int getY() {

  return y;

  }

  public void setY(int y) {

  this.y = y;

  }

  public Point(){

  x=0;

  y=0;

  }

  public Point(int x,int y){

  this.x=x;

  this.y=y;

  }

  public Point(String str){

  String[] p=str.split(",");

  this.x=Integer.parseInt(p[0]);

  this.y=Integer.parseInt(p[1]);

  }

  public String print(){

  return "<"+this.x+","+this.y+">";

  }

  }

  然后定义一个工具类,为算法的实现服务:

  package com.sunzhenxing;

  import java.io.BufferedReader;

  import java.io.FileReader;

  import java.io.IOException;

  import java.util.*;

  public class Utility {

  /**

  * 测试两个点之间的距离

  * @param p 点

  * @param q 点

  * @return 返回两个点之间的距离

  */

  public static double getDistance(Point p,Point q){

  int dx=p.getX()-q.getX();

  int dy=p.getY()-q.getY();

  double distance=Math.sqrt(dx*dx+dy*dy);

  return distance;

  }
   /**
  * 检查给定点是不是核心点

  * @param lst 存放点的链表

  * @param p 待测试的点

  * @param e e半径

  * @param minp 密度阈值

  * @return 暂时存放访问过的点

  */

  public static List<Point> isKeyPoint(List<Point> lst,Point p,int e,int minp){

  int count=0;

  List<Point> tmpLst=new ArrayList<Point>();

  for(Iterator<Point> it=lst.iterator();it.hasNext();){

  Point q=it.next();

  if(getDistance(p,q)<=e){

  ++count;

  if(!tmpLst.contains(q)){

  tmpLst.add(q);

  }

  }

  }

  if(count>=minp){

  p.setKey(true);

  return tmpLst;

  }

  return null;

  }

  public static void setListClassed(List<Point> lst){

  for(Iterator<Point> it=lst.iterator();it.hasNext();){

  Point p=it.next();

  if(!p.isClassed()){

  p.setClassed(true);

  }

  }

  }

  /**

  * 如果b中含有a中包含的元素,则把两个集合

合并

  * @param a

  * @param b

  * @return a

  */

  public static boolean mergeList(List<Point> a,List<Point> b){

  boolean merge=false;

  for(int index=0;index<b.size();++index){

  if(a.contains(b.get(index))){

  merge=true;

  break;

  }

  }

  if(merge){

  for(int index=0;index<b.size();++index){

  if(!a.contains(b.get(index))){

  a.add(b.get(index));

  }

  }

  }

  return merge;

  }

  /**

  * 返回文本中的点集合

  * @return 返回文本中点的集合

  * @throws IOException

  */

  public static List<Point> getPointsList() throws IOException{

  List<Point> lst=new ArrayList<Point>();

  String txtPath="src\com\sunzhenxing\points.txt";

  BufferedReader br=new BufferedReader(new FileReader(txtPath));

  String str="";

  while((str=br.readLine())!=null && str!=""){

  lst.add(new Point(str));

  }

  br.close();

  return lst;

  }

  }

  最后在主程序中实现算法,如下所示:

  package com.sunzhenxing;

  import java.io.*;

  import java.util.*;

  public class Dbscan {

  private static List<Point> pointsList=new ArrayList<Point>();//存储所有点的集合

  private static List<List<Point>> resultList=new ArrayList<List<Point>>();//存储DBSCAN算法返回的结果集

  private static int e=2;//e半径

  private static int minp=3;//密度阈值

  /**

  * 提取文本中的的所有点并存储在pointsList中

  * @throws IOException

  */

  private static void display(){

  int index=1;

  for(Iterator<List<Point>> it=resultList.iterator();it.hasNext();){

  List<Point> lst=it.next();

  if(lst.isEmpty()){

  continue;

  }
  System.out.println("-----第"+index+"个聚类-----");
  for(Iterator<Point> it1=lst.iterator();it1.hasNext();){

  Point p=it1.next();

  System.out.println(p.print());

  }

  index++;

  }

  }

  //找出所有可以直达的聚类

  private static void applyDbscan(){

  try {

  pointsList=Utility.getPointsList();

  for(Iterator<Point> it=pointsList.iterator();it.hasNext();){

  Point p=it.next();

  if(!p.isClassed()){

  List<Point> tmpLst=new ArrayList<Point>();

  if((tmpLst=Utility.isKeyPoint(pointsList, p, e, minp)) != null){

  //为所有聚类完毕的点做标示

  Utility.setListClassed(tmpLst);

  resultList.add(tmpLst);

  }

  }

  }

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  //对所有可以直达的聚类进行合并,即找出间接可达的点并进行合并

  private static List<List<Point>> getResult(){

  applyDbscan();//找到所有直达的聚类

  int length=resultList.size();

  for(int i=0;i<length;++i){

  for(int j=i+1;j<length;++j){

  if(Utility.mergeList(resultList.get(i), resultList.get(j))){

  resultList.get(j).clear();

  }

  }

  }

  return resultList;

  }

  /**

  * 程序主函数

  * @param args

  */

  public static void main(String[] args) {

  getResult();

  display();

  //System.out.println(Utility.getDistance(new Point(0,0), new Point(0,2)));

  }

  }

  

下边是一个小测试, 即使用src\com\sunzhenxing\points.txt文件的内容进行测试,points.txt的文件内容是:

 

时间: 2024-11-10 10:52:50

jsp中DBSCAN算法实现实例的相关文章

对Weka中DBSCAN算法的分析以及在C#中的实现

DBSCAN算法是常用的数据挖掘算法.所有的聚类方法分为若干类型,前面讨论过的KMEANS算法是基于 划分的方法进行聚类,而这次提到的DBSCAN算法是基于密度的方法.当然其它的还有基于层次凝聚和分 裂的方法.基于模型的方法等.我先对Weka中实现的DBSCAN算法进行一个介绍和分析,然后再分析自己 用C#实现的DBSCAN方法.但在这之前要解释几个概念,如果之前没有了解过这个算法的话,最好是先熟 悉几个概念:epsilon-邻域.核心对象.(直接)密度可达.密度相连,这些概念可以在<数据挖掘概

JSP中param标签用法实例分析_JSP编程

本文实例分析了JSP中param标签用法.分享给大家供大家参考,具体如下: Jsp中param标签的使用 <jsp:param>操作被用来以"名-值"对的形式为其他标签提供附加信息.它和<jsp:include>.<jsp:forward>.<jsp:plugin>一起使用,方法如下: 复制代码 代码如下: <jsp:param name="paramName" value="paramValue&qu

jsp中自定义标签用法实例分析_JSP编程

本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文件如下: 首先是要写×.tld文件,当项目随着服务器启动的时候,会检查项目中有没有*tld文件. 写的tld文件 <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://ja

java类中如何直接调用JSP中定义的bean实例

问题描述 在JSP页面中,定义了<jsp:useBeanid="pool"scope="application"class="dataConnPool.PoolBean"/>然后在编写一个java类,里面想直接调用jsp页面中的pool实例,怎么做? 解决方案 解决方案二:这个需求都被你想出来了请问你要做什么呢解决方案三:看一下tlt文件.

jsp中使用javabean实例

  这篇文章主要介绍了jsp中使用javabean的实例,同时介绍了相关属性,需要的朋友可以参考下 test.jsp中的代码如下所示 代码如下: 消息: :表示定义一个java bean的实例,实例的名称是test,类的名称是SimleBean. :表示设置实例test的属性name,其值是"Hello JSP". :表示设置实例test的属性message,其值是"fuck JSP". :表示在页面中输出实例test的属性name的值. :示在页面中输出实例tes

在JSP中使用JavaMail邮件发送收取

js     你希望在jsp中建立一个邮件发送收取工具吗?下面将介绍的就是在jsp中建立一个邮件发送收取工具.在这篇文章中你可以了解到JavaMail API的一些要点以及如何在JSP中使用它.本文中还包括了在JSP中使用JavaMail的实例.JavaMail是JSP应用软件中相当强大的API. 阅读这篇文章需要对JSP.JavaBeans和JavaMail有一定的初步了解.当然,有关于JavaMail的知识你可以通过阅读这篇文章来获得.如果你对于以上三项一无所知,但你所使用的服务器支持JSP

Servlet及JSP中的多线程同步问题

js|servlet|多线程|问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题.然而,很多人编写Servlet/JSP程序时并没有注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题,对于这类随机性的问题调试难度也很大. 一.在Servlet/JSP中的几种变量类型 在

在JSP中使用JavaMail

js 你希望在jsp中建立一个邮件发送收取工具吗?下面将介绍的就是在jsp中建立一个邮件发送收取工具.在这篇文章中你可以了解到JavaMail API的一些要点以及如何在JSP中使用它.本文中还包括了在JSP中使用JavaMail的实例.JavaMail是JSP应用软件中相当强大的API. 阅读这篇文章需要对JSP.JavaBeans和JavaMail有一定的初步了解.当然,有关于JavaMail的知识你可以通过阅读这篇文章来获得.如果你对于以上三项一无所知,但你所使用的服务器支持JSP和Jav

JSP中使用JavaMail_JSP编程

你希望在jsp中建立一个邮件发送收取工具吗?下面将介绍的就是在jsp中建立一个邮件发送收取工具.在这篇文章中你可以了解到JavaMail API的一些要点以及如何在JSP中使用它.本文中还包括了在JSP中使用JavaMail的实例.JavaMail是JSP应用软件中相当强大的API. 阅读这篇文章需要对JSP.JavaBeans和JavaMail有一定的初步了解.当然,有关于JavaMail的知识你可以通过阅读这篇文章来获得.如果你对于以上三项一无所知,但你所使用的服务器支持JSP和JavaMa