def get_CDF(numList): print "total number of numList %d"%len(numList) numArray = np.asarray(numList) dx = .01 bins_array = np.arange(-0.5,1.5,dx) hist, bin_edges = np.histogram(numArray, bins=bins_array, normed=False) cdf = np.cumsum(hist) cdf = cdf/float(hist.sum()) bins_list = bins_array[1:] return (bins_list, cdf)
折騰了好久,之前寫寫了個畫histogram圖的代碼,但是發現如果要畫兩個list的話,會出現問題,他們的下標沒法統一,而且之前的代碼也還有個問題,解釋如果list中的元素都是0-1之間小數的話,極容易出現上下取整,變為1,0,然后畫圖出來的效果就不是歸一化了。
http://stackoverflow.com/questions/9378420/how-to-plot-cdf-in-matplotlib-in-python這個解答算是啟發我如何解決問題的。謝謝他。
今天在要畫兩個圖的情況下,自己找了不少資料,最后整理出來了一個。記錄下。
有幾個問題需要注意
1.cdf/float(hist.sum())這里一定要float不然的話,出來的就都是0了,因為本來這里求的就是頻數的小數,如果不加float,就變為0了。
2.bins_list = bins_array[1:] 這里需要從1開始取,因為經過cumsum之后,會少了一個元素,這是因為第一個元素之前的值為0,自動省掉了。另外bins_array可以用來直接轉換為array。這點還挺意外的。這個少了一個數的,可以參考這個回答http://stackoverflow.com/questions/15697350/binning-frequency-distribution-in-python
3.histogram,normed我這里設置的是false,因為我設置為true的時候,統計的是概率,一直不對勁,我也沒搞懂他的概率是怎么算的。false的話就是頻數。有誰明白true的時候怎么算的麻煩告知我一聲。謝謝