我正在尝试使用Accord库实现的k-nearest-neighbor。 首先,我用了
double[][] inputs = new double[15000][];
int[] outputs = new int[15000];
for (int list_counter= 0; list_counter < training_set.Count; list_counter ++ ) {
outputs[list_counter] = (char.Parse(training_set[list_counter].letter));
double[] input = new double[16];
for(int i =0; i< 16; i++) {
input[i] = (double)training_set[list_counter].integers[i];
}
inputs[list_counter] = input;
}
var knn = new KNearestNeighbors(k: 4);
knn.NumberOfInputs = 16;
Console.WriteLine("Learning the algorithm");
knn.Learn(inputs, outputs);
这段代码教knn算法,我有一组15000整数,我首先将其转换为double并用作输入。然后我有一个15000组的1个字符串我首先转换为char来获取整数值,然后将它们分类为输出。
输入和输出的一些屏幕截图。
我还将输入数量设置为16以避免此类问题。 但是在这段代码上
for (int list_counter = 0; list_counter < validation_set.Count; list_counter++) {
double[] input = new double[16];
for (int i = 0; i < 16; i++) {
input[i] = (double)validation_set[list_counter].integers[i];
}
int answer = knn.Decide(input);
每当我尝试knn.decide时,我都会得到一个IndexOutOfRangeException。这看起来很奇怪,因为我使用完全相同的逻辑来插入输入(双[16]数组的数组[15000]
以下是程序崩溃
决定方法文档对我没有帮助,但我会留下链接:
knn decide documentation
knn documentation
答案 0 :(得分:1)
所以,这个特殊问题的答案很奇怪,我在knn算法的文档中找不到它。
问题是knn.Learn部分的输出必须从0开始并向上计数。将大写字符转换为int给了我至少65('A'),我改变了第一个代码
outputs[list_counter] = (char.Parse(training_set[list_counter].letter)) -65 ;
现在一切都像钟表一样!