最近总结了一下聚类算法,顺手实现了一下dbscan
DBScan 的思想
给定半径r 和密度阈值 minPoints ,如果以某个点为中心,半径为r
画圈,若圈内点大于密度阈值,则该点就是核心点,核心点和圈内点
形成一个微簇,迭代选择未访问过的点进行画圈,并且与已有的微簇进
行合并,直到所有的点都被访问过。
package com.yc;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
public class DBSCAN {
private static final String fileName = "points.txt";
private static final String resultFileName = "result.txt";
private static final double r = 0.05; // 半径
private static final int minPoints = 5;// 密度阈值
private static List<List<Point>> microCluster = new CopyOnWriteArrayList<>();
static class Point {
private int id; // 点的序列号
private List<Double> location;// 点的坐标
private int flag; // 0表示未处理,1表示处理了
Point(int id, List<Double> location, int flag) {
this.id = id;