예제 #1
0
        private List <ClusterDistanceModel> CalculateDistances(double[,] centroids)
        {
            List <ClusterDistanceModel> result = new List <ClusterDistanceModel>();

            foreach (TransactionMatrixModel personId in TransactionMatrix)
            {
                ClusterDistanceModel model = new ClusterDistanceModel
                {
                    PersonId         = personId.PersonId,
                    ClusterDistances = new Dictionary <int, double>()
                };

                for (int i = 0; i < NumberOfClusters; i++)
                {
                    double distance = 0;

                    for (int j = 0; j < NumberOfVectors; j++)
                    {
                        if (personId.Values[j] == 0 && i == j)
                        {
                            continue;
                        }

                        distance += EuclideanDistance(personId.Values[j], centroids[i, j]);
                        /*Math.Pow(personId.Values[j] - centroids[i, j], 2);*/
                    }

                    distance = Math.Sqrt(distance);
                    model.ClusterDistances.Add(i, distance);
                }

                model.CurrentCluster = SelectCluster(model);
                result.Add(model);
            }

            return(result);
        }
예제 #2
0
 private int SelectCluster(ClusterDistanceModel model)
 {
     return(model.ClusterDistances.Where(
                m => m.Value.Equals(model.ClusterDistances.Min(n => n.Value)))
            .Select(m => m.Key).First());
 }