我试图用我自己的模型复制this SKLearn示例代码中的情节。我不太了解以下几行的内容,以及如何将它们修改为我自己的模型:
# plot the line, the samples, and the nearest vectors to the plane
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) #this line created a runtime error with my own input
Z = Z.reshape(xx.shape)
meshgrid做了什么(我已经检查过官方描述,但我无法理解它 - 你能用外行人的条款来解释)吗?好的,它会创建一个坐标矩阵,但为什么我们需要呢?我如何为自己的数据设置它?如果我只更改此代码中的输入,则会与IndexError: list index out of range
(上面标记的行)崩溃。
答案 0 :(得分:0)
在代码段中,X
和Y
变量可以取-5到5之间的任何值。此范围分为50个步骤,因此您需要在50x50中评估clf.decision_function
获取Z
的网格。您希望Z[0][0] = clf.decision_function(-5, -5)
,Z[-1][-1] = clf.decision_function(5, 5)
等np.meshgrid
生成可帮助您实现这一目标的数组。您需要的是拥有每一对X
和Y
值。 xx
是一个数组,其行数与Y
值一样多,列数与X
一样多,每行只是X
的可能值列表。相反,yy
具有相同的维度,但此处每列都是可能的Y
值列表。如下所示:
xx:
[[ 0, ..., 50 ],
[ 0, ..., 50 ],
...,
[ 0, ..., 50 ]]
yy:
[[ 0, 0, ..., 0 ],
...,
[ 50, 50, ..., 50 ]]
如果您仔细观察,那么从xx
和yy
获取每对相应的值都不会为您提供X
和Y
值的所有可能组合。因此,clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
会使用两列矩阵评估clf.decision_function
,其中每一行都是X
和Y
值的不同组合。
最后,将Z
重塑为xx
的形状(请记住,这与yy
形状相同,<number of Y values> × <number of X values>
将为您提供一个矩阵Z[i][j] = clf.decision_function(<X j-th value>, <Y i-th value>)
1}}。不,我没有弄错,Z
的第一个维度引用Y
值索引,第二个维度引用X
值索引。这是因为np.meshgrid
模拟MATLAB's meshgrid
的行为,其基本原理是此函数经常用于绘制2D函数,其中X
应该是水平轴而{{1}垂直轴,但是当绘制矩阵时,我们也期望看到水平维度中的行和垂直维度中的列,因此在某个点交换轴变得必要。{{3} }还支持Y
可选参数,可以将其设置为indexing
以使'ij'
保留在第一维中,X
保留在第二维中,类似于np.meshgrid
。