Jenks Python Doğal Molalar: Optimum mola sayısı nasıl bulunur?


17

Bulduğum bu Python uygulaması arasında Jenks Doğal Sonları algoritma ve bunu benim Windows 7 makine üzerinde çalıştırmak yapabiliriz. Oldukça hızlı ve coğrafi verilerimin boyutunu göz önünde bulundurarak araları birkaç kez bulur. Verilerim için bu kümeleme algoritmasını kullanmadan önce sklearn.clustering.KMeans (burada) algoritma kullanıyordum. KMeans ile yaşadığım problem, optimum K değeri parametresini bulmaktı, ama farklı K değerleri için algoritmayı başlatıp sklearn.metrics.silhouette_score (burada) en iyi K'yi bulmak için "çözdüm" .

Benim sorum: Natural Breakks algoritmasına 5 sınıf bulmasını söylersem (bu K olur), bunun verilerimle en iyi eşleşen sınıf sayısı olduğundan nasıl emin olabilirim? En fazla sayıda mola verdiğimi nasıl doğrularım?

Teşekkürler!


Böylece "en iyi" nin ne anlama geldiğini objektif olarak belirleyebilmemiz için, sınıfların verileri "eşleştirme" anlamını açıklayabilir misiniz? (Veya, gerçekten, herhangi bir yanlış eşleşme derecesini nasıl
ölçersiniz

Silhouette'i Jenks ile kullanmak, kmeans ile kullanmakla karşılaştırılabilir olmalıdır. Bu bir sezgisel taramadır ve körü körüne güvenmemelisiniz. IMHO en iyisi rrsult'larınızı görselleştirmek .
ÇIKIŞ - Anony-Mousse

Whuber: En iyisi, Silhouette kullanarak, sklearn sitesindeki tanıma göre indeksi 1'e yakın yapan sınıfların sayısı anlamına gelir: scikit-learn.org/stable/modules/generated/… Anony-Mousse: Görselleştiremiyorum 20'den fazla değişken, bunun için haritalar hazırlayın ve beynimin sınıfların sayısını bozmamasını bekleyin. "Değişken X için yapabileceğiniz en iyi Y sınıfları kullanmaktır" yazan bir dizine güvenmek gerekiyor. Üstelik analizi birkaç kez yeniden çalıştırmam gerekiyor, viz yaklaşımı maalesef yavaş ...
iamgin

jenks'ten içe aktarma jenks: aşağıdaki hatayı veriyor Geri izleme (en son çağrı son): <module> ImportError dosyasında "<stdin>", satır 1, dosya adlarını içe aktaramıyor
user120982

Yanıtlar:


19

Jenks Natural Breakks, 0 = 1'den 0 = Fit Yok ve 1 = Perfect Fit olmak üzere Varyans Uyumunun İyiliğini optimize ederek çalışır. Sınıf sayısını seçmenin anahtarı, farkları tespit etmek ve verilerinize fazla sığmak arasında bir denge bulmaktır. Optimum sınıf sayısını belirlemek için, istediğiniz bir eşik GVF değeri kullanmanızı ve önce bu değeri karşılayan sınıf sayısını kullanmanızı öneririm.

Aşağıda, sınıflandırılacak bir dizi değer ve seçilen sınıfların sayısı göz önüne alındığında, Varyans Uyumunun İyiliğini hesaplayan bir işlev bulunmaktadır:

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

Örneğin, GVF'nin en az .8 olması gerektiğine karar verdiğinizi düşünün, ardından GVF tatmin olana kadar sınıf sayısını artırabilirsiniz:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.