假设我有一个大型培训数据集,其中包含每组40项,并且集合中的每个项都是唯一的(因此每个培训输入都是一个集合S=\{i_1, i_2, ..., i_{40}\}),并且有超过40个唯一项可以是一个集合的一部分。
考虑到一些不完整的集合,我希望能够预测哪些项可能是集合的成员。因此,让我们以下面的例子为例:
培训数据:
,
,
假设我有一个输入S_4 = \{3\},我想要这个方法返回1,2,4和5是比7,8更可能的集合成员,最好是一些概率值。
我考虑了以下几点:
使用先验算法学习一些关联规则。我不知道如何将支持或取消理解为设置成员的概率。
在输入(可能是一个热编码)上训练一个多层感知器,以学习与各种输入项对应的权重。但是,如果我简单地将40项集作为输入和输出,那么网络就会学会复制输入,而不提供可能的其他集合成员的信息。我考虑过将40项集的所有变体作为输入,以40项集作为输出,但这将导致每个输入的2^{40}可能性很大。
在这种情况下,是否有某种机器学习方法或数据结构可以提供帮助?
发布于 2020-02-06 14:17:07
你可以训练一个嵌入模型。每个元素都将投影到一个位置,一个向量空间,基于它与其他元素的共生关系。然后,找出相似的元素可以用最近的邻居搜索。
发布于 2020-02-06 16:24:47
也许这有点过分,偏向于我自己的领域(神经机器翻译),但您可以使用带有自我注意的神经网络体系结构,使用蒙面语言模型ish(即伯特)配置。
网络的输入将是一个固定大小(40)的离散符号序列,这意味着该位置上的元素是否存在于集合(P)中,不存在于其中(A),还是其存在未知(U)。然后输入标记的“词汇表”将是{P, A, U}。这样,输入将是由40个符号组成的序列,例如A, A, P, U, U,..., P。
输入将被输入到一个嵌入层,然后是N层的未隐藏的自我注意。
最后,将最后的注意层输出投影到大小为40的表示空间中,然后应用乙状结肠函数来获得集合中的每一个元素成为原始输入的一部分的概率。
损失函数将仅在输入标记为未知(U)并在其他地方被忽略的元素上计算。如果元素实际存在,则这些位置的预期输出将为1,否则为0。你可以用二元交叉熵作为损失函数来优化。
您应该准备您的培训数据,以便将原始集中的未知(U)元素标记为未知元素,并在测试数据中使用您期望的未知元素比率。
在推断时,您只需将已知的信息设置为P或A,并将未知元素设置为U,并在这些位置获取网络的输出。
发布于 2020-02-15 18:54:45
你可以采用一种纯粹基于计数的方法,通常称为最大似然估计(MLE).
仔细看一看,数一数共发生的频率。然后找出最常见的项目。
下面是Python中一个直接(但不是非常优化)的解决方案:
from collections import defaultdict
from itertools import permutations
sets = [{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {3, 4, 5}]
counts = defaultdict(lambda: defaultdict(int))
# Create the frequency count of co-occurance of pairs
for s in sets:
perms = permutations(s, 2)
for p in perms:
counts[p[0]][p[1]] += 1
# For a given element, order by co-occurance frequency
key = 3
counts_ordered = dict(sorted(counts[key].items(),
key=lambda x: x[1],
reverse=True))
# Find probability
denominator = sum(counts_ordered.values())
print(f"For element {key}:")
for k,v in counts_ordered.items():
print(f"The probability of {k} co-occuring is {v/denominator:.3}.")
print("All other probabilities are zero.")对于元素3: ,4次重复发生的概率为0.333,5次发生的概率为0.333,堆栈-纽线的概率为0.337,1次发生的概率为0.167,2次发生的概率为0.167,堆栈-纽线的概率为零。
https://datascience.stackexchange.com/questions/67641
复制相似问题