Провести разведочный анализ предоставленных данных. Изучить одномерные гистограммы и двумерные диаграммы рассеяния. Выяснить, одинаковы ли диапазоны значений признаков. Сделать выводы о степени различия условных по классу распределений плотности вероятности.
Нормализовать все входные признаки.
#Нормализуем данные, вычитая среднее значение, и разделив на стандартное отклонение.
for (i in 1:ncol(my_data[,-5]))
my_data[,i] = (my_data[,i] - mean(my_data[,i]))/sd(my_data[,i])
indexes = rbinom(nrow(my_data), 1, 0.1)
tr_set = my_data[which(indexes==1),]
val_set = my_data[which(indexes==0),]
euclid <- function(x1,x2) {sqrt(sum((x1-x2)^2))}
knn_estimate <- function(xt, k, query){
len = nrow(xt);
dist = vector(length=len);
for (i in 1:len)
dist[i]=euclid(xt[i,1:4],query);
names(dist)=1:len; #Обозначаем каждое расстояние соответсвующим порядковым номером
nearbs = as.integer(names(sort(dist)[1:k])); #Получаем индексы K ближайших соседей
rt = table(xt[nearbs,5]); #rt == Result Table
names(rt[which(rt==max(rt))]);
}
#Пример работы функции
knn_estimate(tr_set,15, 1:4)
## [1] "Original"
get_error <- function(train, val, k){
len = nrow(val);
res_names = vector(length = len);
for (i in 1:len)
res_names[i] = knn_estimate(train, k, val[i,1:4]);
rt = table(val[,5]==res_names);
cat(c("Для",k,"ближайших соседей:"));
cat(c("Ошибочно классифицировано ",round(as.numeric(rt[1]/len),4)*100,"% данных."),sep="");
}
get_error(tr_set, val_set, 1)
## Для 1 ближайших соседей:Ошибочно классифицировано 17.55% данных.
get_error(tr_set, val_set, 3)
## Для 3 ближайших соседей:Ошибочно классифицировано 14.51% данных.
get_error(tr_set, val_set, 5)
## Для 5 ближайших соседей:Ошибочно классифицировано 13.72% данных.