如何解决如何使用 scikit-learn 训练 XOR 模型?
是否有一个神奇的参数序列可以让模型从它以前从未见过的数据中正确推断出来?
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,[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? 内核是一种从数据中提取所需特征的模型方法。
通常使用的内核可能无法满足您的要求。
我相信他们试图在包含[0,0]
和[1,1]
的一个超平面和另一个超平面之间找到'cut'超平面其中包含 [0,1]
。
例如,在二维空间中,一个超平面是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]
属于同一组
可能无法做出您预期的预测。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。