@alexdora
Топ-менеджер

Как классифицировать числовой ряд?

Дано:
1. Ряд целых положительных чисел
2. Количество чисел неопределенно
3. Числа могут в ряду повторяться

Задача разбить числа на 3 группы. Примером проще:
1,2,7,8,30,100,500,667,900,3,4
Итого:
[1,2,3,4,7,8,30,100] [500,667] [900]

Вообщем-то задача предполагает разбить числа на три группы: маленькие, средние и большие.

Самое важно что в конкретном примере глазами, да и формулой от максимума в целом не сложно найти.
Но когда ряды идут а-ля: [1 1 1 1 1 2 2 2 2 3 5 10 20 20 25 35 45 96 97 97 98 99 100 100 101 102 103 999 1000 1001 9000 9500] что-то простые способы оказались бестолковые.

Очень долго копался в этой теме (хотя вышку знаю очень плохо ч.к совсем не знаю). Мне тут chatGPT предложил следующие варианты решения проблемы, кроме 7,8 он писал код. Я его правил в рамках своих возможностей, но так и не добился положительных результатов.

1. Логистическая регрессия.
2. Линейные модели.
3. Решающие деревья.
4. Метод ближайших соседей.
5. Наивный байесовский классификатор.
6. Метод опорных векторов.
7. Бустинг.
8. Нейронные сети.
9. Алгоритм K-средних.
10. Алгоритм адаптивного бустинга.

PS: Указал языки программирования т.к мне нужно сделать функцию, подойдет любой язык. Буду рад если хотя бы укажите направление. Заранее благодарю.
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Это называется кластеризация. Вам надо разбить данные на 3 кластера. Метод ближайших соседей, упомянутый выше, подходит.

Все-таки все эти методы кластеризации разработаны для более общего случая. А у вас тут данные одномерные и численные уже - так что все совсем просто.

Во-первых, данные надо отсортировать, если уже не. А дальше у вас тут 2 переменные - (i,j) - первый и последний элемент в средней группе.i>0,j<n-1.

Можно эти индексы тупо перебрать двумя вложенными циклами. А дальше надо считать какую-то целевую функцию - насколько хорошо кластеры выбраны и брать лучшее значение. Надо, чтобы внутри различие было поменьше, а между кластерами - побольше. Можно брать максимум разности в каждом кластере и делить на разницу между двума кластерами. Вот минимизируйте эту функцию.

Но вообще можно, наверно, просто взять 2 максимальных промежутка между соседними числами и по ним разделить. В примере выше этот метод отлично разбивает на 3 группы: 1-103, 999-1001, 9000-9500

Если разность между маленькими числами важнее разности между большими, то возьмите сначала логарифм от всех чисел и уже это разбивайте на группы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы