从列表计算条件概率

Calculating conditional probability from list

正在尝试计算给定列表的条件概率。假设我有以下列表:

[[ 1, 0, 0, 0, 1, 5],
 [ 0, 1, 0, 1, 0, 3],
 [ 1, 0, 0, 0, 1, 5],
 [ 0, 0, 1, 1, 0, 2],
 [ 0, 0, 1, 0, 1, 1]]

每个'column'代表一个二进制属性,最后一个'column'是class属性。要找到属性的条件概率,我需要计算 P(X|Y).

在Python列表中,我如何

  1. 计算属性的频率,给定它是 Y class?
  2. 计算 class?
  3. 的总频率

以上内容在 pandas 中很容易实现,但我实际上对如何使用 Python 列表来解决它一无所知。

您可以按照以下方式构建数据结构:

from collections import defaultdict

d = defaultdict(lambda: defaultdict(lambda: [0, 0]))

for *values, key in matrix:
    for i, v in enumerate(values):
        d[key][i][v] += 1

然后像这样计算条件概率:

def prob(k, i):
    false, true = d[k][i]  # counts of vals 0/1 in col i for class k
    return true / (true + false)

>>> prob(5, 3)  # for class 5, column 3 is this likely to be 1
0.0
>>> prob(5, 4)
1.0

frequency of the attribute given it is a Y class?

class_ = 3
attr_index = 1
attr_freq_given_cls = sum(a_list[attr_index]
                          for a_list in list_of_lists
                          if a_list[-1] == class_)

由于属性来自{0, 1}summing 产生出现次数;并使用 -1 进行索引给出标签。

count the total frequency for the class?

from collections import Counter
class_freqs = Counter(a_list[-1] for a_list in list_of_lists)

祝那个朴素的贝叶斯好运 :)