假设我有一个大型数据集,我可以在某种分析中操作它。哪个可以查看概率分布中的值。
现在我有了这个大数据集,然后我想比较已知的实际数据。主要是,我的数据集中有多少值与已知数据具有相同的值或属性。例如:
这是累积分布。连续线来自模拟生成的数据,降低的强度只是预测的百分比。然后是恒星观测(已知)数据,根据生成的数据绘制。
我所做的另一个例子是可以在直方图上投射点的视觉效果:
我很难在生成的数据集中标记已知数据点的位置,并在生成数据的分布上累积绘制它。
如果我尝试检索生成数据附近的点数,我会从这样开始(它不对):
def SameValue(SimData, DefData, uncert):
numb = [(DefData-uncert) < i < (DefData+uncert) for i in SimData]
return sum(numb)
但我无法解决价值范围内的点数,然后将其全部设置到我可以绘制的位置。有关如何收集这些数据并将其投影到累积分布上的想法吗?
答案 0 :(得分:1)
问题非常混乱,有很多不相关的信息,但在本质上保持模糊。我会尽力解释它。
我认为你所追求的是:如果来自未知分布的有限样本,获得固定值的新样本的概率是多少?
我不确定是否有一般性答案,但无论如何这将是一个问题要求统计或数学人。我的猜测是你需要对分布本身做一些假设。
然而,对于实际情况,可能足以找出新值的样本分布在哪个bin中。
假设我们有一个分布x
,我们将其分为bins
。我们可以使用h
计算直方图numpy.histogram
。然后,h/h.sum()
给出在每个箱中找到值的概率
有一个值v=0.77
,我们想知道根据分布的概率,我们可以通过查找bin数组中的索引ind
找到它所属的bin。需要插入数组以保持排序。这可以使用numpy.searchsorted
完成。
import numpy as np; np.random.seed(0)
x = np.random.rayleigh(size=1000)
bins = np.linspace(0,4,41)
h, bins_ = np.histogram(x, bins=bins)
prob = h/float(h.sum())
ind = np.searchsorted(bins, 0.77, side="right")
print prob[ind] # which prints 0.058
因此,在垃圾箱中采样值约为0.77时,概率为5.8%。
另一种选择是在bin中心之间插入直方图,以便找到概率。
在下面的代码中,我们绘制了一个类似于问题中图片的分布,并使用两种方法,第一种用于频率直方图,第二种用于累积分布。
import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
x = np.random.rayleigh(size=1000)
y = np.random.normal(size=1000)
bins = np.linspace(0,4,41)
h, bins_ = np.histogram(x, bins=bins)
hcum = np.cumsum(h)/float(np.cumsum(h).max())
points = [[.77,-.55],[1.13,1.08],[2.15,-.3]]
markers = [ur'$\u2660$',ur'$\u2665$',ur'$\u263B$']
colors = ["k", "crimson" , "gold"]
labels = list("ABC")
kws = dict(height_ratios=[1,1,2], hspace=0.0)
fig, (axh, axc, ax) = plt.subplots(nrows=3, figsize=(6,6), gridspec_kw=kws, sharex=True)
cbins = np.zeros(len(bins)+1)
cbins[1:-1] = bins[1:]-np.diff(bins[:2])[0]/2.
cbins[-1] = bins[-1]
hcumc = np.linspace(0,1, len(cbins))
hcumc[1:-1] = hcum
axc.plot(cbins, hcumc, marker=".", markersize="2", mfc="k", mec="k" )
axh.bar(bins[:-1], h, width=np.diff(bins[:2])[0], alpha=0.7, ec="C0", align="edge")
ax.scatter(x,y, s=10, alpha=0.7)
for p, m, l, c in zip(points, markers, labels, colors):
kw = dict(ls="", marker=m, color=c, label=l, markeredgewidth=0, ms=10)
# plot points in scatter distribution
ax.plot(p[0],p[1], **kw)
#plot points in bar histogram, find bin in which to plot point
# shift by half the bin width to plot it in the middle of bar
pix = np.searchsorted(bins, p[0], side="right")
axh.plot(bins[pix-1]+np.diff(bins[:2])[0]/2., h[pix-1]/2., **kw)
# plot in cumulative histogram, interpolate, such that point is on curve.
yi = np.interp(p[0], cbins, hcumc)
axc.plot(p[0],yi, **kw)
ax.legend()
plt.tight_layout()
plt.show()