Классификация методом k-ближайших соседей (knn)
на наборе iris.
library(class)
library(gmodels)
# Функция нормализации
normalize <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
# Нормализуем числовые признаки
iris_norm <- as.data.frame(lapply(iris[1:4], normalize))
# Разделение выборки
set.seed(123)
idx <- sample(1:nrow(iris), size = 0.7 * nrow(iris))
train_data <- iris_norm[idx, ]
test_data <- iris_norm[-idx, ]
train_labels <- iris[idx, 5]
test_labels <- iris[-idx, 5]
# Построение модели knn
predicted <- knn(train = train_data, test = test_data, cl = train_labels, k = 3)
# Матрица ошибок и CrossTable
CrossTable(x = test_labels, y = predicted, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 45
##
##
## | predicted
## test_labels | setosa | versicolor | virginica | Row Total |
## -------------|------------|------------|------------|------------|
## setosa | 14 | 0 | 0 | 14 |
## | 1.000 | 0.000 | 0.000 | 0.311 |
## | 1.000 | 0.000 | 0.000 | |
## | 0.311 | 0.000 | 0.000 | |
## -------------|------------|------------|------------|------------|
## versicolor | 0 | 17 | 1 | 18 |
## | 0.000 | 0.944 | 0.056 | 0.400 |
## | 0.000 | 0.944 | 0.077 | |
## | 0.000 | 0.378 | 0.022 | |
## -------------|------------|------------|------------|------------|
## virginica | 0 | 1 | 12 | 13 |
## | 0.000 | 0.077 | 0.923 | 0.289 |
## | 0.000 | 0.056 | 0.923 | |
## | 0.000 | 0.022 | 0.267 | |
## -------------|------------|------------|------------|------------|
## Column Total | 14 | 18 | 13 | 45 |
## | 0.311 | 0.400 | 0.289 | |
## -------------|------------|------------|------------|------------|
##
##
Комментарий: Диагональные элементы таблицы соответствуют правильно классифицированным наблюдениям. Соотношение между ними и общим числом наблюдений даёт оценку точности.
Метод опорных векторов (svm) с перекрёстной
проверкой.
library(e1071)
# Разделение выборки
set.seed(123)
idx <- sample(1:nrow(iris), size = 0.7 * nrow(iris))
train <- iris[idx, ]
test <- iris[-idx, ]
# Обучение SVM модели с кросс-валидацией (10 фолдов)
model_svm <- svm(Species ~ ., data = train, kernel = "linear", cross = 10)
summary(model_svm)
##
## Call:
## svm(formula = Species ~ ., data = train, kernel = "linear", cross = 10)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
##
## Number of Support Vectors: 24
##
## ( 2 10 12 )
##
##
## Number of Classes: 3
##
## Levels:
## setosa versicolor virginica
##
## 10-fold cross-validation on training data:
##
## Total Accuracy: 95.2381
## Single Accuracies:
## 100 100 90 100 90 90.90909 100 100 90 90.90909
# Предсказание и оценка
svm_pred <- predict(model_svm, test)
table(Predicted = svm_pred, Actual = test$Species)
## Actual
## Predicted setosa versicolor virginica
## setosa 14 0 0
## versicolor 0 17 0
## virginica 0 1 13
Комментарий: Кросс-валидация с
cross = 10 помогает избежать переобучения и объективно
оценить модель.
PCA-анализ с использованием vegan::rda() и
построение ординационной диаграммы.
library(vegan)
## Загрузка требуемого пакета: permute
# Только числовые признаки
iris_pca <- iris[, 1:4]
# Метод главных компонент
pca_result <- rda(iris_pca)
# Визуализация PCA
biplot(pca_result, scaling = 2, main = "PCA ординационная диаграмма iris")
Вывод: PCA помогает увидеть, какие переменные наиболее влияют на вариацию в данных. Объекты одного класса (например, вид ириса) будут группироваться в пространстве главных компонент.