如果有一个项目序列,我想分裂成多个片段。为了做到这一点,我想训练一个统计模型。
例如:
Fruit: Apple Banana Peach | Apple Banana | Apple Banana Peach | Banana
Segment: 1 1 1 | 2 2 | 3 3 3 | 4
在这个例子中,模型应该学习苹果总是启动一个新的片段和香蕉,如果它之前没有苹果。
我想到了以下方法:
也许你们中的某个人有类似的问题,可以分享他的经历。谢谢!
发布于 2020-05-12 18:30:18
是的,我也会使用某种递归神经网络。我不确定您必须对输入进行编码,因此我不建议使用seq2seq网络。你可能只需要做一个GRU (更快的LSTM),然后是一个密集的图层,根据先前的输入预测找到苹果的可能性。
您甚至可以使用来自seq2seq的解码器作为您的整个模型。
注意不要让模型变得太复杂,因为没有太多的特性。但是,当你让你的例子开始工作时,你也许可以根据用户也买了什么来预测用户会买什么,所以如果用户购买苹果,然后预测一个梨和香蕉,但是如果用户购买一个芒果,推荐一些更异国情调的东西。
研究愉快!
发布于 2020-05-11 09:28:52
如果只需要查看序列是否启动,则不需要复杂的方法。两次就够了。
但是,如果这些序列有n个开始,您仍然可以将它们存储在数组中,并更新它们的编号,并根据它们进行检查。
在找到简单的解决方案之前,不需要跳转到ML。
如果我遗漏了你问题的复杂性,请告诉我。
也许如果你不知道什么时候开始,那么聚类就会告诉你。
发布于 2020-05-11 12:46:12
您可能需要使用隐马尔可夫模型来预测分隔符的位置,因为LSTM的长期内存对于您的任务来说是不必要的。
! pip install pomegranate
from pomegranate import HiddenMarkovModel, DiscreteDistribution
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
seq = ['Apple', 'Banana', 'Peach', 'Apple', 'Banana', 'Apple', 'Banana', 'Peach', 'Banana']
target = list('100101001')
encoded_seq = le.fit_transform(seq)
model = HiddenMarkovModel.from_samples(
distribution=DiscreteDistribution,
n_components=2,
X=[encoded_seq],
labels=[['None-start'] + target],
state_names=['0', '1'],
algorithm='labeled'
)
test_seq = ['Apple', 'Banana', 'Apple', 'Banana', 'Banana']
model.predict(le.transform(test_seq))
# >>> [1, 0, 1, 0, 0]
石榴HMM 文档
https://stackoverflow.com/questions/61344175
复制相似问题