我有两个简单的数据集,其中 * 10 k个IP地址 * 编码为 * 整数 *(因此数据是离散的,可以采用1到4 B之间的任何数字)。
仅供参考:一个数据集是在网络上捕获的真实的数据集,而另一个是合成数据集。在一天结束的时候,我想看看合成的(通过AI/ML生成的)和真实的相比有多好。但是我在开始的时候就被卡住了:D
由于数据集的分布是未知的,但不遵循任何已知的分布,我想计算它们的PDF(并在以后比较它们的相似性)。
我的两个数据集分别称为p
和q
,这两个数据集都是IP地址数组(整数)。
我不是概率论方面的Maven,所以请你,宽容我:)
因为我想最终比较这两个概率,计算它们的PDF,所以我取p
和q
中存在的所有可能的事件(即IP地址)。为此,我在Python中使用numpy
执行以下操作:
import numpy as np
import pandas as pd
q=np.array(real_data_1m.srcip) #
p=np.array(syn_data_1m.srcip)
#get all possible discrete events from p and q
px=np.array(list(set(p))) #use set here to remove duplicates
qx=np.array(list(set(q))) #use set here to remove duplicates
#concatenate px and qx
mx=np.concatenate([px,qx])
mx.sort() #sort them, as they are anyway integers
mx=np.array(list(set(mx))) #remove duplicates by creating a set
#mx.reshape((len(mx),1)) #reshape from 1D to nD, where n=len(mx)
字符串
然后,为了计算PDF,我创建了一个简单的函数create_prob_dist()
来帮助实现这个目标。
def create_prob_dist(data: np.array, sample_space: np.array):
#number of all events
sum_of_events = sample_space.size
#get the counts of each event via pandas.crosstab()
data_counts = pd.crosstab(index='counts', columns=data)
#create probabilities for each event
prob_dist=dict()
for i in sample_space:
if i in data_counts:
prob_dist[i]=(data_counts[i]['counts'])/sum_of_events
else:
prob_dist[i]=0
return prob_dist
型
此函数不返回PDF本身。在这一阶段,它返回一个Python字典,其中的键是用p
和q
(即mx
)表示的可能的IP地址。因此,相应的值就是它们各自的概率。例如:dict[2130706433]=0.05,表示数据集中IP地址www.example.com的概率127.0.0.1为0.05。
在我有了这本概率词典之后,我试着把它画出来,但随之而来的是我的问题:
#create true PDFs of p and q using mx
p_pdf=create_prob_dist(p, mx)
q_pdf=create_prob_dist(q, mx)
#get the probability values only from the dictionary
p_pdf=np.array(list(p_pdf.values())) #already sorted according to mx
q_pdf=np.array(list(q_pdf.values())) #already sorted according to mx
plt.figure()
plt.plot(mx, q_pdf, 'g', label="Q")
plt.plot(mx, p_pdf, 'r', label="P")
plt.legend(loc="upper right")
plt.show()
型
x1c 0d1x的数据
我知道应该有一个问题,周围的规模或什么,但我不能得到我的头周围。
我做错了什么?是Python调用错误还是PDF计算错误?
顺便说一下,p
和q
的纯直方图如下所示:
# plot a histogram of the two datasets to have a quick look at them
plt.hist(np.array(syn_data_1m.srcip), bins=100)
plt.hist(np.array(real_data_1m.srcip),bins=100, alpha=.5)
plt.show()
型
的
1条答案
按热度按时间f5emj3cl1#
由于slothrop,解决方案如下:
字符串
PDF现在很好:
的数据