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
相关产品推荐
相关产品推荐

