Cluster.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.apache.commons.math4.legacy.ml.clustering;

  18. import java.util.ArrayList;
  19. import java.util.List;

  20. /**
  21.  * Cluster holding a set of {@link Clusterable} points.
  22.  * @param <T> the type of points that can be clustered
  23.  * @since 3.2
  24.  */
  25. public class Cluster<T extends Clusterable> {

  26.     /** The points contained in this cluster. */
  27.     private final List<T> points;

  28.     /**
  29.      * Build a cluster centered at a specified point.
  30.      */
  31.     public Cluster() {
  32.         points = new ArrayList<>();
  33.     }

  34.     /**
  35.      * Add a point to this cluster.
  36.      * @param point point to add
  37.      */
  38.     public void addPoint(final T point) {
  39.         points.add(point);
  40.     }

  41.     /**
  42.      * Get the points contained in the cluster.
  43.      * @return points contained in the cluster
  44.      */
  45.     public List<T> getPoints() {
  46.         return points;
  47.     }

  48.     /**
  49.      * Computes the centroid of the cluster.
  50.      *
  51.      * @return the centroid for the cluster, or {@code null} if the
  52.      * cluster does not contain any points.
  53.      */
  54.     public Clusterable centroid() {
  55.         if (points.isEmpty()) {
  56.             return null;
  57.         } else {
  58.             final int dimension = points.get(0).getPoint().length;
  59.             final double[] centroid = new double[dimension];
  60.             for (final T p : points) {
  61.                 final double[] point = p.getPoint();
  62.                 for (int i = 0; i < centroid.length; i++) {
  63.                     centroid[i] += point[i];
  64.                 }
  65.             }
  66.             for (int i = 0; i < centroid.length; i++) {
  67.                 centroid[i] /= points.size();
  68.             }
  69.             return new DoublePoint(centroid);
  70.         }
  71.     }
  72. }