2016-06-09 2 views
0

Я работаю над системой классификации k-Nearest Neighbors и использует систему голосования «ведро», которая отображает предсказанные классы, а затем возвращает прогноз, основанный на том, какой класс получил наибольшее количество голосов в выборке.Выделите только правильный класс другого цвета в R-гистограмме

Моя проблема заключается в том, что я хочу автоматически генерировать гистограммы с синими полосками для неверных прогнозов и красную полосу для правильно предсказанного класса. Вот фрагмент кода:

for (class in 14:15) { 
    class_test_index <- which(walkTest_labels == class) 
    class_test <- as.numeric(walkTest_pred[class_test_index]) 
    hist(class_test, 
      breaks = 0:22, 
      col = ifelse(class_test == class, "red", "blue"), 
      border = "green", 
      main = "Distribution by Classes", 
      ylab = "Count", 
      xlab = "Class") 
     } 

Я только что использовал два класса в моем цикле, чтобы проиллюстрировать. Ссылки на две приведенные ниже гистограммы.

http://i.stack.imgur.com/VXger.png

http://i.stack.imgur.com/ChAE7.png

В обоих только один бар, самый большой один, должен быть красным. В одном из них правильный бар красный, но есть еще один бар, который также краснеет. На другой гистограмме снова появляются два бара, которые красны, но оба они ошибаются.

+0

См. [Здесь] (http://stackoverflow.com/q/21858394/324364) для некоторых общих указаний относительно потенциально лучшего способа использования 'hist' для такого рода вещей. Тем не менее, штриховой график, вероятно, будет более простым и более разумным с учетом дискретности ваших данных. – joran

+0

Можете ли вы предоставить пару строк фреймов данных, которые вы используете для генерации гистограмм? – Nate

+0

Привет, Натан, спасибо, что спросил. Вот простой пример того, что используется для создания гистограммы. '> head (class_test) [1] 16 5 5 3 15 15' Как вы можете видеть, это всего лишь вектор классификаций. Они варьируются от 1 до 22. –

ответ

0

Хорошо, я нашел ответ на свой вопрос. Спасибо Nathan Day за то, что я предложил использовать функцию barplot(), так как я решил эту проблему.

Что я сделал, это создать вектор, содержащий все мои классы (список целых чисел от 1 до 22). Затем в цикле for я создал еще один вектор, который был создан путем сравнения каждого из этих чисел с тестируемым значением класса - если значение не соответствует ему, оно создает значение «синего» в векторе и, если оно правильно создает «красный».

При создании барплота этот вектор используется как параметр цвета, тем самым добавляя красный цвет в правильный класс и окрашивая все остальные классы в синий цвет. Вуаля!

Вот код:

class_list <- 1:22 

for (class in 14:15) { 
    class_test_index <- which(walkTest_labels == class) 
    class_test <- table(walkTest_pred[class_test_index]) 
    this_class <- ifelse(class_list == class, "red", "blue") 
    barplot(class_test, 
     col = this_class, 
     border = "green", 
     main = "Distribution by Classes", 
     ylab = "Count", 
     xlab = "Class") 
    } 

Если кто-то может думать о более элегантный способ, чтобы выполнить это, что также будет очень высоко ценится.