我想计算日志文件中出现的多个项目之间的相关百分比。这样,我得到它们出现的次数除以存在另一个项目时出现的次数。 我不会在细节上过多介绍,但是这种相关性不是对称的 (A和B之间的相关性与B和A之间的相关性不同)
作为输出,我有一本字典,其格式如下:
{
itemA: {
itemB: 0.85,
itemC: 0.12
},
itemB: {
itemC: 0.68,
itemA: 0.24
},
itemC: {
itemA: 0.28
}
}
我曾尝试使用DictVectorizer
中的sklearn
,但由于它需要字典列表,因此无法正常工作。
我希望输出成为matplotlib
可视化的矩阵
类似这样的东西
[[1,0.85,0.12]
[0.68,1,0.24]
[0.28,0,1]]
如果可能的话,我还希望有一个matplotlib可视化效果,其中每行和每一列都有一个图例,因为我的字典有3种以上的项。
我希望一切都清楚。 谢谢您的帮助。
答案 0 :(得分:1)
您可以使用pandas和numpy有效地做到这一点:
import pandas as pd
d = {
'itemA': {
'itemB': 0.85,
'itemC': 0.12
},
'itemB': {
'itemA': 0.68,
'itemC': 0.24
},
'itemC': {
'itemA': 0.28
}
}
df = pd.DataFrame(d)
# since this is a matrix of co-occurrences of a set of objects,
# sort columns and rows alphabetically
df = df.sort_index(axis=0)
df = df.sort_index(axis=1)
# the matrix is now the values of the dataframe
a = df.values.T
# if needed, fill the diagonal with 1 and replace NaN with 0
import numpy as np
np.fill_diagonal(a, 1)
a[np.isnan(a)] = 0
现在的矩阵是:
array([[1. , 0.85, 0.12],
[0.68, 1. , 0.24],
[0.28, 0. , 1. ]])
要可视化此矩阵,请执行以下操作:
import matplotlib.pyplot as plt
plt.matshow(a)
plt.show()
行ID和列ID将显示为标签。
答案 1 :(得分:0)
这是与数组配合使用的代码,但是您可以轻松地将其适应要使用的序列。
dictionary = {
'itemA': {
'itemB': 0.85,
'itemC': 0.12
},
'itemB': {
'itemA': 0.68,
'itemC': 0.24
},
'itemC': {
'itemA': 0.28
}
}
matrix = []
i = 0
for v in dictionary.values():
tmp_mat = []
for h in v.values():
if len(tmp_mat) == i:
tmp_mat.append(1)
tmp_mat.append(h)
i += 1
if len(tmp_mat) == len(v):
tmp_mat.append(1)
matrix.append(tmp_mat)
print(matrix)
[[1,0.85,0.12],[0.68,1,0.24],[0.28,1]]