Я пытаюсь сделать K классификатор ближайшего соседа, чтобы идентифицировать объект на основе его значений оттенка цвета. У меня есть два CSV-файла, заполненные этими значениями цвета двух отдельных объектов, каждый из которых содержит около 100 образцов. Все они нормализованы и содержат 40 целых чисел, описывающих средний цвет этого объекта на строку. Я использую в качестве значения К 10.
Мой классификатор всегда возвращает метку «1», даже когда я использую его на тех же данных, которые я подготовил в качестве данных обучения. Когда я смотрю ближайшие точки, возвращаемые функцией find_nearest
Я всегда вижу одни и те же 10 точек: 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 независимо от входных данных. Кажется, что-то не так с входными данными или данными обучения, но когда я проверяю CvMat*
объекты для их содержимого они все, как они должны быть.
Кто-нибудь может увидеть, что я делаю неправильно в коде ниже? Обычно я использую API c ++, но мне было сложнее найти примеры для k ближайшего соседа. Я проверил примеры на OpenCV и это блог
int dataArray[amountCategories_][amountSamples_][dataBandWidth_];
//Fill dataArray with data from csv files here (tested this and looks fine)
CvMat* trainData = cvCreateMat(amountCategories_ * amountSamples_, dataBandWidth_, CV_32FC1);
CvMat* trainClasses = cvCreateMat(amountCategories_ * amountSamples_, 1, CV_32FC1);
for (int categories = 0; categories < 2; categories++) {
for (int samples = 0; samples < amountSamples_; samples++) {
trainClasses->data.fl[samples] = categories;
cout << samples << ": ";
for (int datas = 0; datas < dataBandWidth_; datas++) {
trainData->data.fl[samples * dataBandWidth_ + datas] = (float) dataArray[categories][samples][datas];
cout << trainData->data.fl[samples * dataBandWidth_ + datas] << ", ";
}
cout << " and is type " << trainClasses->data.fl[samples] << endl;
}
}
knn_.train(trainData, trainClasses);
Чтобы идентифицировать объект:
vector<int> lineColors;
//fill lineColors with integers of the hue value
CvMat *playerRow = cvCreateMat(1, 40, CV_32FC1);
CvMat* nearests = cvCreateMat(1, kValue_, CV_32FC1);
cout << "Input vals: ";
for (int c = 0; c < dataBandWidth_; c++) {
playerRow->data.fl[c] = (float) lineColors.at(c);
cout << playerRow->data.fl[c] << ", ";
}
cout << " " << endl;
float outcome = knn_.find_nearest(playerRow, kValue_, 0, 0, nearests, 0);
cout << "Type: " << outcome << endl;
Задача ещё не решена.
Других решений пока нет …