R语言 K-NN分类器

R语言 K-NN分类器

K-近邻或K-NN是一种监督的非线性分类算法。K-NN是一种非参数算法,即它不对基础数据或其分布做任何假设。它是一种最简单和广泛使用的算法,取决于它的K值(邻居),并在许多行业如金融业、医疗保健业等发现其应用。

理论

在KNN算法中,K指定了邻居的数量,其算法如下。

  • 选择邻居的数量K。
  • 根据距离选择未知数据点的K个最近的邻居。
  • 在这K个邻居中,计算每个类别中的数据点的数量。
  • 将新的数据点分配到你所计算的邻居最多的类别中。

对于最近的邻居分类器,两点之间的距离以 欧氏距离 的形式表示。

例子:

考虑一个包含红色和蓝色两个特征的数据集,我们对它们进行分类。这里K是5,即我们根据欧氏距离考虑5个邻居。

R编程中的K-NN分类器

因此,当一个新的数据点进入时,在5个邻居中,3个是蓝色,2个是红色。我们将新的数据点分配给拥有最多邻居的类别,即蓝色。

数据集

鸢尾花 数据集由3种鸢尾花(Iris setosa, Iris virginica, Iris versicolor)各50个样本组成,是英国统计学家和生物学家Ronald Fisher在其1936年的论文《分类学问题中多重测量的使用》中介绍的多变量数据集。从每个样本中测量了四个特征,即萼片和花瓣的长度和宽度,根据这四个特征的组合,Fisher开发了一个线性判别模型来区分物种。

# Loading data
data(iris)
   
# Structure 
str(iris)
R

在数据集上执行K近邻算法

在包括11个人和6个变量或属性的数据集上使用K-Nearest Neighbor算法。

# Installing Packages
install.packages("e1071")
install.packages("caTools")
install.packages("class")
  
# Loading package
library(e1071)
library(caTools)
library(class)
  
# Loading data
data(iris)
head(iris)
  
# Splitting data into train
# and test data
split <- sample.split(iris, SplitRatio = 0.7)
train_cl <- subset(iris, split == "TRUE")
test_cl <- subset(iris, split == "FALSE")
  
# Feature Scaling
train_scale <- scale(train_cl[, 1:4])
test_scale <- scale(test_cl[, 1:4])
  
# Fitting KNN Model 
# to training dataset
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 1)
classifier_knn
  
# Confusiin Matrix
cm <- table(test_clSpecies, classifier_knn)
cm
  
# Model Evaluation - Choosing K
# Calculate out of Sample error
misClassError <- mean(classifier_knn != test_clSpecies)
print(paste('Accuracy =', 1-misClassError))
  
# K = 3
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 3)
misClassError <- mean(classifier_knn != test_clSpecies)
print(paste('Accuracy =', 1-misClassError))
  
# K = 5
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 5)
misClassError <- mean(classifier_knn != test_clSpecies)
print(paste('Accuracy =', 1-misClassError))
  
# K = 7
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 7)
misClassError <- mean(classifier_knn != test_clSpecies)
print(paste('Accuracy =', 1-misClassError))
  
# K = 15
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 15)
misClassError <- mean(classifier_knn != test_clSpecies)
print(paste('Accuracy =', 1-misClassError))
  
# K = 19
classifier_knn <- knn(train = train_scale,
                      test = test_scale,
                      cl = train_clSpecies,
                      k = 19)
misClassError <- mean(classifier_knn != test_cl$Species)
print(paste('Accuracy =', 1-misClassError))
R

输出

  • 模型分类器_knn(k=1)。

R编程中的K-NN分类器

用训练、测试和k值拟合KNN模型。同时,分类器物种特征也被装入模型。

  • 混淆矩阵。

R编程中的K-NN分类器

因此,20个Setosa被正确归类为Setosa。在20个Versicolor中,17个Versicolor被正确归类为Versicolor,3个被归类为virginica。在20个Virginica中,17个Virginica被正确分类为Virginica,3个被分类为Versicolor。

  • 模型评估:

    (k=1)

    R编程中的K-NN分类器

在k为1的情况下,该模型达到90%的准确率。

(K=3)

R编程中的K-NN分类器

当k为3时,该模型达到了88.33%的准确率,低于k为1时的准确率。

(K=5)

R编程中的K-NN分类器

在k为5的情况下,该模型达到了91.66%的准确率,比k为1和3的情况下要高。

(K=7)

R编程中的K-NN分类器

该模型在k为7时达到了93.33%的准确率,这比k为1、3和5时的准确率要高。

(K=15)

R编程中的K-NN分类器

该模型在k为15时达到了95%的准确率,比k为1、3、5和7时要高。

(K=19)

R编程中的K-NN分类器

该模型在k为19时达到了95%的准确率,这比k为1、3、5和7时的准确率要高。当k为15时,其准确率相同,这意味着现在增加k值并不影响准确率。

因此,K最近的邻居在行业中被广泛使用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册