i与Scikit-Learn最近的邻居/半径分类一起使用预定的度量。这意味着,我将n_samples_train x n_samples_train矩阵train矩阵传递给分类器的fit-method。
现在我想知道为什么必须这样做。使用KNN学习仅意味着"存储样本",但是距离的计算应在概括期间以后进行(在此步骤中,i当然计算我的训练样本和我的测试样本之间的距离矩阵,因此大小n_samples_train x n_samples_test的矩阵。
例如,在SVM的情况下,我将预先计算的矩阵(Gramian,A 相似性矩阵)传递给SMV.SVC-Object的拟合方法。然后进行优化的东西,找到了支撑向量等等。在那里,该矩阵在训练过程中绝对必要。
,但我看不出为什么需要在邻居/半径分类中进行拟合的预算矩阵。
有人可以给我一个相关的提示吗?
我很想跳过Scikit学习的KNN的培训矩阵的计算。
最好的问候,谢谢。: - )
这是旧的,但是我在搜索相关问题时碰巧找到了它。
本质上,这是一个表现问题。采用一个适合K邻居/半径分类器的情况,然后使用它来对多个不同的测试点进行分类。如果未预先计算内核矩阵,则每次您称为fit()时,必须计算内核矩阵。实现这些分类器的方式可以利用您使用正(半)确定功能的事实,并可以使用它来加快使用KD-Tree或Ball树的最接近邻居/半径搜索新点它构建了一个结构,该结构将界限放在每个子树外部的距离上。可以在n样品和k邻居的IIRC O(k*log(n))时间(至少在球树上)进行这种结构的构造。因此,通过提前做一些工作,可以大大加速新点的分类。
要使用实用的解决方案回答您的问题,如果您想使用自定义指标,则无需传递预定的距离矩阵。如果您以公制为准,则距离矩阵仍将预先计算到一个度量 - 但是它将在拟合过程中透明地发生,实际上应该比您在所有样本对之间的距离进行野蛮的力量更有效您自己(NB,如果您的输入稀疏,分类器仍将使用蛮力。它仍然会使用多个内核,因此可能比他自己做得更好,但是它的行为会有所不同。)
)总而言之:您绝对正确的是,预先计算的距离矩阵对于安装了一般K最近的邻居分类器并不是必需的。但是,通过预先计算它 - 是这样做还是通过可叫 - 随后的分类要高得多。Sklearn显然是选择预先计算自定义指标的选择 - 可能是因为使用Python函数n*(n-1)/2次的开销比使用使用高度优化的内置指标的路线要慢得多完全实施在Cython。但是,您不需要在安装之前将其计算为明确的步骤。