示例#1
0
        public double CalculateDistance(IDistribution <T> obj1, IDistribution <T> obj2)
        {
            Func <Dictionary <T, int>, T, int, int> getRankOrDefault =
                (rankedDistribution, event_, defaultRank) =>
            {
                int rank;
                if (rankedDistribution.TryGetValue(event_, out rank) == false)
                {
                    rank = defaultRank;
                }
                return(rank);
            };
            var rankedDistribution1 = obj1.OrderByDescending <KeyValuePair <T, long>, long>(e => e.Value).Select((e, i) => new { event_ = e.Key, rank = i + 1 }).ToDictionary(p => p.event_, p => p.rank);
            var rankedDistribution2 = obj2.OrderByDescending <KeyValuePair <T, long>, long>(e => e.Value).Select((e, i) => new { event_ = e.Key, rank = i + 1 }).ToDictionary(p => p.event_, p => p.rank);
            // todo: 400 is hardcoded!
            int distance =
                obj1.DistinctRepresentedEvents
                .Union(obj2.DistinctRepresentedEvents)
                .Select(
                    e =>
                    Math.Abs(getRankOrDefault(rankedDistribution1, e, 400) -
                             getRankOrDefault(rankedDistribution2, e, 400)))
                .Sum();

            return(distance);
        }
示例#2
0
        private static IDictionary <T, int> GetRankedLanguageModel(IDistribution <T> languageModel)
        {
            Dictionary <T, int> rankedLanguageModel = languageModel.OrderByDescending <KeyValuePair <T, long>, long>(e => e.Value).Select((e, i) => new { event_ = e.Key, rank = i + 1 }).ToDictionary(p => p.event_, p => p.rank);

            return(rankedLanguageModel);
        }