Природні перерви Дженкса в Python: Як знайти оптимальну кількість перерв?


17

Я знайшов цю реалізацію Python в Дженкс Natural Breaks алгоритму , і я міг би зробити його запустити на моєму комп'ютері Windows 7. Це досить швидко, і він знаходить перерви за кілька разів, враховуючи розмір моїх геоданих. Перш ніж використовувати цей алгоритм кластеризації для моїх даних, я використовував sklearn.clustering.KMeans (тут) алгоритм. Проблема, яка була у мене з KMeans, полягала в пошуку оптимального параметра K значення, але я "вирішив" його, запустивши алгоритм для різних значень K і використовуючи sklearn.metrics.silhouette_score (тут) для пошуку найкращого K.

Моє запитання: якщо я скажу алгоритму Natural Breaks, щоб знайти 5 класів (це був би K), як я можу бути впевнений, що це кількість класів, які найкраще відповідають моїм даним? Як перевірити, що я вибираю найкращу кількість перерв?

Спасибі!


Щоб ми могли об'єктивно визначити, що означає «найкраще», чи могли б ви пояснити сенс, у якому класи «відповідають» даним? (Або, справді, як ви могли б оцінити будь-який ступінь невідповідності.)
whuber

Використання Silhouette з Jenks має бути порівнянним із використанням його з kmeans. Це евристика, і не варто їй сліпо довіряти. ІМХО найкраще - це візуалізувати ваші результати.
Мав QUIT - Anonymous-Mousse

Whuber: Найкраще, використовуючи Silhouette, означало б кількість класів, які роблять індекс ближчим до 1, відповідно до визначення на сайті sklearn : scikit-learn.org/stable/modules/generated/… Anonymous -Mousse: Я не можу візуалізувати 20+ змінних, підготуйте карти для цього і очікуйте, що мій мозок не зіпсується з кількістю занять. Мені потрібно покластися на індекс, який говорить: "для змінної X найкраще, що ти можеш зробити, - це використовувати класи Y". Крім того, мені потрібно повторно запустити аналіз, на жаль, підхід, на жаль, повільний ...
iamgin

з імпорту jenks jenks: дає наступну помилку Traceback (останній дзвінок останній): Файл "<stdin>", рядок 1, у <module> ImportError: не можна імпортувати ім'я jenks
user120982

Відповіді:


19

Jenks Natural Breaks працює за рахунок оптимізації рівня Goodness of Variance Fit, значення від 0 до 1, де 0 = No Fit і 1 = Perfect Fit. Ключ у виборі кількості класів полягає у пошуку балансу між виявленням відмінностей та надмірним доповненням ваших даних. Щоб визначити оптимальну кількість класів, я пропоную вам використовувати порогове значення GVF та бажане спочатку скористатися кількістю класів, що задовольняє це значення.

Нижче наведено функцію обчислення Goodness of Variance Fit, задану масив значень для класифікації та кількість вибраних класів:

from jenks import jenks
import numpy as np
def goodness_of_variance_fit(array, classes):
    # get the break points
    classes = jenks(array, classes)

    # do the actual classification
    classified = np.array([classify(i, classes) for i in array])

    # max value of zones
    maxz = max(classified)

    # nested list of zone indices
    zone_indices = [[idx for idx, val in enumerate(classified) if zone + 1 == val] for zone in range(maxz)]

    # sum of squared deviations from array mean
    sdam = np.sum((array - array.mean()) ** 2)

    # sorted polygon stats
    array_sort = [np.array([array[index] for index in zone]) for zone in zone_indices]

    # sum of squared deviations of class means
    sdcm = sum([np.sum((classified - classified.mean()) ** 2) for classified in array_sort])

    # goodness of variance fit
    gvf = (sdam - sdcm) / sdam

    return gvf

def classify(value, breaks):
    for i in range(1, len(breaks)):
        if value < breaks[i]:
            return i
    return len(breaks) - 1

Наприклад, ви вважаєте, що ви вирішили, що GVF має бути принаймні .8, тоді ви можете збільшувати кількість класів, поки GVF не буде задоволений:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.