有人可以解释这一行: Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])

Can someone explain this line: Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])

我一直在调整 this example 以使用 20 个功能,而不是 2 个。我已经完成了大部分工作,但它在这一行给我一个错误:

Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])

predict_proba 的 documentation 只是讨论 x 的输入,而不是 x 和 y,此外我们还有 ravel() 在这里进行。所以想知道发生了什么事?我遇到的错误发生在它尝试进行连接时:

338         res = _nx.concatenate(tuple(objs), axis=self.axis)
    339         return self._retval(res)
    340 

ValueError: all the input array dimensions except for the concatenation axis must match exactly

但我已经检查过我的 xx(测试输入)和 yy(测试标签)中的行数相同。

这个例子似乎工作正常。

关键是这一行:y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

说明这里的yy并不是你想象的和label有关,而是二次元。因此,连接代码只是简单地创建一个包含所有特征的网格,然后将其输入模型以形成预测。

更详细:

您可以逐行查看代码,看看会发生什么。

之前

Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])

如果将 np.c_[xx.ravel(), yy.ravel()] 存储在名称为 vrb

的变量中
vrb = np.c_[xx.ravel(), yy.ravel()]

那你就可以看看是什么了

vrb.shape
vrb

结果:

(61600L, 2L)

array([[ 3.3 ,  1.  ],
       [ 3.32,  1.  ],
       [ 3.34,  1.  ],
        ...,
       [ 8.84,  5.38],
       [ 8.86,  5.38],
       [ 8.88,  5.38]])

这意味着 np.c_[xx.ravel(), yy.ravel()] 的结果是一个包含 61600 行(样本)和 2 个特征(列)的数组。

使用 clf.predict_proba(vrb) 预测这些样本的标签。

矩阵 "vrb" 必须与您用于分类器拟合(训练阶段)的矩阵具有相同的 "second dimension"(列数)。

要测试此用途:

X.shape

结果是:

(150L, 2L)

你可以清楚地看到训练数据(X)有2列(特征)。

如果您上传代码和数据,我可以提供更多帮助。