19 std::vector<std::pair<double, double>> setOfPoints;
22 int64_t cluster_id{0};
23 std::map<std::pair<double, double>, int64_t> points;
32 explicit DBSCAN(std::vector<std::pair<double, double>> setOfPoints,
double Eps,
33 int64_t MinPts) noexcept
34 : setOfPoints(setOfPoints), Eps(Eps), MinPts(MinPts) {
37 for (
size_t i = 0; i < setOfPoints.size(); ++i) {
38 if (points.find(setOfPoints[i]) == points.end()) {
39 if (
ExpandCluster(setOfPoints, setOfPoints[i], cluster_id, Eps, MinPts)) {
40 cluster_id =
nextId(cluster_id);
50 int64_t
nextId(int64_t cluster_id);
61 bool ExpandCluster(std::vector<std::pair<double, double>> setOfPoints,
62 std::pair<double, double> point, int64_t cluster_id,
double Eps,
72 std::vector<std::pair<double, double>>
73 get_query(std::vector<std::pair<double, double>> setOfPoints, std::pair<double, double> point,
82 double dist(std::pair<double, double> a, std::pair<double, double> b);
89 std::map<std::pair<double, double>, int64_t>
get_clusters();
96 std::vector<std::pair<double, double>>
get_noise();
113 std::pair<double, double> point, int64_t cluster_id,
double Eps,
115 std::vector<std::pair<double, double>> seeds =
get_query(setOfPoints, point, Eps);
116 if (seeds.size() < MinPts) {
123 for (
auto& x : seeds) {
124 points[x] = cluster_id;
126 for (
auto it = seeds.begin(); it != seeds.end(); it++) {
127 if ((*it).first == point.first && (*it).second == point.second) {
133 while (!seeds.empty()) {
134 auto current = seeds[0];
135 std::vector<std::pair<double, double>> result =
get_query(setOfPoints, current, Eps);
137 if (result.size() >= MinPts) {
138 for (
size_t i = 0; i < result.size(); i++) {
139 std::pair<double, double> result_p = result[i];
140 if (points.find(result_p) == points.end() || points[result_p] == -1) {
141 if (points.find(result_p) == points.end()) {
142 seeds.push_back(result_p);
144 points[result_p] = cluster_id;
148 for (
auto it = seeds.begin(); it != seeds.end(); it++) {
149 if ((*it).first == current.first && (*it).second == current.second) {
162 std::pair<double, double> point,
double Eps) {
163 std::vector<std::pair<double, double>> ans;
164 for (
size_t i = 0; i < setOfPoints.size(); i++) {
165 std::pair<double, double> curr = setOfPoints[i];
166 if (
dist(point, curr) <= Eps) {
178 std::map<std::pair<double, double>, int64_t> ans;
179 for (
size_t i = 0; i < setOfPoints.size(); i++) {
180 if (points[setOfPoints[i]] != -1) {
181 ans[setOfPoints[i]] = points[setOfPoints[i]];
188 std::vector<std::pair<double, double>> ans;
189 for (
size_t i = 0; i < setOfPoints.size(); i++) {
190 if (points[setOfPoints[i]] == -1) {
191 ans.push_back(setOfPoints[i]);
DBSCAN(std::vector< std::pair< double, double > > setOfPoints, double Eps, int64_t MinPts) noexcept
constructor for the DBSCAN class
Definition dbscan.h:32
bool ExpandCluster(std::vector< std::pair< double, double > > setOfPoints, std::pair< double, double > point, int64_t cluster_id, double Eps, int64_t MinPts)
ExpandCluster function.
Definition dbscan.h:112
std::vector< std::pair< double, double > > get_query(std::vector< std::pair< double, double > > setOfPoints, std::pair< double, double > point, double Eps)
get_query function
Definition dbscan.h:161