前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聚类(三):KNN算法(R语言)

聚类(三):KNN算法(R语言)

作者头像
三猫
发布2018-04-10 11:41:31
3K0
发布2018-04-10 11:41:31
举报

k最临近(KNN)算法是最简单的分类算法之一,属于有监督的机器学习算法。

  • 算法流程

KNN的核心思想是:找出特征空间中距离待分类点最近的k个点,如果这k个点大多数属于某一个类别,则该样本也属于这个类别。

k值一般取20以下的整数。下图为从网上截取的图片,可以直观看到与点x最临近的5个点里,有4个为红色圆点,因此将点x的类别判断为红色圆点一类。

  • R语言实现

在R中实现knn聚类,可以使用class包中点knn()函数。在下面的例子中,我们使用UCI的[乳腺癌特征数据集]进行演示。首先,读入网上的数据:

#读取网上的数据并设置变量名 url <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data' wdbc.data <- read.csv(url,header = F) names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean', 'area_mean','smoothness_mean','compactness_mean','concavity_mean', 'concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concavepoints_max_mean','symmetry_max_mean','fractal dimension_max_mean')

因为有的变量取值大,有的变量取值小,所以我们在使用knn进行分类前,要先对数据通过归一化来进行无量纲处理。

#编写归一化函数 normalize <- function(x) { return ((x-min(x))/(max(x)-min(x))) } #对数据进行归一化 wdbc.data.min_max <- as.data.frame(lapply(wdbc.data[3:length(wdbc.data)],normalize)) wdbc.data.min_max$Diagnosis <- wdbc.data$Diagnosis

区分训练集和测试集,并纪录相应的分类标签。

m<-(dim(wdbc.data.min_max))[1] val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m)) data.train<-wdbc.data.min_max[-val,] data.test<-wdbc.data.min_max[val,] data.train.label<-data.train$Diagnosis data.test.label<-data.test$Diagnosis data.train<-wdbc.data.min_max[-val,- length(wdbc.data.min_max)] data.test<-wdbc.data.min_max[val,- length(wdbc.data.min_max)]

用knn算法进行分类,并用实际的分类标签与预测出的分类结果进行效果检测。

library(class) test.pre.labels <- knn(data.train,data.test,data.train.label,k=7) library(gmodels) CrossTable(x = data.test.label, y = test.pre.labels, prop.chisq = F)

检测结果为:

选取两个变量作为横纵坐标进行画图,观察实际类别与预测的分类结果。

plot(data.test$texture_mean,data.test$radius_mean,col=test.pre.labels,pch=as.integer(data.test.label))

颜色代表分类后得到的结果,形状代表真实的类别。从检测结果和图上都可以看出,分类结果基本与真实结果一致。

  • KNN优缺点

优点

(1)算法原理简单,无需估计参数和训练。

(2)适合稀有事件的分类问题。

缺点

(1)计算量太大,需要计算与每个点的距离。

(2)可解释性不强。

(3)样本不平衡时,k个最近的点中,大容量类别的点占据了大多数,但大容量类别不一定为待分类点的真实类别。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档