【发布时间】:2014-12-11 20:46:01
【问题描述】:
我有一个完整的数据包头信息的 .csv 文件。前几行:
28;03/07/2000;11:27:51;00:00:01;8609;4961;8609;097.139.024.164;131.084.001.031;0;-
29;03/07/2000;11:27:51;00:00:01;29396;4962;29396;058.106.180.191;131.084.001.031;0;-
30;03/07/2000;11:27:51;00:00:01;26290;4963;26290;060.075.194.137;131.084.001.031;0;-
31;03/07/2000;11:27:51;00:00:01;28324;4964;28324;038.087.169.169;131.084.001.031;0;-
总共有大约 33k 行(每行是来自不同数据包头的信息)。现在我需要使用源地址和目标地址来计算熵。
使用我写的代码:
def openFile(file_name):
srcFile = open(file_name, 'r')
dataset = []
for line in srcFile:
newLine = line.split(";")
dataset.append(newLine)
return dataset
我得到的回报看起来像
dataset = [
['28', '03/07/2000', '11:27:51', '00:00:01', '8609', '4961', '8609', '097.139.024.164', '131.084.001.031', '0', '-\n'],
['29', '03/07/2000', '11:27:51', '00:00:01', '29396', '4962', '29396', '058.106.180.191', '131.084.001.031', '0', '-\n'],
['30', '03/07/2000', '11:27:51', '00:00:01', '26290', '4963', '26290', '060.075.194.137', '131.084.001.031', '0', '-\n'],
['31', '03/07/2000', '11:27:51', '00:00:01', '28324', '4964', '28324', '038.087.169.169', '131.084.001.031', '0', '-']
]
然后我将它传递给我的熵函数:
#---- Entropy += - prob * math.log(prob, 2) ---------
def Entropy(data):
entropy = 0
counter = 0 # -- counter for occurances of the same ip address
#-- For loop to iterate through every item in outer list
for item in range(len(data)):
#-- For loop to iterate through inner list
for x in data[item]:
if x == data[item][8]:
counter += 1
prob = float(counter) / len(data)
entropy += -prob * math.log(prob, 2)
print("\n")
print("Entropy: {}".format(entropy))
代码运行没有任何错误,但它给出了错误的熵,我觉得这是因为错误的概率计算(第二个 for 循环是可疑的)或错误的熵公式。有没有办法在没有另一个 for 循环的情况下找到 IP 发生的概率?欢迎对代码进行任何编辑
【问题讨论】:
-
第二个 for 循环有点令人担忧。也许像
count = data[item].count(data[item][8])这样的东西。如果这真的是你想要的。 -
如果数据集是您传递给 Entropy 的内容,您将遇到各种问题。如果你只关心
Entropy中的IP 地址,那么只需将openFile()中的IP 地址取出即可 -
@user2097159 你的解决方案给了我错误:TypeError: list indices must be integers, not str
标签: python probability entropy