如何使用 scikit-learn 训练 XOR 模型?

How to train a model for XOR using scikit-learn?

是否有一个神奇的参数序列可以让模型从以前从未见过的数据中正确推断出来?

from sklearn.neural_network import MLPClassifier

clf = MLPClassifier(
                activation='logistic',
                max_iter=100,
                hidden_layer_sizes=(2,),
                solver='lbfgs')
X = [[ 0,  0],  # 2 samples, 3 features
     [0, 1],
#      [1, 0],
    [1, 1]]
y = [0, 
     1,
#      1,
     0]  # classes of each sample
clf.fit(X, y)

assert clf.predict([[0, 1]]) == [1]
assert clf.predict([[1, 0]]) == [1]

使用kernel怎么样? 内核是模型从数据中提取所需特征的一种方式。

一般使用的内核可能无法满足您的要求。 我相信他们试图在 一个超平面 之间找到 'cut' 超平面 ,其中包含 [0, 0][1, 1]另一个超平面 其中包含 [0, 1].

在二维space中,例如,一个超平面y = x另一个超平面y = x + 1。那么'cut'超平面可以是y = x + 1/2.

所以我建议使用以下内核。

def kernel(X1, X2):
    X1 = np.array([[(x[0] - x[1]) ** 2] for x in X1])
    X2 = np.array([[(x[0] - x[1]) ** 2] for x in X2])
    return np.dot(X1, X2.T)

这个内核做的就是这个。它对两个标量之间的差异进行平方; (x - y)2。 通过这种特征提取方式,数据将被特征化如下:

  • [0, 0][0]
  • [0, 1][1]
  • [1, 1][0]

还有看不见的数据:

  • [1, 0][1]

因此,下面经过训练的分类器将 predict 如您所愿; ([1, 0][1]).

clf = svm.SVC(kernel=kernel, max_iter=100)

模型选择在机器学习中非常重要。不知道 [0, 0][1, 1] 在同一组中的模型 [0, 1][1, 0] 在同一组中 可能无法做出您期望的预测。