vlambda博客
学习文章列表

R语言如何实现K最近邻算法?

K最近邻算法是使用最广泛的距离判别分析方法。它的主要思路是:一个样本在特征空间中的K个最近邻的样本中,大多数样本属于哪一个类别,那么该样本就属于这个类别。对于类重叠较多的待分类数据集,K最近邻算法较其他方法更为合适。

R语言中实现K最近邻算法的是class软件包中的knn()函数。



1 读取数据集。

sz_data=read.csv("sz_data.csv",head=T,encoding="utf-8")

head(sz_data);dim(sz_data) #查看数据的前几行和数据维度

2  进行数据预处理。在实际应用中,如果数据有缺失值,需要先按照一定的方法先对缺失值进行处理。这里我们直接划分训练集和测试集,并且随机抽取70%的样本作为训练集。

n=0.7*nrow(sz_data) #作为训练集的样本量

sub_train=sample(nrow(sz_data),n)#随机抽取n个样本

data_train=sz_data[sub_train,-1]#训练集

data_test=sz_data[-sub_train,-1]#测试集

head(data_train);dim(data_train)

head(data_test);dim(data_test)

R语言如何实现K最近邻算法?

3  建立K最近邻算法。

knn()函数的基本形式为:

knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)

其中train、test分别是训练集和测试集的变量集,cl是训练集的分类变量。

代码如下:

library(class)#加载软件包

fit_pre_knn=knn(data_train[,-6],data_test[,-6],cl=data_train[,6])#建立K最近邻判别规则,模型训练和测试集预测同时进行

fit_pre_knn #查看测试集预测结果

R语言如何实现K最近邻算法?

4  查看模型的准确性。

table(data_test$is_rise,fit_pre_knn)#生成真实值与预测值的混淆矩阵

error_knn=sum(fit_pre_knn!=data_test$is_rise)/nrow(data_test);

error_knn#计算错误率

从结果中可以看到,K最近邻算法在本次数据应用中并不理想。

R语言如何实现K最近邻算法?

5  找到错误率最低的K值。

error_knn=rep(0,100) #设值初始值

#构造K最近邻判别规则并预测,预测结果存储在fit_pre_knn中

for (i in 1:100)

{fit_pre_knn=knn(data_train[,-6],data_test[,-6],cl=data_train[,6],k=i)

error_knn[i]=sum(fit_pre_knn!=data_test$is_rise)/nrow(data_test)}

#显示计算后的错误率的100个取值

error_knn

which.min(error_knn);error_knn[which.min(error_knn)]#找到错误率最小的K值

在实际应用中,K值取得过大会导致分类模糊。


R语言如何实现K最近邻算法?