簡體   English   中英

Python中的CDF無法正確顯示

[英]CDF in Python not displaying correctly

早上好,

在Python中,我有一個具有以下值的字典(稱為packet_size_dist):

34  =>  0.00909909009099
42  =>  0.02299770023
54  =>  0.578742125787
58  =>  0.211278872113
62  =>  0.00529947005299
66  =>  0.031796820318
70  =>  0.0530946905309
74  =>  0.0876912308769

請注意,值的總和== 1。

我正在嘗試成功生成CDF,但是它看起來錯了,我想知道我是否會錯誤地生成它。 有問題的代碼是:

sorted_p = sorted(packet_size_dist.items(), key=operator.itemgetter(0))
yvals = np.arange(len(sorted_p))/float(len(sorted_p))
plt.plot(sorted_p, yvals)
plt.show()

但是結果圖看起來像這樣: 數據包分發的CDF

似乎與字典中的值不太匹配。 有任何想法嗎? 我還在圖的左側看到一條模糊的綠線,我不知道它是什么。 例如,該圖描繪了70%的數據包大小出現在大約78%的時間,而在我的字典中,它表示為5%的時間出現。

這不是您問題的直接答案。 但是,我想指出一點,您的數據來自離散的隨機變量(而不是連續的變量),因此,在一系列情況下用一系列線段表示它們可能會引起誤解。 累積分布函數中的表示可能會過大。 我提供以下簡化。

在此處輸入圖片說明

“ x”表示截斷。 點表示封閉打開間隔的封閉端。

這是代碼。 我不認為要使用np.cumsum

import numpy as np
import pylab as pl
from matplotlib import collections  as mc

p = [0.00909909009099,0.02299770023,0.578742125787,0.211278872113,0.00529947005299,0.031796820318,0.0530946905309,0.0876912308769]
cumSums = [0] + [sum(p[:i]) for i in range(1,len(p)+1)]
counts = [30,34,42,54,58,62,66,70,74,80]

lines =[[(counts[i],cumSums[i]),(counts[i+1],cumSums[i])] for i in range(-1+len(counts))]

lc = mc.LineCollection(lines, linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)

pl.plot([30, 80],[0, 1],'bx')
pl.plot(counts[1:-1], cumSums[1:], 'bo')

ax.autoscale()
ax.margins(0.1)

pl.show()

這更像您似乎想要的情節。 (希望如此)

在此處輸入圖片說明

對於哪個代碼。

import numpy as np
import pylab as pl
from matplotlib import collections  as mc
from sys import exit

p = [0.00909909009099,0.02299770023,0.578742125787,0.211278872113,0.00529947005299,0.031796820318,0.0530946905309,0.0876912308769]
cumSums = [sum(p[:i]) for i in range(1,len(p)+1)]
counts = [34,42,54,58,62,66,70,74]

lines = [[(counts[i],cumSums[i]),(counts[i+1],cumSums[i+1])] for i in range(-1+len(p))]

lc = mc.LineCollection(lines, linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.autoscale()
ax.margins(0.1)

pl.show()

使用numpy使一切變得容易得多。 因此,首先您可以將字典轉換為2列numpy數組。 然后,您可以按其第一列對其進行排序。 最后,只需計算第二列的累加總和並將其與第一列相對應即可。

dic = { 34  :  0.00909909009099,
        42  :  0.02299770023,
        54  :  0.578742125787,
        58  :  0.211278872113,
        62  :  0.00529947005299,
        66  :  0.031796820318,
        70  :  0.0530946905309,
        74  :  0.0876912308769 }

import numpy as np
import matplotlib.pyplot as plt

data = np.array([[k,v] for k,v in dic.iteritems()]) # use dic.items() for python3
data = data[data[:,0].argsort()]
cdf = np.cumsum(data[:,1])

plt.plot(data[:,0], cdf)

plt.show()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM