【问题标题】:How to train a model for XOR using scikit-learn?如何使用 scikit-learn 训练 XOR 模型?
【发布时间】:2021-01-30 10:34:44
【问题描述】:

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

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]

【问题讨论】:

  • 你的y不应该是[0, 1, 0]吗?
  • 是的。对不起。多次使用代码。但问题仍然存在。

标签: python machine-learning scikit-learn mlp


【解决方案1】:

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

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

例如,在二维空间中,一个超平面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]

因此,以下经过训练的分类器将按照您的意愿predicts; ([1, 0][1])。

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

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

【讨论】:

  • 哇!谢谢!有用!尽管据我所知,它仅适用于这种特定情况。但是,是的,谢谢!我学到了一些东西。我刚开始学习机器学习!
  • @haalcala 好兄弟。也检查Non-Linear SVM and Kernel Function
  • 对于不同的场景,你应该对数据做出假设,然后你可以设计你的自定义内核。
猜你喜欢
  • 2014-10-13
  • 2019-09-09
  • 2015-10-14
  • 2022-01-05
  • 1970-01-01
  • 2016-01-19
  • 2019-09-30
  • 2014-09-17
相关资源
最近更新 更多