/// <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); } } }
/// <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]); }
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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }