DBSCAN是一種基於密度的聚類算法
首先定義一個Point類
<!
package com
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
this
}
public boolean isClassed() {
return isClassed;
}
public void setClassed(boolean isClassed) {
this
}
public int getX() {
return x;
}
public void setX(int x) {
this
}
public int getY() {
return y;
}
public void setY(int y) {
this
}
public Point(){
x=
y=
}
public Point(int x
this
this
}
public Point(String str){
String[] p=str
this
this
}
public String print(){
return
}
}
然後定義一個工具類
package com
import java
import java
import java
import java
public class Utility {
/**
* 測試兩個點之間的距離
* @param p 點
* @param q 點
* @return 返回兩個點之間的距離
*/
public static double getDistance(Point p
int dx=p
int dy=p
double distance=Math
return distance;
}
/**
* 檢查給定點是不是核心點
* @param lst 存放點的鏈表
* @param p 待測試的點
* @param e e半徑
* @param minp 密度阈值
* @return 暫時存放訪問過的點
*/
public static List<Point> isKeyPoint(List<Point> lst
int count=
List<Point> tmpLst=new ArrayList<Point>();
for(Iterator<Point> it=erator();it
Point q=it
if(getDistance(p
++count;
if(!ntains(q)){
tmpLst
}
}
}
if(count>=minp){
p
return tmpLst;
}
return null;
}
public static void setListClassed(List<Point> lst){
for(Iterator<Point> it=erator();it
Point p=it
if(!p
p
}
}
}
/**
* 如果b中含有a中包含的元素
* @param a
* @param b
* @return a
*/
public static boolean mergeList(List<Point> a
boolean merge=false;
for(int index=
if(ntains(b
merge=true;
break;
}
}
if(merge){
for(int index=
if(!ntains(b
a
}
}
}
return merge;
}
/**
* 返回文本中的點集合
* @return 返回文本中點的集合
* @throws IOException
*/
public static List<Point> getPointsList() throws IOException{
List<Point> lst=new ArrayList<Point>();
String txtPath=
BufferedReader br=new BufferedReader(new FileReader(txtPath));
String str=
while((str=br
lst
}
br
return lst;
}
}
最後在主程序中實現算法
package com
import java
import java
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=
private static int minp=
/**
* 提取文本中的的所有點並存儲在pointsList中
* @throws IOException
*/
private static void display(){
int index=
for(Iterator<List<Point>> it=erator();it
List<Point> lst=it
if(lst
continue;
}
System
for(Iterator<Point> it
Point p=it
System
}
index++;
}
}
//找出所有可以直達的聚類
private static void applyDbscan(){
try {
pointsList=Utility
for(Iterator<Point> it=erator();it
Point p=it
if(!p
List<Point> tmpLst=new ArrayList<Point>();
if((tmpLst=Utility
//為所有聚類完畢的點做標示
Utility
resultList
}
}
}
} catch (IOException e) {
// TODO Auto
e
}
}
//對所有可以直達的聚類進行合並
private static List<List<Point>> getResult(){
applyDbscan();//找到所有直達的聚類
int length=resultList
for(int i=
for(int j=i+
if(rgeList(resultList
resultList
}
}
}
return resultList;
}
/**
* 程序主函數
* @param args
*/
public static void main(String[] args) {
getResult();
display();
//System
}
}
下邊是一個小測試
最後算法的結果是
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
大家畫一下坐標就可以理解實驗的結論了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26957.html