【问题标题】:Perform two-sample Kolmogorov-Smirnov test on two dictionaries对两个字典执行两样本 Kolmogorov-Smirnov 检验
【发布时间】:2022-01-16 23:11:48
【问题描述】:

我有两个字典,其中包含两个离散分布:A={1: 300, 2: 400, 4: 20,...} 和 B={2: 100, 3: 200 , 4: 75,...}。我想检查它们的相似度,我想执行两个样本 Kolmogorov-Smirnov 检验。

我检查了scipy function,但它似乎只适用于 numpy 数组,我如何在我的数据上执行它?

【问题讨论】:

    标签: python dictionary scipy distribution kolmogorov-smirnov


    【解决方案1】:

    您可以轻松地将数据转换为numpy.array:

    import numpy as np
    
    my_keys = sorted(set([*A.keys(), *B.keys()]))
    
    A_array = np.array(A.get(key,0) for key in my_keys)
    B_array = np.array(B.get(key,0) for key in my_keys)
    

    我注意到A 和B 没有相同的键(例如,B 似乎不包含键“1”) - 所以你需要注意这一点。我找到键并集的原因,如果字典中不存在键,则将值设为 0(我假设在这种情况下,您对该特定键没有任何观察结果)。

    现在这两个数组兼容测试。

    【讨论】:

      【解决方案2】:

      您可以创建一个 pandas 数据框来轻松处理 N/A 值。然后在生成的数据框列上运行您的统计信息。 显然,您无法比较具有不同键的两个系列。

      data_frame = pd.DataFrame(dict(s1=A,s2=B)).dropna()
      stats = stats.ks_2samp(data_frame.iloc[:, 0], data_frame.iloc[:, 1])
      

      【讨论】:

        【解决方案3】:

        也许将您的字典值转换为 numpy 数组:

        import numpy as np
        import scipy
        a = np.array(list(A.values()))
        b = np.array(list(B.values()))
        scipy.stats.ks_2samp(a, b)
        

        【讨论】:

          猜你喜欢
          • 2018-03-10
          • 2015-03-25
          • 2012-06-08
          • 2016-12-20
          • 2020-02-05
          • 2014-09-21
          • 1970-01-01
          • 2016-11-06
          • 2014-12-30
          相关资源
          最近更新 更多