Jenks Natural Breaks in Python: Bagaimana menemukan jumlah istirahat optimal?

17

Saya menemukan implementasi Python ini dari algoritma Jenks Natural Breaks dan saya bisa membuatnya berjalan di mesin Windows 7 saya. Ini cukup cepat dan menemukan jeda dalam beberapa waktu, mengingat ukuran geodata saya. Sebelum menggunakan algoritma pengelompokan ini untuk data saya, saya menggunakan algoritma sklearn.clustering.KMeans (di sini) . Masalah yang saya miliki dengan KMeans, adalah menemukan parameter nilai K optimal, tetapi saya "memecahkan" itu meluncurkan algoritma untuk nilai K yang berbeda dan menggunakan sklearn.metrics.silhouette_score (di sini) untuk menemukan K. terbaik

Pertanyaan saya adalah: jika saya memberi tahu algoritma Natural Breaks untuk menemukan 5 kelas (yang akan menjadi K), bagaimana saya bisa yakin bahwa ini adalah jumlah kelas yang paling cocok dengan data saya? Bagaimana cara memvalidasi bahwa saya memilih jumlah istirahat terbaik?

Terima kasih!

iamgin
sumber
Agar kita dapat secara objektif menentukan apa arti "terbaik", dapatkah Anda menjelaskan pengertian di mana kelas "cocok" dengan data? (Atau, sungguh, bagaimana Anda mengukur tingkat kecocokan yang salah.)
whuber
Menggunakan Silhouette dengan Jenks harus sebanding dengan menggunakannya dengan kmeans. Ini heuristik dan Anda tidak boleh mempercayai itu secara membabi buta. IMHO yang terbaik adalah memvisualisasikan hasil Anda.
Anony-Mousse -Reinstate Monica
Whuber: Terbaik, menggunakan Silhouette, berarti jumlah kelas yang membuat indeks lebih dekat ke 1, sesuai dengan definisi di situs sklearn : scikit-learn.org/stable/modules/generated/… Anony-Mousse: Saya tidak bisa memvisualisasikan 20+ variabel, siapkan peta untuk itu dan berharap otak saya tidak mengacaukan jumlah kelas. Saya perlu mengandalkan indeks yang mengatakan, "untuk variabel X, yang terbaik yang dapat Anda lakukan adalah menggunakan kelas Y". Selain itu saya perlu menjalankan kembali analisis beberapa kali, pendekatan yaitu lambat sayangnya ...
iamgin
dari jenks import jenks: memberikan kesalahan Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, dalam <module> ImportError: tidak dapat mengimpor nama jenks
user120982

Jawaban:

19

Jenks Natural Breaks bekerja dengan mengoptimalkan Goodness of Variance Fit, nilai dari 0 hingga 1 di mana 0 = Tidak Sesuai dan 1 = Sempurna. Kunci dalam memilih jumlah kelas adalah menemukan keseimbangan antara mendeteksi perbedaan dan melengkapi data Anda. Untuk menentukan jumlah kelas optimal, saya sarankan Anda menggunakan nilai ambang GVF yang Anda inginkan dan menggunakan jumlah kelas yang memenuhi nilai ini terlebih dahulu.

Di bawah ini adalah fungsi untuk menghitung Goodness of Variance Fit diberikan array nilai untuk mengklasifikasikan dan jumlah kelas yang dipilih:

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

Misalnya, anggap Anda memutuskan GVF setidaknya harus 0,8, maka Anda bisa menambah jumlah kelas sampai GVF puas:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
Camdenl
sumber