代码之家  ›  专栏  ›  技术社区  ›  DocDriven

如何访问sklearn的KDE参数进行scipy的Kolmogorov-Smirnov测试?

  •  1
  • DocDriven  · 技术社区  · 6 年前

    from sklearn.neighbors.kde import KernelDensity
    
    data = ... # array of shape [5000, 1]
    
    ## perform kde with gaussian kernels
    kde = KernelDensity(kernel='gaussian', bandwidth=0.8).fit(data.reshape(-1, 1))
    

    借助kde的实例方法 score_samples

    pdf created with kde

    ## code for plot
    X_plot = np.linspace(-5, 100, 10000)[:, np.newaxis]
    log_dens = kde.score_samples(X_plot)
    
    plt.plot(X_plot[:, 0], np.exp(log_dens))
    

    我想用这个分布来执行一个样本KS测试。我发现scipy已经实现了这个功能。检查文档 here

    scipy.stats.kstest测试(rvs,cdf,args=(),N=20,alternative='two-sided',mode='approx')

    rvs:str、array或callable

    如果是一个数组,它应该是一个一维随机观测数组 变量;必须有关键字参数大小。

    cdf:str或callable

    房车。如果是可调用的,则使用该可调用来计算cdf。

    基本上,rvs是新的样本数据,cdf是累积分布函数(pdf的积分)。我无法找到如何访问sklearn中计算pdf的函数,以便集成它并将其提供给kstest。

    1 回复  |  直到 4 年前
        1
  •  0
  •   Him    6 年前

    score_samples 获取cdf。 scipy.integrate.quad 可能有用。

    **编辑**似乎 评分\u样本 是对数密度,但未记录时,积分为1。但确实需要一些重塑,不幸的是,scipy集成边界不接受数组。

    def cdf(y):
        return functools.partial(
            scipy.integrate.quad,
            lambda x: np.exp(kde.score_samples(np.array([x]).reshape(-1,1)))[0],
            -np.inf
        )(y)[0]
    
    def array_cdf(X):
        return np.array(list(map(cdf, X)))
    
    scipy.stats.kstest(data, array_cdf)