Алгоритм нахождения среднего по группе чисел - PullRequest
2 голосов
/ 03 апреля 2011

У меня есть довольно маленький список чисел (максимум несколько сотен), например, такой:

117 99 91 93 95 95 91 97 89 99 89 99 91 95 89 99 89 9989 95 95 95 89 948 189 99 89 189 189 95 186 95 93 189 95 189 89 193 189 93 91 193 89 193 185 95 89 194 185 99 89 189 95 189 189 95 89 189 189 95 189 95 89 193 101 180 189 9589 195 185 95 89 193 89 193 185 99 185 95 189 95 89 193 91 190 94 190 185 99 89 189 95 189 189 95 185 95 185 99 89 189 95 189 186 99 89 189 191 95 185 99 89 189 189 96 89 193189 95 185 95 89 193 95 189 185 95 93 189 189 95 186 97 185 95 189 95 185 99 185 95 185 99 185 95 190 95 185 95 95 189 185 95 189 2451

Если вы создаетеграфик с X = число и Y = количество раз, когда мы видим число, у нас будет что-то вроде этого: Distribution

Мне нужно знать среднее число каждой группы чисел.В этом примере есть 4 группы, и получающиеся числа равны 92, 187, 948 и 2451

Количество групп числа неизвестно.

Есть ли у васлюбая идея о том, как создать (простой, если возможно) алгоритм, извлекает эти результирующие числа (если возможно, в c или псевдокоде или на английском языке:)

Ответы [ 5 ]

4 голосов
/ 03 апреля 2011

То, что вы хотите сделать, называется кластеризацией. Если данные, которые вы показали, являются типичными, достаточно подходящего подхода, такого как сосед, присоединяющийся к . Итак, процедура такова:

1) Apply neighbor joining
2) Apply an (empirically identified) threshold to define the clusters
3) Calculate average of each cluster

Использование пакета, в котором уже есть алгоритмы кластеризации, такие как R, вероятно, будет самым простым способом, хотя объединение соседей не является особенно сложным алгоритмом.

0 голосов
/ 03 апреля 2011

В PHP вы можете сделать это так:

$array = array(//an array of numbers);

$average = array_sum($array) / count($array);

С несколькими группами чисел вы можете сделать что-то вроде:

$array = array(
               array(array of numbers, group1),
               array(array of numbers, group2),
               //etc.
              );

foreach($array as $numbers)
{
     $average[] = array_sum($numbers) / count($numbers);
}

Если вы не ищете медиану или режим.

Ах, теперь я вижу, что вы спрашиваете, вы не спрашиваете, как найти среднее, вы спрашиваете, как сгруппировать числа и найти среднее для каждой группы.

Давайте посмотрим, вам нужно найти режим, $counts = array_count_values($array)); array_keys(max($counts)); сделает это, а ключи в $counts будут значениями исходного массива, а значения в $counts - это количество раз, которое каждый номер появляется вверх. Затем вам нужно выяснить, где находятся большие пробелы в клавишах в $counts. Вы также можете array_unique() исходный массив массива и найти пробелы в значениях.

Жаль, что мой учитель статистики сделал немного больше, чем играл в покер с нами, или я мог бы, вероятно, найти точный статистический метод, чтобы определить, насколько большим должен быть диапазон, проверяемый для определения групп.

0 голосов
/ 03 апреля 2011

Вот способ:

  1. Решите, какой шириной будут ваши бункеры.Скажем, 10 (например, числа> -5 и <= 5 входят в корзину 0, цифры> 5 и <= 15 входят в корзину 1, ...). </li>
  2. Создайте список, содержащий списки с номеромв каждой корзинеЯ бы пошел с чем-то вроде map<unsigned int, vector<unsigned int> * > в C ++.
  3. Теперь перебираем числа, решаем, к какой корзине они принадлежат.Проверьте, есть ли уже вектор для этого бина на вашей карте, если нет, то создайте его.Добавьте число к вектору.
  4. После перебора всех чисел просто вычислите среднее значение для каждого вектора.
0 голосов
/ 03 апреля 2011

Итак, вы ищете «шипы» на графике.Я предполагаю, что вас интересует размер и положение каждой группы?

Вы можете использовать что-то вроде этого:

Sort the numbers
Loop:
  Take the highest number you have 
  Investigate more numbers until you find a number that is too small to belong to the group (maybe 5% smaller)
  Calculate the average of the selected numbers 
  Let the discarded number be the last number
End loop
0 голосов
/ 03 апреля 2011

Я думаю std::map<int,int> может легко решить эту проблему. ключ карты будет числом, а значение будет временем / частотой появления числа.

Таким образом, среднее значение можно вычислить как

int average = (m[key] * key) / count;

Где count - это общее число чисел, поэтому оно вычисляет среднее значение для каждой группы по всем числам, поскольку вы четко не упомянули, что вы подразумеваете под средним.Я также предполагаю, что каждое отдельное число формирует свою собственную группу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...