BigML.Utils.mergeBins C# (CSharp) Method

mergeBins() public static method

Merges the bins of a regression distribution to the given limit number
public static mergeBins ( JsonArray distribution, int limit ) : JsonArray
distribution JsonArray
limit int
return JsonArray
        public static JsonArray mergeBins(JsonArray distribution, int limit)
        {
            int length = distribution.Count;
            if (limit < 1 || length <= limit || length < 2)
            {
                return distribution;
            }

            int indexToMerge = 2;
            double shortest = double.MaxValue;
            for (int index = 1; index < length; index++)
            {
                double distance = ((double)((JsonArray)distribution[index]) [0]) - ((double)((JsonArray) distribution[index - 1])[0]);

                if (distance < shortest)
                {
                    shortest = distance;
                    indexToMerge = index;
                }
            }

            JsonArray newDistribution = new JsonArray();
            for (int index = 0; index < indexToMerge - 1; index++)
            {
                newDistribution.Add(distribution[index]);
            }
            //newDistribution.addAll(distribution.subList(0, indexToMerge - 1));

            JsonArray left = (JsonArray)distribution[indexToMerge - 1];

            JsonArray right = (JsonArray)distribution[indexToMerge];

            JsonArray newBin = new JsonArray();
            newBin.Add((JsonValue) (((((double)left[0]) * ((double)left[1])) + (((double)right[0]) * ((double)right[1]))) / (((double)left[1]) + ((double)right[1])))); //  position 0
            newBin.Add((JsonValue) ((double) left[1] + ((double)right[1] ))); // position  1

            newDistribution.Add(newBin);

            if (indexToMerge < (length - 1))
            {
                for (int index = indexToMerge + 1; index < distribution.Count; index++)
                {
                    newDistribution.Add(distribution[index]);
                }
                //newDistribution.addAll(distribution.subList(indexToMerge + 1, distribution.Count));
            }

            return mergeBins(newDistribution, limit);
        }

Same methods

Utils::mergeBins ( double>.IDictionary distribution, int limit ) : double>.Dictionary

Usage Example

Beispiel #1
0
        /// <summary>
        /// Returns a distribution formed by grouping the distributions of each predicted node.
        /// </summary>
        protected internal Dictionary <string, object> getGroupedDistribution(MultiVote multiVoteInstance)
        {
            Dictionary <object, double> joinedDist = new Dictionary <object, double>();
            string distributionUnit = "counts";
            Dictionary <object, double> predictionDist;
            object distribution;

            foreach (Dictionary <object, object> prediction in multiVoteInstance.Predictions)
            {
                // Equivalent to:
                //  JSONArray predictionDist = (JSONArray) prediction.get("distribution");
                predictionDist = null;
                distribution   = prediction["distribution"];

                if (distribution is IDictionary)
                {
                    predictionDist = (Dictionary <object, double>)distribution;
                }
                else if ((distribution == null) || (!(distribution is JsonArray)))
                {
                    predictionDist = new Dictionary <object, double>();
                }
                else
                {
                    predictionDist = Utils.convertDistributionArrayToMap((JsonArray)distribution);
                }

                // Equivalent to:
                //  joinedDist = Utils.mergeDistributions(joinedDist, Utils.convertDistributionArrayToMap(predictionDist));
                joinedDist = Utils.mergeDistributions(joinedDist, predictionDist);

                if ("counts".Equals(distributionUnit) && joinedDist.Count > BINS_LIMIT)
                {
                    distributionUnit = "bins";
                }

                joinedDist = Utils.mergeBins(joinedDist, BINS_LIMIT);
            }

            Dictionary <string, object> distributionInfo = new Dictionary <string, object>();

            distributionInfo["distribution"]     = Utils.convertDistributionMapToSortedArray(joinedDist);
            distributionInfo["distributionUnit"] = distributionUnit;

            return(distributionInfo);
        }