首页 > 解决方案 > 如何计算二维高斯分布中有多少粒子

问题描述

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

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

你会很乐意帮助我解决问题。感谢您考虑我的帖子。

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()

标签: pythonnumpy

解决方案


这应该可以解决问题,假设 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 值。然后我创建要使用的半径范围,最后循环遍历它们并使用上面的公式添加结果。

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


推荐阅读