Задание 2

Классификация методом 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 |            | 
## -------------|------------|------------|------------|------------|
## 
## 

Комментарий: Диагональные элементы таблицы соответствуют правильно классифицированным наблюдениям. Соотношение между ними и общим числом наблюдений даёт оценку точности.


Задание 3

Метод опорных векторов (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 помогает избежать переобучения и объективно оценить модель.


Задание 4

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 помогает увидеть, какие переменные наиболее влияют на вариацию в данных. Объекты одного класса (например, вид ириса) будут группироваться в пространстве главных компонент.