From 3151f7d0c643daf915426435504ba5b88c7d975d Mon Sep 17 00:00:00 2001 From: Matthew Powers Date: Fri, 24 Jan 2025 21:01:27 -0500 Subject: [PATCH] [DOCS] add sedona clustering algorithms page (#1772) * add sedona clustering algorithms page * lint images --- .../tutorial/concepts/dbscan-clustering.png | Bin 0 -> 53848 bytes .../concepts/dbscan-scatterplot-points.png | Bin 0 -> 10969 bytes .../concepts/clustering-algorithms.md | 133 ++++++++++++++++++ docs/tutorial/sql.md | 2 + mkdocs.yml | 2 + 5 files changed, 137 insertions(+) create mode 100644 docs/image/tutorial/concepts/dbscan-clustering.png create mode 100644 docs/image/tutorial/concepts/dbscan-scatterplot-points.png create mode 100644 docs/tutorial/concepts/clustering-algorithms.md diff --git a/docs/image/tutorial/concepts/dbscan-clustering.png b/docs/image/tutorial/concepts/dbscan-clustering.png new file mode 100644 index 0000000000000000000000000000000000000000..8a839ddc01c6d62497b4adf3329d58f4c8004d5f GIT binary patch literal 53848 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 Ll_W|bhW`H-J2Kju literal 0 HcmV?d00001 diff --git a/docs/image/tutorial/concepts/dbscan-scatterplot-points.png b/docs/image/tutorial/concepts/dbscan-scatterplot-points.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d45f90f4a22aecaf15a96df6f30ff2755ff23e GIT binary patch literal 10969 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 QxgC-Js3Ki0Y5Mj5064IkJOBUy literal 0 HcmV?d00001 diff --git a/docs/tutorial/concepts/clustering-algorithms.md b/docs/tutorial/concepts/clustering-algorithms.md new file mode 100644 index 0000000000..830b0667ee --- /dev/null +++ b/docs/tutorial/concepts/clustering-algorithms.md @@ -0,0 +1,133 @@ + + +# Apache Sedona Clustering Algorithms + +Clustering algorithms group similar data points into “clusters.” Apache Sedona can run clustering algorithms on large geometric datasets. + +Note that the term cluster is overloaded here: + +* A computation cluster is a network of computers that work together to execute the algorithm +* A clustering algorithm divides data points into different “clusters” + +This page uses “cluster” to refer to the output of a clustering algorithm. + +## Clustering with DBSCAN + +This page explains how to use Apache Sedona to perform density-based spatial clustering of applications with noise (“DBSCAN”). + +This algorithm groups geometric objects in high-density areas as clusters and marks points in low-density areas as outliers. + +Let’s look at a scatter plot of points to visualize a data set that can be clustered. + +![scatter plot of points](../../image/tutorial/concepts/dbscan-scatterplot-points.png) + +Here’s how the DBSCAN algorithm clusters the points: + +![scatter point with cluster groupings](../../image/tutorial/concepts/dbscan-clustering.png) + +* 5 points are in cluster 0 +* 4 points are in cluster 1 +* 4 points are outliers + +Let’s create a Spark DataFrame with this data and then run the clustering with Sedona. Here’s how to construct the DataFrame: + +```python +df = ( + sedona.createDataFrame([ + (1, 8.0, 2.0), + (2, 2.6, 4.0), + (3, 2.5, 4.0), + (4, 8.5, 2.5), + (5, 2.8, 4.3), + (6, 12.8, 4.5), + (7, 2.5, 4.2), + (8, 8.2, 2.5), + (9, 8.0, 3.0), + (10, 1.0, 5.0), + (11, 8.0, 2.5), + (12, 5.0, 6.0), + (13, 4.0, 3.0), + ], ["id", "x", "y"]) +).withColumn("point", ST_Point(col("x"), col("y"))) +``` + +Here are the contents of the DataFrame: + +``` ++---+----+---+----------------+ +| id| x| y| point| ++---+----+---+----------------+ +| 1| 8.0|2.0| POINT (8 2)| +| 2| 2.6|4.0| POINT (2.6 4)| +| 3| 2.5|4.0| POINT (2.5 4)| +| 4| 8.5|2.5| POINT (8.5 2.5)| +| 5| 2.8|4.3| POINT (2.8 4.3)| +| 6|12.8|4.5|POINT (12.8 4.5)| +| 7| 2.5|4.2| POINT (2.5 4.2)| +| 8| 8.2|2.5| POINT (8.2 2.5)| +| 9| 8.0|3.0| POINT (8 3)| +| 10| 1.0|5.0| POINT (1 5)| +| 11| 8.0|2.5| POINT (8 2.5)| +| 12| 5.0|6.0| POINT (5 6)| +| 13| 4.0|3.0| POINT (4 3)| ++---+----+---+----------------+ +``` + +Here’s how to run the DBSCAN algorithm: + +```python +from sedona.stats.clustering.dbscan import dbscan + +dbscan(df, 1.0, 3).orderBy("id").show() +``` + +Here are the results of the computation: + +``` ++---+----+---+----------------+------+-------+ +| id| x| y| point|isCore|cluster| ++---+----+---+----------------+------+-------+ +| 1| 8.0|2.0| POINT (8 2)| true| 0| +| 2| 2.6|4.0| POINT (2.6 4)| true| 1| +| 3| 2.5|4.0| POINT (2.5 4)| true| 1| +| 4| 8.5|2.5| POINT (8.5 2.5)| true| 0| +| 5| 2.8|4.3| POINT (2.8 4.3)| true| 1| +| 6|12.8|4.5|POINT (12.8 4.5)| false| -1| +| 7| 2.5|4.2| POINT (2.5 4.2)| true| 1| +| 8| 8.2|2.5| POINT (8.2 2.5)| true| 0| +| 9| 8.0|3.0| POINT (8 3)| true| 0| +| 10| 1.0|5.0| POINT (1 5)| false| -1| +| 11| 8.0|2.5| POINT (8 2.5)| true| 0| +| 12| 5.0|6.0| POINT (5 6)| false| -1| +| 13| 4.0|3.0| POINT (4 3)| false| -1| ++---+----+---+----------------+------+-------+ +``` + +You can see the `cluster` column that indicates the grouping of the geometric object. + +To run this operation, you must set the Spark checkpoint directory. The checkpoint directory is a temporary cache in durable storage where the query's intermediate results are written. + +Here is how you can set the checkpoint directory: + +```python +sedona.sparkContext.setCheckpointDir(myPath) +``` + +`myPath` needs to be accessible to all executors. A local path is a good option on a local machine. When available, the HDFS is likely the best choice. Some runtime environments may allow or require block storage paths (e.g., Amazon S3, Google Cloud Storage). Depending on your environment, some runtime environments may already set the Spark checkpoint directory, so this step may not be necessary. diff --git a/docs/tutorial/sql.md b/docs/tutorial/sql.md index 721be3e8ca..35730e8c98 100644 --- a/docs/tutorial/sql.md +++ b/docs/tutorial/sql.md @@ -904,6 +904,8 @@ The output will look like this: +----------------+---+------+-------+ ``` +See [this page](../concepts/clustering-algorithms) for more information on the DBSCAN algorithm. + ## Calculate the Local Outlier Factor (LOF) Sedona provides an implementation of the [Local Outlier Factor](https://en.wikipedia.org/wiki/Local_outlier_factor) algorithm to identify anomalous data. diff --git a/mkdocs.yml b/mkdocs.yml index 1a95eff243..876db88464 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,8 @@ nav: - Examples: - Scala/Java: tutorial/demo.md - Python: tutorial/jupyter-notebook.md + - Concepts: + - Clustering Algorithms: tutorial/concepts/clustering-algorithms.md - API Docs: - Sedona with Apache Spark: - SQL: