Як "розумно" скласти колекцію відсортованих даних?


11

Я намагаюся інтелектуально зібрати впорядковану колекцію. У мене є збірка з яти даних. Але я знаю, що ці дані вписуються в нерівномірних розмірів. Я не знаю, як розумно вибрати кінцеві точки, щоб правильно підходити до даних. наприклад:nm

Скажімо, у моїй колекції 12 предметів, і я знаю, що дані вмістяться в 3 контейнери:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

Як я розумно вибираю свої точки прориву для бункерів ?i={13},{49},{1012}

Поточна реалізація, яку я розбиває, розбиває дані на рівні розміри, а потім бере середнє значення кінцевих точок, щоб знайти індекси для кінця бін. Так воно працює так:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

first break evenly: i = 1-4, 5-8, 9-12
mean endpoints:  between 4 and 5: (3+3)/2 = 3
                 between 8 and 9: (3+3)/2 = 3

Отже, що-небудь нижче 3 вміщує в кошик 1, все вище 3, але нижче 3, у кошику 2, і все, що вище, ніж 3, у кошику 3. Ви можете бачити, у чому полягає моя проблема. Якщо в даних є нерівні бункери, мій метод виходить з ладу.

Друг згадав алгоритм k-найближчого сусіда, але я не впевнений.


1
Чи можете ви поясніть, що означає "розумно"? Що ви намагаєтеся досягти зі спільнотою? Чому ти першочерговий?
whuber

У другому до останнього абзацу ви маєте на увазі , та ? Інакше для мене це не має сенсу. 3 & < 4 b i n 2 4 b i n 3<3bin13&<4bin24bin3
gung - Відновіть Моніку

Я маю на увазі розумно, як не наївно, як я робив, вважаючи, що бункери були рівномірно розміщені. якщо фрагмент даних потрапляє у певну скриньку, яка повідомляє мені щось дуже важливе про цю частину даних. Я сортую дані, щоб визначити індекси розбиття бункера, а потім вирішую, який бін кожного фрагмента даних падає окремо.
Метью Кемнець

якщо я щось середнє не зробив, я думаю, що я маю це правильно. вибравши парні; y рознесені бункери всі мої кінцеві точки - 3. Тому я не можу правильно поширювати свої дані. Ось чому моя реалізація виходить з ладу без рівних; y пробілів.
Метью Кемнець

Ось щось я зробив у трохи іншій обстановці.
Макрос

Відповіді:


9

Я думаю, що те, що ти хочеш зробити, називається кластеризацією. Ви хочете згрупувати свої "Значення" таким чином, щоб схожі значення збиралися в одній скриньці, а кількість загальних бункерів було задано попередньо.

Вирішити цю проблему можна за допомогою алгоритму кластеризації k-означає . У MATLAB ви можете це зробити:

bin_ids = kmeans(Values,3); 

Наведений вище виклик згрупує значення у Valuesтри групи, щоб міжгрупова дисперсія була мінімальною.


1
Я це також дізнався. Це саме те, що я реалізував, і це спрацювало чудово. Я прийшов сюди, щоб відповісти на моє власне запитання, але ви побили мене на це! Я намагався зробити кластеризацію.
Метью Кемнець

8

k-засоби - це варіант, але він не дуже розумний для 1 розмірних даних. В одновимірних даних ви маєте одну величезну перевагу: дані можна повністю сортувати.

Перегляньте натомість оптимізацію природних перерв :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization


Це надзвичайно цікаво. Не могли б ви детальніше розібратися, чому це може бути краще, ніж k означає?
Матвій Кемнець

Основна причина, чому я прошу, полягає в тому, що я використовую MATLAB для свого алгоритму, і я не зміг знайти жодних оптимізацій перерв Jenks в будь-яких скриньках інструментів і т. Д., Тому мені потрібно буде реалізувати свою власну. Мені просто хотілося знати, наскільки краще / швидше це може бути, перш ніж переключити передачі та здійснити це.
Метью Кемнець

1
k-означає досить дурний. Він має засоби, і він завжди розщеплюється посередині двох засобів. Так, наприклад, 0 1 2 3 4 5 7 7 7, k-засоби вважають за краще розділити між 4 і 5. Іноді він навіть розділиться між 3 і 4.
Має QUIT - Anonymous-Mousse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.