我猜 LSTM 对序列建模很有用,但你会如何用它来建模“聚类”呢?意思是,输入是一个序列,输出是具有相似属性的标签(我有标签数据)。例如:
input: 1 2 1 1 2 1 2 5 6 5 4 5 1 1 2 1 1 2 1
output: 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1
问题是如何告诉模型学习差异而不是特定示例,因为新示例可能具有完全不同的值。我本可以教它预测 N*(N-1)/2 成对差异(相似不相似),但它不会学习动态。
我猜 LSTM 对序列建模很有用,但你会如何用它来建模“聚类”呢?意思是,输入是一个序列,输出是具有相似属性的标签(我有标签数据)。例如:
input: 1 2 1 1 2 1 2 5 6 5 4 5 1 1 2 1 1 2 1
output: 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1
问题是如何告诉模型学习差异而不是特定示例,因为新示例可能具有完全不同的值。我本可以教它预测 N*(N-1)/2 成对差异(相似不相似),但它不会学习动态。
通过忽略顺序,可以将问题重新构建为二进制分类,然后决策树算法可以学习以完美的准确度分离组。
import numpy as np
from sklearn.tree import DecisionTreeClassifier
# Define training data
training_data = np.array([1, 2, 1, 1, 2, 1, 2, 5, 6, 5, 4, 5, 1, 1, 2, 1, 1, 2, 1]).reshape(-1, 1)
training_targets = np.array([1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1]).reshape(-1, 1)
# Train a descision tree with scikit-learn
clf = DecisionTreeClassifier(max_depth=1)
clf.fit(training_data, training_targets)
# Let's if the model can predict unseen data
test_data_low = np.array([0]).reshape(1, -1)
prediction = clf.predict(test_data_low)
assert prediction == 1
test_data_high = np.array([7]).reshape(1, -1)
prediction = clf.predict(test_data_high)
assert prediction == 2
可以通过增加正则化来提高模型学习泛化(即预测总新值)的能力。在上面的例子中,增加正则化的一种方法是限制决策树的深度。我已将深度设置为单个拆分,即决策树桩。决策树桩是决策树最正规的版本。