2013-07-19 69 views
3

我的代碼在-10到10的範圍內生成某個值,範圍從[0,1) 代碼的值取值範圍爲-10到10,根據它的概率將它列入清單。例如,-10將被放入列表0次,因爲它對應於值0,並且10將被放置100次(作爲標準化),因爲它對應於範圍中的1。Numpy直方圖代表具有近似值的浮點數相同

下面是代碼:

#!/usr/bin/env python 

import math 
import numpy as np 
import matplotlib.pyplot as plt 

pos = [] 
ceilingValue = 0.82 
pValues = np.linspace(0.00, ceilingValue, num=100*ceilingValue) 

for i in xrange(int(100*ceilingValue)): 
    p = pValues[i] 
    y = -11.63*math.log(-2.36279*(p - 1)) 
    for j in xrange(i): 
     pos.append(y) 

avg = np.average(pos)  
std = np.std(pos)  

hist, bins = np.histogram(pos,bins = 100) 
width = 0.7*(bins[1]-bins[0]) 
center = (bins[:-1]+bins[1:])/2 
plt.bar(center, hist, align = 'center', width = width) 
plt.show() 

的問題是,直方圖會產生一個精確的情節,但某些值將打破趨勢。例如,-5.88對應於頻率計數中的約30個條目將在大約70處。我認爲python會看到這兩個值並將它們混合在一起,但我不知道如何解決它。但是,如果只是直方圖出現問題,那麼它並不重要,我並不需要它。我只是需要清單,如果它是正確的。

回答

3

我認爲潛在的問題是您的bin大小是一致的,而pos中的唯一值之間的差異呈指數級擴展。正因爲如此,你總是會遇到奇怪的「尖峯」,其中兩個附近的唯一值落在同一個倉內,或者很多空倉(尤其是如果你只是增加倉數以擺脫「尖峯」)。

你可以嘗試根據pos實際唯一值設置你的垃圾箱,使它們的寬度不均勻:

# the " + [10,]" forces the rightmost bin edge to == 10 
uvals = np.unique(pos+[10,]) 
hist, bins = np.histogram(pos,bins=uvals) 
plt.bar(bins[:-1],hist,width=np.diff(bins)) 

enter image description here

2

我相信你很好。我用bins = 200而不是bins = 100重新編寫代碼,尖峯消失了。我認爲你的價值觀已經陷入了垃圾箱之間的界限。

+0

啊是啊,我看到了。所以現在我想將其規格化爲10萬次,我應該更多地提高垃圾箱嗎? – alvarezcl

+1

正確 - 您擁有的數據點越多,您需要清除重疊的垃圾箱越多。下面ali_m的回答很聰明,但是這引出了你爲什麼要把這個情節放在第一位的問題,例如,繪製pos本身可能比直方圖更好 –

相關問題