【问题标题】: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)