Python의 Jenks Natural Breaks : 최적의 휴식 수를 찾는 방법은 무엇입니까?


17

Jenks Natural Breaks 알고리즘 의이 Python 구현 을 발견 했으며 Windows 7 컴퓨터에서 실행할 수 있습니다. 꽤 빠르며 지리 데이터의 크기를 고려하여 몇 시간 만에 중단 점을 찾습니다. 내 데이터에이 클러스터링 알고리즘을 사용하기 전에 (여기) 알고리즘을 사용하고있었습니다. KMeans와 관련된 문제는 최적의 K 값 매개 변수를 찾는 것이었지만 다른 K 값에 대한 알고리즘을 시작하고 (여기) 를 사용 하여 최상의 K를 찾는 것이 "해결되었습니다" .sklearn.clustering.KMeans sklearn.metrics.silhouette_score

내 질문은 : Natural Breaks 알고리즘에 5 클래스 (K가 될 것임)를 찾도록 지시하면 이것이 내 데이터와 가장 일치하는 클래스 수인지 어떻게 알 수 있습니까? 최고의 휴식 시간을 선택하고 있는지 확인하는 방법은 무엇입니까?

감사!


"최상의"의 의미를 객관적으로 결정할 수 있도록 클래스가 데이터와 "일치하는"의미를 설명 할 수 있습니까? (또는, 실제로, 당신은 어떻게 미스 매치를 어느 정도 정량화 할 것인가.)
whuber

Jenks와 함께 Silhouette을 사용하는 것은 kmeans와 함께 사용하는 것과 비슷해야합니다. 휴리스틱이므로 맹목적으로 신뢰해서는 안됩니다. IMHO 최고는 당신의 rrsults 를 시각화하는 것입니다.
종료 : 익명-무스

Whuber : Silhouette을 사용하는 가장 좋은 방법은 sklearn 사이트의 정의에 따라 인덱스가 1에 가까워지는 클래스 수를 의미합니다. scikit-learn.org/stable/modules/generated/… Anony-Mousse : 시각화 할 수 없습니다 20 개 이상의 변수를 사용하여지도를 준비하고 내 두뇌가 클래스 수를 망치지 않기를 기대합니다. "변수 X의 경우 Y 클래스를 사용하는 것이 가장 좋습니다"라는 색인을 사용해야합니다. 또한 분석을 여러 번 다시 실행해야하는데, 불행히도 viz 접근 방식이 느립니다 ...
iamgin

jenks에서 가져 오기 jenks : 다음 오류를 발생시킵니다. Traceback (가장 최근 호출) : <모듈>의 라인 1, "<stdin>"ImportError : 이름을 가져올 수 없습니다 jenks
user120982

답변:


19

Jenks Natural Breaks는 0 = 1 (0 = 맞춤 없음 및 1 = 완벽한 맞춤)의 값인 분산 적합도를 최적화하여 작동합니다. 클래스 수를 선택하는 데있어 핵심은 차이점 감지와 데이터 과적 합 간의 균형을 찾는 것입니다. 최적의 클래스 수를 결정하려면 원하는 임계 값 GVF 값을 사용하고이 값을 먼저 만족시키는 클래스 수를 사용하는 것이 좋습니다.

다음은 분류 할 값 배열과 선택한 클래스 수를 고려하여 분산 적합도를 계산하는 함수입니다.

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가 최소한 0.8이어야한다고 결정한 다음 GVF가 충족 될 때까지 클래스 수를 늘릴 수 있습니다.

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.