Я пишу код для дерева решений в C. Сейчас он дает мне правильный результат (ошибка обучения 0%, низкая тестовая ошибка), но требуется долгое время работать.Поддерживайте отсортированный массив, который может поддерживать отдельная итеративная функция.
Проблема заключается в том, как часто я запускаю qsort. Мой основной алгоритм таков:
for every feature
sort that feature column using qsort
remove duplicate feature values in that column
for every unique feature value
split
determine entropy given that split
save the best feature to split + split value
for every training_example
if training_example's value for best feature < best split value, store in Left[]
else store in Right[]
recursively call this function, using only the Left[] training examples
recursively call this function, using only the Right[] training examples
Поскольку последние две строки итерационные вызовы, и потому, что дерево может простираться на десятки и десятки филиалов, количество звонков в QSort огромен (особенно для моего набора данных, который имеет > 1000 функций).
Моя идея сократить время выполнения - создать массив 2d (в отдельной функции), где каждый столбец является отсортированным столбцом функций. Затем, пока я сохраняю вектор номеров строк примеров обучения в Left [] и Right [] для каждого рекурсивного вызова, я могу просто вызвать эту отдельную функцию, захватить строки, которые я хочу, в предварительно отсортированном вектор-функции, и сэкономить затраты на qsort каждый раз.
Я довольно новичок в C, и поэтому я не уверен, как это кодировать. В MatLab у меня может быть только глобальный массив, который любая функция может изменить или получить, ищет что-то подобное в C.
Вы можете использовать HashTable для ускорения поиска уникальных значений функций. –
И ваш вопрос? - Antway Я постараюсь ответить: Да, вы можете использовать глобальные переменные в C, хотя это не очень хорошая практика. Идея сортировки только один раз для каждой функции - это путь. Возможно, вы можете передать функции полный массив данных, бит (или bools) массив, указывающий, какие данные должны использоваться, а какие нет, и отсортированные индексы. Или, может быть, лучше создавать меньшие копии индексов без нежелательных данных. – comocomocomocomo