knn的r实现:使用r自带iris数据
数据的前期准备:
#iris即鸢尾花数据集,有5个属性,前4个是花瓣与花萼的长度,第5个属性是花的类别,有3个类别
names(iris)
summary(iris[,1:4])
class(iris$Species) #类别标签是因子类型,符合要求
iris_n<-as.data.frame(lapply(iris[1:4],scale)) #将数据除类别标签以外的各属性进行标准化
testindex<-sample(1:150,30) #抽取30个样本(总样本数的20%)的数据作为测试集
#因为iris数据集中属于3个类别的样本数相等,故不需分层抽样,简单随机抽样即可
iris_train<-iris_n[-testindex,]
iris_test<-iris_n[testindex,] #将数据划分为训练集和测试集
iris_train_label<-iris[-testindex,5]
iris_test_label<-iris[testindex,5]
#把类别标签保存为两个向量备用
使用class包中的knn进行分类:
library(class) #加载class包以使用knn分类
iris_test_pred<-knn(train=iris_train,test=iris_test,cl=iris_train_label,k=12)
#用knn函数进行分类,train和test分别接收无标签的训练集和测试集,cl接收训练集的标签,参数k设定为样本量的平方根约等于12
table(iris_test_label,iris_test_pred) #制作表格来观察分类结果
结果:
iris_test_pred | |||
---|---|---|---|
iris_test_label | setosa | versicolor | virginica |
setosa | 11 | 0 | 0 |
versicolor | 0 | 9 | 0 |
virginica | 0 | 0 | 10 |