Python中的Jenks自然断裂:如何找到最佳断裂数目?


17

我找到了Jenks Natural Breaks算法的这个Python实现,可以使其在Windows 7计算机上运行。考虑到我的地理数据的大小,它非常快并且可以在很短的时间内找到中断点。在将这种聚类算法用于数据之前,我使用的是(此处)算法。我使用KMeans遇到的问题是找到最佳K值参数,但是我“解决”了它,针对不同的K值启动了算法,并使用(此处)找到了最佳K。sklearn.clustering.KMeans sklearn.metrics.silhouette_score

我的问题是:如果我告诉Natural Breaks算法找到5个类(即K),那么如何确定这是最匹配我的数据的类数?如何验证我选择了最佳的休息时间?

谢谢!


为了客观地确定“最佳”的含义,您能解释一下类“匹配”数据的含义吗?(或者,实际上,您将如何量化任何程度的不匹配。)
糟糕

将剪影与Jenks一起使用应该等同于与kmeans一起使用。这是一种试探法,您不应盲目地相信它。恕我直言,最好的办法是可视化您的结果。
已退出–Anony-Mousse 2015年

Whuber:最好,使用Silhouette,根据sklearn网站上的定义:scikit-learn.org/stable/modules/generated/,使该索引接近1的类的数量 。Anony-Mousse:我无法想象20多个变量,为此准备地图,并期望我的大脑不会弄乱课程的数量。我需要依靠一个索引说:“对于变量X,您可以做的最好的就是使用Y类”。此外,我需要重新运行几次分析,不幸的是,这种方法很慢……
iamgin 2015年

从jenks导入jenks:给出以下错误回溯(最近一次调用):文件“ <stdin>”,在<module>中的第1行,I​​mportError:无法导入名称jenks
user120982

Answers:


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至少应为.8,然后可以增加类的数量,直到满足GVF:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.