/// <summary>
        ///     Creates a new <see cref="CachedDissimilarityMetric{TInstance}" /> according to the given base dissimilarity metric
        ///     and the known set of instances.
        /// </summary>
        /// <param name="dissimilarityMeasure">The metric to be used to cache the dissimilarities between all instances.</param>
        /// <param name="allInstances">The set of instances for which to calculate the pair-wise dissimilarities.</param>
        public CachedDissimilarityMetric(
            IDissimilarityMetric <TInstance> dissimilarityMeasure, ISet <TInstance> allInstances)
        {
            this._dissimilarityMeasure = dissimilarityMeasure;

            // registers instances' indexes
            var instances = allInstances.ToArray();

            for (var i = 0; i < instances.Length; i++)
            {
                this._elementIdxs.Add(instances[i], i);
            }

            // initializes cache with distances between all instances
            this._dissimilarities = new double[instances.Length][];
            for (var i = 0; i < allInstances.Count; i++)
            {
                for (var j = i; j < allInstances.Count; j++)
                {
                    if (i == 0)
                    {
                        this._dissimilarities[j] = new double[instances.Length];
                    }
                    this.Store(i, j, instances);
                }
            }
        }
Example #2
0
        /// <summary>
        ///     Returns the medoid of a given <see cref="Cluster{TInstance}" />, i.e., a representative object whose dissimilarity
        ///     to all the instances in the cluster is minimal.
        /// </summary>
        /// <remarks>
        ///     "Medoids are representative objects of a data set or a cluster with a data set whose average dissimilarity to all
        ///     the objects in the cluster is minimal. Medoids are similar in concept to means or centroids, but medoids are
        ///     always restricted to be members of the data set. Medoids are most commonly used on data when a mean or centroid
        ///     cannot be defined, such as graphs. They are also used in contexts where the centroid is not representative of the
        ///     dataset like in images and 3-D trajectories and gene expression (where while the data is sparse the medoid need
        ///     not be). These are also of interest while wanting to find a representative using some distance other than squared
        ///     euclidean distance (for instance in movie-ratings)."
        ///     <see href="https://en.wikipedia.org/wiki/Medoid" />
        /// </remarks>
        /// <param name="cluster">The cluster whose medoid we want to retrieve.</param>
        /// <param name="metric">
        ///     The dissimilarity metric used to compare elements in the cluster, i.e., to calculate the distance between them.
        /// </param>
        /// <returns>The medoid of the given cluster. If the cluster has two elements, it returns the first element of the cluster.</returns>
        /// <typeparam name="TInstance">The type of instance considered.</typeparam>
        public static TInstance GetMedoid <TInstance>(
            this Cluster <TInstance> cluster, IDissimilarityMetric <TInstance> metric)
            where TInstance : IComparable <TInstance>
        {
            // if count is 1 or 2 return the first elem
            if (cluster.Count < 3)
            {
                return(cluster.First());
            }

            // stores sum of all distances to each point
            var sumDists    = new double[cluster.Count];
            var clusterList = cluster.ToList();

            for (var i = 0; i < clusterList.Count; i++)
            {
                for (var j = i + 1; j < clusterList.Count; j++)
                {
                    var dist = metric.Calculate(clusterList[i], clusterList[j]);
                    sumDists[i] += dist;
                    sumDists[j] += dist;
                }
            }

            // selects elem index minimizing the mean distance (the medoid)
            var minSumDist = double.MaxValue;
            var minSumIdx  = -1;

            for (var i = 0; i < clusterList.Count; i++)
            {
                if (sumDists[i] < minSumDist)
                {
                    minSumDist = sumDists[i];
                    minSumIdx  = i;
                }
            }

            return(clusterList[minSumIdx]);
        }
Example #3
0
        private void LoadDataSet()
        {
            // loads data-points
            var parser = new CsvParser();

            this._dataPoints = parser.Load(Path.GetFullPath(this.openFileDialog.FileName));

            // clears series
            this._chartDataPoints.Clear();
            this.ChartPoints.Clear();

            // adds points to series
            var maxX = double.MinValue;
            var minX = double.MaxValue;

            foreach (var dataPoint in this._dataPoints)
            {
                var chartDataPoint = new ChartDataPoint(dataPoint.Value[0], dataPoint.Value[1])
                {
                    Label = dataPoint.ID
                };
                this.ChartPoints.Add(chartDataPoint);
                this._chartDataPoints.Add(dataPoint, chartDataPoint);
                maxX = Math.Max(maxX, dataPoint.Value[0]);
                minX = Math.Min(minX, dataPoint.Value[0]);
            }

            // resets
            this._numClusters         = int.MinValue;
            this._clusteringResult    = null;
            this._dissimilarityMetric = new CachedDissimilarityMetric <DataPoint>(new DataPoint(), this._dataPoints);

            // adjusts track-bar according to num clusters
            this.numClustersTrackBar.SmallChange = (uint)(this.numClustersTrackBar.Maximum / this._dataPoints.Count);
            this.numClustersTrackBar.LargeChange = this.numClustersTrackBar.SmallChange * 5;

            this.datasetChart.ChartAreas[0].AxisX.Maximum = Math.Ceiling(maxX);
            this.datasetChart.ChartAreas[0].AxisX.Minimum = Math.Floor(minX);
        }
 /// <summary>
 ///     Creates a new <see cref="ModifiedGammaStatistic{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public ModifiedGammaStatistic(
     IDissimilarityMetric <TInstance> dissimilarityMetric, CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="RSquared{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public RSquared(IDissimilarityMetric <TInstance> dissimilarityMetric,
                 CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="DaviesBouldinIndex{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public DaviesBouldinIndex(
     IDissimilarityMetric <TInstance> dissimilarityMetric, CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="WithinBetweenRatio{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public WithinBetweenRatio(IDissimilarityMetric <TInstance> dissimilarityMetric,
                           CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
Example #8
0
 /// <summary>
 ///     Creates a new <see cref="RootMeanSquareStdDev{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public RootMeanSquareStdDev(
     IDissimilarityMetric <TInstance> dissimilarityMetric, CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="CentroidLinkage{TInstance}" /> with given dissimilarity metric and centroid
 ///     function.
 /// </summary>
 /// <param name="metric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public CentroidLinkage(
     IDissimilarityMetric <TInstance> metric, Func <Cluster <TInstance>, TInstance> centroidFunc)
 {
     this.DissimilarityMetric = metric;
     this._centroidFunc       = centroidFunc;
 }
Example #10
0
 /// <summary>
 ///     Creates a new <see cref="AverageLinkage{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="metric">The metric used to calculate dissimilarity between cluster elements.</param>
 public AverageLinkage(IDissimilarityMetric <TInstance> metric)
 {
     this.DissimilarityMetric = metric;
 }
 /// <summary>
 ///     Creates a new <see cref="CompleteLinkage{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="metric">The metric used to calculate dissimilarity between cluster elements.</param>
 public CompleteLinkage(IDissimilarityMetric <TInstance> metric)
 {
     this.DissimilarityMetric = metric;
 }
Example #12
0
 /// <summary>
 ///     Creates a new <see cref="DunnIndex{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 public DunnIndex(IDissimilarityMetric <TInstance> dissimilarityMetric)
 {
     this.DissimilarityMetric = dissimilarityMetric;
 }
Example #13
0
 /// <summary>
 ///     Creates a new <see cref="SilhouetteCoefficient{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 public SilhouetteCoefficient(IDissimilarityMetric <TInstance> dissimilarityMetric)
 {
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="DaviesBouldinIndex{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public CalinskiHarabaszIndex(
     IDissimilarityMetric <TInstance> dissimilarityMetric, CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
 /// <summary>
 ///     Creates a new <see cref="MinimumEnergyLinkage{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="metric">The metric used to calculate dissimilarity between cluster elements.</param>
 public MinimumEnergyLinkage(IDissimilarityMetric <TInstance> metric)
 {
     this.DissimilarityMetric = metric;
 }
Example #16
0
 /// <summary>
 ///     Creates a new <see cref="XieBeniIndex{TInstance}" /> with given dissimilarity metric.
 /// </summary>
 /// <param name="dissimilarityMetric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public XieBeniIndex(
     IDissimilarityMetric <TInstance> dissimilarityMetric, CentroidFunction <TInstance> centroidFunc)
 {
     this._centroidFunc       = centroidFunc;
     this.DissimilarityMetric = dissimilarityMetric;
 }
Example #17
0
 /// <summary>
 ///     Creates a new <see cref="WardsMinimumVarianceLinkage{TInstance}" /> with given dissimilarity metric and centroid
 ///     function.
 /// </summary>
 /// <param name="metric">The metric used to calculate dissimilarity between cluster elements.</param>
 /// <param name="centroidFunc">
 ///     A function to get an element representing the centroid of a <see cref="Cluster{TInstance}" />.
 /// </param>
 public WardsMinimumVarianceLinkage(
     IDissimilarityMetric <TInstance> metric, CentroidFunction <TInstance> centroidFunc)
 {
     this.DissimilarityMetric = metric;
     this._centroidFunc       = centroidFunc;
 }