假设我有N个已知的列表。每个列表包含可能重复的项目(不是集合),例如:
{A,A,B,C}, {A,B,C}, {B,B,B,C,C}
我需要一种算法(可能是机器学习算法?)来回答以下问题:
给定一个新的、未知的部分项目列表,例如{A,B},根据之前的列表所知,C出现在列表中的概率是多少。如果可能,我希望得到更细粒度的概率:给定某个部分列表L,C在列表中出现一次的概率是多少,出现两次的概率是多少,等等。顺序无关紧要。C在{A,B}中出现两次的概率应该等于它在{B,A}中出现两次的概率。
有什么算法可以做到这一点吗?
回答:
这只是纯粹的数学问题,没有实际的“算法”,只需从你的数据集中估计所有概率(直接统计出现次数)。特别是,你可以使用非常简单的数据结构来实现你的目标。将每个“列表”表示为字母袋,因此:
{A,A,B,C} -> {A:2, B:1, C:1}{A,B} -> {A:1, B:1}
等等,并创建某种基本的反向索引,例如为每个字母分别保持索引,按它们的计数排序。
现在,当查询到来时,比如{A,B} + C
,你所做的就是搜索包含至少1个A和1个B的数据(使用你的索引),然后通过计算包含C(或恰好一个C)的检索结果的分数与所有检索结果的比率来估计概率(假设你的数据是一些基础数据生成分布的独立样本,这是一个有效的概率估计)。
或者,如果你的字母表非常小,你实际上可以预先计算所有字母组合的P(C|{A,B})
等值。