【问题标题】:Difference between two 2D histograms两个二维直方图之间的差异
【发布时间】:2021-03-31 00:01:59
【问题描述】:

我想绘制两个二维直方图之间的差异。例如,考虑以下代码:

from numpy import c_
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors


n = 100000

x = np.random.standard_normal(n)
y = 3.0 * x + 2.0 * np.random.standard_normal(n)

x1 = np.random.normal(loc=-2, scale=5, size=n)
y1 = (x1)**2 + np.random.standard_normal(n)

plt.figure(1)
h, xedges, yedges, image = plt.hist2d(x,y, bins=50, norm=mcolors.LogNorm(), cmap = plt.cm.rainbow)

plt.figure(2)
h1, xedges1, yedges1, image1 = plt.hist2d(x1,y1, bins=50, norm=mcolors.LogNorm(), cmap = plt.cm.rainbow)

是否可以绘制它们之间的差异?

提前谢谢你。

【问题讨论】:

  • 您是否对 bin-to-bin 或 cross-bin 比较感兴趣?
  • 制作bins=(xedges, yedges) 并在每次调用plt.hist2d 之间保持相同(或使用第二次调用中的第一个边缘),然后你就可以做imshow(h-h1)跨度>

标签: python numpy matplotlib


【解决方案1】:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors


n = 100000

x = np.random.standard_normal(n)
y = 3.0 * x + 2.0 * np.random.standard_normal(n)

x1 = np.random.normal(loc=-2, scale=5, size=n)
y1 = (x1)**2 + np.random.standard_normal(n)

plt.figure(1)
h, xedges, yedges, image = plt.hist2d(x,y, bins=(50, 60), norm=mcolors.LogNorm(), cmap = plt.cm.rainbow)

plt.figure(2)
h1, xedges1, yedges1, image1 = plt.hist2d(x1,y1, bins=(xedges, yedges), norm=mcolors.LogNorm(), cmap = plt.cm.rainbow)

plt.figure(3)
plt.pcolormesh(xedges, yedges, (h-h1).T)

plt.show()

由于某种原因,matplotlib 中的每个统计函数都会返回转置的内容,但你明白了。

【讨论】:

    【解决方案2】:

    就我而言,您可以对数组进行操作,找到 .._diff 值,然后进行绘图。 示例:

    x_diff = x - x1
    y_diff = y - y1 
    h_diff, xedges_diff, yedges_diff, image_diff = plt.hist2d(x_diff, y_diff, bins=50, norm=mcolors.LogNorm(), cmap = plt.cm.rainbow)
    

    【讨论】:

      【解决方案3】:

      你有两大类比较函数:bin-to-bin比较和cross-bin比较。

      • Bin-to-bin 比较:标准差异总和非常糟糕。 有一个改进,即卡方距离。

      • 跨箱比较:称为箱相似度矩阵的标准示例需要一些相似度矩阵 M,其中 M(i,j) 是箱 i 和 j 之间的相似度。直方图 H1 和 H2 之间的距离为 sqrt((H1-H2)M(H1-H2))。地球移动距离(EMD)是另一种跨箱距离。

      This paper 以一种很好的方式向您介绍直方图距离。

      总而言之,您需要更好地定义差异在您的案例中意味着什么。

      编辑:我认为最简单的方法是使用opencv's implementation of the histogram comparison,其中包括直方图交集、Bhattacharyya 距离、卡方等指标。

      cv.compareHist(hist_1, hist_2, compare_method)
      

      【讨论】:

      • 谢谢你,阿扎尔。那是个很好的观点。我认为我的问题不完整。考虑到提供的示例,我们看到 h1 值进一步扩展了 xedges1 15,这反过来又是 h 的限制。在“差异图”中,这些值必须出现在正确的位置。现在想得更好,而不是 bin-to-bin 或 cross-bin 比较,也许我应该创建一个公共网格并在这种网格中的分布之间做出“差异”?
      • 你想回答什么问题?您想查看 2 个直方图的“相似程度”吗?还是您只想绘制实际上并没有多大意义的“差异”?
      • 如果对您有帮助,请采纳答案
      • 亲爱的 azal,抱歉耽搁了。我正在测试不同的方法。最适合我的答案是@Jody Klymak 提出的答案。我创建了一个用于数据集的通用网格,然后从“h1”中减去“h”。我将用解决方案更新我的答案。干杯,感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2021-12-03
      • 2021-12-08
      相关资源
      最近更新 更多