# Загрузка пакетов
library(class)
library(gmodels)

# Загрузка и подготовка данных
data(iris)
set.seed(123)

# Нормализация данных (источник 1)
normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}
iris_norm <- as.data.frame(lapply(iris[1:4], normalize))

# Разделение на обучающую и тестовую выборки (источник 1)
ind <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7, 0.3))
train_data <- iris_norm[ind == 1, ]
test_data <- iris_norm[ind == 2, ]
train_labels <- iris[ind == 1, 5]
test_labels <- iris[ind == 2, 5]

# Построение модели KNN (k=3) (источник 1)
knn_pred <- knn(train = train_data, 
                test = test_data, 
                cl = train_labels, 
                k = 3)

# Оценка модели (источник 2)
CrossTable(x = test_labels, 
           y = knn_pred,
           prop.chisq = FALSE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  44 
## 
##  
##              | knn_pred 
##  test_labels |     setosa | versicolor |  virginica |  Row Total | 
## -------------|------------|------------|------------|------------|
##       setosa |         15 |          0 |          0 |         15 | 
##              |      1.000 |      0.000 |      0.000 |      0.341 | 
##              |      1.000 |      0.000 |      0.000 |            | 
##              |      0.341 |      0.000 |      0.000 |            | 
## -------------|------------|------------|------------|------------|
##   versicolor |          0 |         11 |          3 |         14 | 
##              |      0.000 |      0.786 |      0.214 |      0.318 | 
##              |      0.000 |      0.846 |      0.188 |            | 
##              |      0.000 |      0.250 |      0.068 |            | 
## -------------|------------|------------|------------|------------|
##    virginica |          0 |          2 |         13 |         15 | 
##              |      0.000 |      0.133 |      0.867 |      0.341 | 
##              |      0.000 |      0.154 |      0.812 |            | 
##              |      0.000 |      0.045 |      0.295 |            | 
## -------------|------------|------------|------------|------------|
## Column Total |         15 |         13 |         16 |         44 | 
##              |      0.341 |      0.295 |      0.364 |            | 
## -------------|------------|------------|------------|------------|
## 
## 
# Матрица ошибок и точность (источник 2)
cm <- table(Факт = test_labels, Прогноз = knn_pred)
accuracy <- sum(diag(cm)) / sum(cm)
print(paste("Точность (Diagonal mark):", round(accuracy, 3)))
## [1] "Точность (Diagonal mark): 0.886"
# Загрузка пакета (источник 3)
library(e1071)

# Линейный классификатор с перекрестной проверкой (источник 3, с. 172)
svm_model <- svm(Species ~ ., 
                 data = iris,
                 type = "C-classification",
                 kernel = "linear",
                 cross = 10)

# Результаты (источник 3)
print(paste("Средняя точность CV:", round(100 - svm_model$tot.accuracy, 2), "%"))
## [1] "Средняя точность CV: 4 %"
summary(svm_model)
## 
## Call:
## svm(formula = Species ~ ., data = iris, type = "C-classification", 
##     kernel = "linear", cross = 10)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  linear 
##        cost:  1 
## 
## Number of Support Vectors:  29
## 
##  ( 2 15 12 )
## 
## 
## Number of Classes:  3 
## 
## Levels: 
##  setosa versicolor virginica
## 
## 10-fold cross-validation on training data:
## 
## Total Accuracy: 96 
## Single Accuracies:
##  93.33333 93.33333 93.33333 100 100 93.33333 93.33333 100 93.33333 100
# Загрузка пакета (источник 3)
library(vegan)
## Загрузка требуемого пакета: permute
# Расчет PCA (источник 3, с. 49)
pca <- rda(iris[, 1:4], scale = TRUE)

# Ординационная диаграмма
plot(pca, 
     main = "PCA для данных Iris",
     type = "n",
     display = "sites")
points(pca, 
       col = as.integer(iris$Species), 
       pch = 16)
ordihull(pca, 
         groups = iris$Species, 
         col = 1:3, 
         lty = 2)
legend("topright", 
       legend = levels(iris$Species),
       col = 1:3, 
       pch = 16)

# Выводы (источник 3)
print("Доля объясненной дисперсии:")
## [1] "Доля объясненной дисперсии:"
summary(pca)$cont$importance[, 1:2]
##                             PC1       PC2
## Eigenvalue            2.9184978 0.9140305
## Proportion Explained  0.7296245 0.2285076
## Cumulative Proportion 0.7296245 0.9581321