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)
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 #查看测试集预测结果
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最近邻算法在本次数据应用中并不理想。
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值取得过大会导致分类模糊。