Расчет среднего значения без учета экстремум

Tvister

Client
Регистрация
09.09.2010
Сообщения
258
Благодарностей
34
Баллы
28
Суть: есть ряд чисел примерно в одном диапазоне, но в этот ряд попадают значения значительно большие или меньшие остальных.

Вопрос - Как сделать так чтобы эти значения из расчета исключались?

Пример

500​
999​
1000​
1300​
1500​
4000​

Нужно посчитать среднее исключив 4000
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 536
Благодарностей
3 377
Баллы
113
Поищите готовые библиотеки, либо реализуйте самостоятельно формулу для данной задачи.
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 356
Благодарностей
725
Баллы
113
На входе туда передал: 100,500,999,1000,1300,1500,4000

В результате получил:
Отфильтрованные числа: 500, 999, 1000, 1300, 1500
Среднее значение: 1059,8




C#:
        List<int> numbers = new List<int>();
        foreach(var item in project.Lists["Ints"]) //Название списка с циферками
        {
            numbers.Add(Convert.ToInt32(item));
        }
        double threshold = 0.5; //коэффициент с которым можно поиграться для определения границ
        if (numbers.Count == 0)
            return 0;


        numbers.Sort();


        int size = numbers.Count;
        double median = size % 2 == 0
            ? (numbers[size / 2 - 1] + numbers[size / 2]) / 2.0
            : numbers[size / 2];


        double sumOfSquares = numbers.Sum(n => Math.Pow(n - median, 2));
        double variance = sumOfSquares / numbers.Count;
        double standardDeviation = Math.Sqrt(variance);


        double lowerBound = median - threshold * standardDeviation;
        double upperBound = median + threshold * standardDeviation;


        List<int> filteredNumbers = numbers
            .Where(n => n >= lowerBound && n <= upperBound)
            .ToList();


        project.SendInfoToLog("Отфильтрованные числа: " + string.Join(", ", filteredNumbers));


        double average = filteredNumbers.Average();
        project.SendInfoToLog("Среднее значение: " + average.ToString());
 
  • Спасибо
Реакции: Tvister

baracuda

Client
Регистрация
19.06.2013
Сообщения
832
Благодарностей
293
Баллы
63
Использование диапазона
или
Использование кластеризации такие как K-means или DBSCAN
или
Использование Z-оценки
или
Использование медианного отклонения
Выбирай любой метод. ИИ в помощь
 
  • Спасибо
Реакции: Tvister

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)