统计比较两个大型连续数据集

机器算法验证 统计学意义 t检验 scipy 麻木的
2022-03-20 23:42:17

我有多个带有 1 个波段/通道的图像。这是一个 RGB 图像,然后我只有蓝色波段/通道。换句话说,多个一维数据集,或多个一维数组。

我想统计比较每对图像,其中一对意味着两个连续的图像。

每个图像包含大约50,000 个像素或值。这意味着一个可以有 50,345 个值和其他 50,433 个值,因此值的数量没有显着差异,但并不总是相同,因此任何基于相等数组的方法在这里都不够用。这也意味着坐标中的像素,图像(或数组)#1 中的 x,y 不必对应于图像#2 中相同位置的像素。

让我们看这两个例子(其中每种颜色对应于不同的图像或值数组):

在此处输入图像描述

在此处输入图像描述

用非统计的方式来说,蓝色和红色是相似的,而红色和绿色是不同的。

我想执行一个统计测试来量化这种差异,然后我可以选择一个阈值并相应地决定这些对于我的应用程序是否足够相似。

我的问题是 - 假设分布与您在示例中看到的相似,这意味着分布不是 100% 高斯分布,那么哪种统计测试或模型或方法就足够了。

t 检验和 z 检验在这里不起作用,因为自由度很大,因此 p 值为 0,例如我所做的一个(许多)t 检验变体:

stats.ttest_rel(img1,img2,nan_policy='omit')
>>> Ttest_relResult(statistic=-90.27773456178737, pvalue=0.0)

stats.ttest_ind(img1,img3,nan_policy='omit',equal_var=False)
>>> Ttest_indResult(statistic=360.2704559875767, pvalue=0.0)

我想也许可以尝试计算数据集之间的距离或计算两个数据集之间的重叠直方图区域(因为它似乎比比较平均值更好)但我不确定哪种方法(最好在 Python 中)适合这样的任务。

目前,我无法量化或定义我的应用程序的“相似性”。一旦我有一个可以量化相似性的数字,我将能够做到这一点,然后我将不得不检查更多示例,看看哪个阈值适合我。因此,我不需要对相似/不相似问题的答案,而是想得到关于如何量化这种相似性的答案。我的最终目标(这不是这里的问题) - 是得到一个真/假的结果。即,这些数据集是否相似(真)或不相似(假),基于将量化相似性的值(这是我的问题)。

我知道我的问题有点像在黑暗中拍摄,但这是因为我不确定该走哪条路——我应该比较方法吗?方差?直方图的面积。

最后一件事:我希望能够自动化解决方案,因为我有很多这样的配对数据集,所以目视检查在这里不起作用。

4个回答

假设检验的一个特征(不是错误)是随着样本量的增加,它对微小差异变得更加敏感。因此,假设检验不仅仅考虑效果大小,而且您实际上只对效果大小感兴趣(也许除了对不确定性的一些量化之外)。

但是,您的问题的描述表明您的图像中将始终具有像素的样本大小。我怀疑这些像素不是相互独立的(如果一张黑狗的图片有一个黑色像素,我说附近的像素很有可能也是黑色的),但也许你愿意做出这样的假设;假设是这样。在这种情况下,p 值的差异将归因于效应大小的差异,仅此而已,因此 p 值将是分布相似性的一个不错的衡量标准。50000

要处理很小的 p 值,您可以考虑取对数并在对数刻度上确定阈值。

但是,您这样做是为了获得效果大小,所以我建议直接查看效果大小。您可以使用您的软件来计算均值的差异以及置信区间,并使用它们来做出决定。也许更好的是使用 Kolmogorov-Smirnov 检验中的方法并找到经验 CDF 之间的最大垂直距离(以及该值的置信区间),这将对除平均值之外的差异敏感。当您提到直方图的重叠时,您提到的另一个选项是地球移动器的距离另一种选择是KL散度

(请注意,使用置信区间的这种方法仍然依赖于像素的独立性,我对此表示怀疑。)

有了如此大的样本量,您可以通过查看直方图而不是从正式测试中更清楚地了解红色和蓝色之间相对较小(但明显)的差异。

考虑以下(大致相似的)虚构数据:

set.seed(2022)
r = rbeta(50000,7,3)
summary(r)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.09307 0.60781 0.71252 0.69911 0.80363 0.99693 

b = rbeta(50000,7.5,2.5)
summary(b)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.1610  0.6658  0.7676  0.7495  0.8500  0.9974 

绘制核密度估计器:

在此处输入图像描述

plot(density(b), col="blue", lwd=2, 
 ylab="Density", xlab="value", main="KDEs")
lines(density(r), col="red", lwd=2)

两个分布都支持并且存在一定的偏度,因此即使 t 检验确实显示出非常显着的差异,也有人怀疑 t 检验是否精确。(0,1)

t.test(r, b)

    Welch Two Sample t-test

data:  r and b
t = -59.146, df = 99710, p-value < 2.2e-16
alternative hypothesis: 
 true difference in means is not equal to 0
95 percent confidence interval:
 -0.05205704 -0.04871757
sample estimates:
 mean of x mean of y 
 0.6991094 0.7494967 

由于形状和分散略有不同,Wilcoxon 秩和检验显示蓝色随机支配红色(而不仅仅是中位数的差异)。

wilcox.test(r, b)

    Wilcoxon rank sum test 
    with continuity correction

data:  r and b
W = 983310000, p-value < 2.2e-16
alternative hypothesis: 
 true location shift is not equal to 0

在结果显而易见的地方查看实际数据的直方图似乎比为可能不完全适用的测试找借口更直接。

t 检验和 z 检验在这里不起作用,因为自由度很大,因此 p 值为 0

是的。如果您正在测试两个数据集不相关的零假设,则 p 值将很小。即使对于红色与绿色数据集,您也应该拒绝原假设。

如果您不是在测试两者不相关的零假设,而只是试图量化它们之间的差异,那么就会有许多不同的指标。您的描述并不清楚您到底想测试什么,但是如果您想问“这些曲线是否相同”,您将需要一个向量 norm一种主要类型是范数。在这个规范中,对于一个特定的值(注意:这与概率意义上的 p 值完全不同),您,然后取该 -th 根。产生不同的规范,范围可以从Lppx|f(xi)g(xi)|ppp0标准只是最大值)。是欧几里得/毕达哥拉斯范数。LL2

还有协方差。和协方差都取决于分布的规模。也就是说,将加倍将产生更大的值。如果你不想这样,你可以将它们标准化。如果将协方差除以标准差的乘积,则得到相关性。Lpfg

您可以尝试一些采样技术。更详细地说,您可以从蓝色、红色和绿色总体中选择较小的随机样本,并使用您提到的传统统计测试来比较这些样本。多次运行并计算零假设(均值相等)在总数中被拒绝的次数。请记住,p 值也是随机变量,因此在显着性水平为 5% 时,即使均值相同,您也会期望这些假设检验中有 5% 拒绝原假设(因此即使在红色与蓝色外壳)。

或者,另一种选择是运行 Kolmogorov-Smirnov 测试。