Skip to content

7. Cluster angles

Jonas Schaub edited this page Nov 13, 2025 · 1 revision

In ART-2a clustering, distances between clusters are measured by angular distances on the unit sphere. The Art2aResult instance can be queried for angles between cluster pairs.

// Prepare your data as a 2D float array
// Each row represents a data vector
float[][] dataMatrix = {
        {0.1f, 0.2f, 0.3f},
        {0.2f, 0.1f, 0.4f},
        {0.9f, 0.8f, 0.7f},
        {0.8f, 0.9f, 0.6f},
        {0.15f, 0.25f, 0.35f},
        {0.85f, 0.75f, 0.65f},
        {0.05f, 0.15f, 0.25f},
        {0.95f, 0.85f, 0.75f},
        {0.12f, 0.22f, 0.32f},
        {0.88f, 0.78f, 0.68f}
};

// Configure clustering parameters
//Maximum number of clusters in interval [2, number of data row vectors of getDataMatrix]
int maximumNumberOfClusters = 10;
//default value
int maximumNumberOfEpochs = 10;
//default value
float convergenceThreshold = 0.99f;
//default value
float learningParameter = 0.01f;
//default value
float offsetForContrastEnhancement = 1.0f;
//default value
long randomSeed = 1L;
//do not preprocess data because it is already in range [0,1]
boolean isDataPreprocessing = false;

// Validate data matrix (same length in all rows, no empty rows, etc.)
if (Utils.isDataMatrixValid(dataMatrix)) {
    // Create ART-2a kernel
    Art2aKernel art2aKernel = new Art2aKernel(
            dataMatrix,
            maximumNumberOfClusters,
            maximumNumberOfEpochs,
            convergenceThreshold,
            learningParameter,
            offsetForContrastEnhancement,
            randomSeed,
            isDataPreprocessing
    );

    Art2aResult result = art2aKernel.getClusterResult(0.9f, false);

    int numberOfClusters = result.getNumberOfDetectedClusters();

    // *Calculate angles between all cluster pairs*
    for (int i = 0; i < numberOfClusters; i++) {
        for (int j = i + 1; j < numberOfClusters; j++) {
            double angle = result.getAngleBetweenClusters(i, j);
            System.out.println("Angle between cluster " + i +
                    " and " + j + ": " + angle + " degrees");
        }
    }
}


Output:

Angle between cluster 0 and 1: 56.02370834350586 degrees
Angle between cluster 0 and 2: 43.01450729370117 degrees
Angle between cluster 0 and 3: 39.805564880371094 degrees
Angle between cluster 0 and 4: 90.0 degrees
Angle between cluster 1 and 2: 37.3764533996582 degrees
Angle between cluster 1 and 3: 35.176082611083984 degrees
Angle between cluster 1 and 4: 55.53557205200195 degrees
Angle between cluster 2 and 3: 55.8259391784668 degrees
Angle between cluster 2 and 4: 46.9854850769043 degrees
Angle between cluster 3 and 4: 90.0 degrees

Clone this wiki locally