You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何固定k值时class::knn()与kknn::kknn()输出结果存在差异

问题解答

编码正确性判定

你的代码没有逻辑错误,训练集/测试集拆分、入模特征、k值、距离类型、无权重核的配置完全符合一致实验的对照要求。

结果差异的核心原因

  • 投票平局的处理规则不同
    class::knn()在k个邻居的类别投票数相等时,会从平局类别中随机选择一个作为预测结果,输出受全局随机种子影响;kknn::kknn()在平局时默认选择因子水平排序更靠前的类别,无随机逻辑,输出固定。
  • 距离并列时的截断规则不同
    kknn::kknn()默认启用use.all = TRUE参数:如果第k个和第k+1个(及更多)邻居到测试样本的距离完全相等,会将所有距离并列的邻居全部纳入投票池,实际参与投票的邻居数可能大于设置的k值。class::knn()只会严格取距离最近的前k个邻居,哪怕最后几位距离相等也不会扩容投票池。

对齐结果的调整方法

你可以修改kknn的调用参数缩小二者差异:

the_knn <- 
  kknn(
    Direction ~ Lag1 + Lag2, Smarket_train, Smarket_test, k = the_k,
    distance = 2, kernel = "rectangular", use.all = FALSE
  )

设置use.all = FALSE后,kknn会严格限制投票邻居数为k,此时二者仅在出现投票平局时会有结果差异,同时固定两次调用的全局随机种子即可让输出完全匹配。

内容的提问来源于stack exchange,提问作者itsMeInMiami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:06:00