如何计算2D高斯分布中有多少粒子

时间:2018-05-24 12:35:08

标签: python numpy

我刚开始使用Python,所以如果我要求琐碎的事情,我很抱歉。

我生成了两个随机高斯分布,并用它来生成二维高斯分布。我现在要做的是绘制一个图表,该图表表示2D高斯分布的圆周内的元素数量,改变圆周的半径(在每一步减少它)。

你会很善良帮我解决问题。感谢您考虑我的帖子。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

mu1, sigma1 = 0, 0.1                                  # mean and standard deviation
s1 = np.random.normal(mu1, sigma1, 10000)              # generate N randoomly Gaussian points
mu2, sigma2 = 0.8, 0.3
s2 = np.random.normal(mu2, sigma2, 10000)


#ISTOGRAMMA DI DUE DISTRIBUZIONI GAUSSIANE CON DIFFERENTI SET
plt.figure(1)
plt.title('Histogram of a 2D-Gaussian Distribution')
bins1 = plt.hist(s1, 100)
bins2 = plt.hist(s2, 100)
plt.show()

#DISTRIBUZIONE GAUSSIANA 2D
plt.figure(2)
plt.title('2D-Gaussian Distribution')
bins = plt.hist2d(s1, s2, 100)
cb = plt.colorbar()
cb.set_label('counts in bin')
plt.show()

1 个答案:

答案 0 :(得分:1)

假设s1和s2是某些2D点的坐标,这应该可以解决问题。如果没有,可以轻松更改代码以符合您的问题。

首先,通过减去它们的平均值来居中两个分布,然后检查它们的哪个元素(绝对值)在圆的半径内。然后你采取逻辑,并确保只采取圆圈内有两个坐标的点。

radius = 0.1
valid_indexes = np.logical_and(abs(s1 -mu1)<= radius, abs(s2 - mu2) <= radius)

s1_valid = s1[valid_indexes]
s2_valid = s2[valid_indexes]

现在,您已获得圆形内的分布中的点,其中给定半径以(mu1,mu2)为中心。

[编辑]

由于您想要计算元素的数量而不是提取它们,您可以轻松地进行

radius = 0.1
sum(np.logical_and(abs(s1 -mu1)< radius, abs(s2 - mu2) < radius))

[编辑2]

这绘制了圆的每个半径的点数,从极限开始并逐步减小到0

step = 0.025
limit = 1

s1_ca = abs(s1-mu1)
s2_ca = abs(s2-mu2)

points_in_radius = []

radius_values = np.round(np.arange(0, limit, step), 3)[::-1]

for radius in radius_values:
    points_in_radius.append(sum(np.logical_and(s1_ca < radius, s2_ca < radius)))

plt.plot(points_in_radius)
plt.xticks(range(len(points_in_radius)), radius_values, rotation=90)
plt.show()

首先我将分布中心并取其abs值。然后我创建了要使用的半径范围,最后我循环使用它们并使用上面的公式添加结果。

这不是最有效的方法,但它有效。