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

Accord.NET KNN模型测试抛出Index was outside the bounds of the array错误求助

Accord.NET KNN算法「Index was outside the bounds of the array」错误排查

问题描述

使用Accord.NET框架的KNN算法构建模型后,测试阶段触发Index was outside the bounds of the array异常,错误发生在框架内部,现有公开解决方案无法直接定位根因。

最简复现代码

using Accord.MachineLearning;

double[][] inputs =
{
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 5 ,1},
    new double[] { 16, 2 ,0}, new double[] { 4, 15 ,1},
};

int[] outputs =
{
    0, 1, 0, 1, 0, 1,
    0, 1, 0, 1, 0, 1,
    0, 1, 0, 1, 0, 1,
    0, 1, 0, 1, 0, 9
};

var knn = new KNearestNeighbors(k: 15);
knn.Learn(inputs, outputs);

//test
var t = new double[] { 16, 2, 0 };
int answer = knn.Decide(t);

根因分析

Accord.NET框架的KNN实现中,默认使用类别标签直接作为投票数组的下标访问,要求类别标签必须是从0开始的连续整数。上述代码中输出标签包含跳号的9,框架内部初始化投票数组时长度仅为2(对应0、1两个连续标签),当投票过程中遇到标签为9的样本时,尝试访问下标9就会触发数组越界。

解决方案

  • 优先方案:对输出标签做连续编码,将非连续的标签映射为从0开始的连续整数。比如上述代码中将标签9映射为2,修改后的outputs数组最后一位改为2即可正常运行。
  • 临时兼容方案:在初始化KNearestNeighbors时显式指定classes参数为最大标签值+1,例如上述代码中最大标签为9,构造函数改为new KNearestNeighbors(k: 15, classes: 10)。该方案会造成投票数组空间浪费,仅建议临时测试使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:57:04