numpy 获取IP地址数据集的单变量概率密度函数

5us2dqdw  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(101)

我有两个简单的数据集,其中 * 10 k个IP地址 * 编码为 * 整数 *(因此数据是离散的,可以采用1到4 B之间的任何数字)。
仅供参考:一个数据集是在网络上捕获的真实的数据集,而另一个是合成数据集。在一天结束的时候,我想看看合成的(通过AI/ML生成的)和真实的相比有多好。但是我在开始的时候就被卡住了:D
由于数据集的分布是未知的,但不遵循任何已知的分布,我想计算它们的PDF(并在以后比较它们的相似性)。
我的两个数据集分别称为pq,这两个数据集都是IP地址数组(整数)。
我不是概率论方面的Maven,所以请你,宽容我:)
因为我想最终比较这两个概率,计算它们的PDF,所以我取pq中存在的所有可能的事件(即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字典,其中的键是用pq(即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计算错误?
顺便说一下,pq的纯直方图如下所示:

# 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()


f5emj3cl

f5emj3cl1#

由于slothrop,解决方案如下:

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=np.array(list(set(mx))) #remove duplicates by creating a set
# CALL SORT THE LAST TIME
mx.sort() #sort them, as they are anyway integers
#mx.reshape((len(mx),1)) #reshape from 1D to nD, where n=len(mx)

字符串
PDF现在很好:

的数据

相关问题