python - 如何计算二维高斯分布中有多少粒子
问题描述
我刚开始使用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()
解决方案
这应该可以解决问题,假设 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 值。然后我创建要使用的半径范围,最后循环遍历它们并使用上面的公式添加结果。
这不是最有效的方法,但它确实有效。
推荐阅读
- python - 无法使用 chromedriver 调用的模块对象
- ios - 有没有办法在 swiftUI 中设置工作表解雇条件?
- java - 第二次打印储蓄
- jquery - jQuery-AJAX 硬币 API
- reactjs - react codemirror 2如何显示之前输入的变量
- c# - 获取从今天开始 1 个月的日期,UTC,以秒为单位。C#
- vue.js - Eslinter 不适用于具有 .vue 扩展名的文件
- xcode - 在 watch app swift 中应该使用哪种设计模式?
- python-3.x - Python selenium 无法正确找到类
- html - 当用户在数字输入中超过最大值时如何禁用浏览器弹出/工具提示?