k近邻法:R实现(一)

转载于:机器学习算法的R语言实现(一):KNN

KNN是有监督的学习算法,其特点有:

1、精度高,对异常值不敏感

2、只能处理数值型属性

3、计算复杂度高(如已知分类的样本数为n,那么对每个未知分类点要计算n个距离)

 

KNN算法步骤:

需对所有样本点(已知分类+未知分类)进行归一化处理。

然后,对未知分类的数据集中的每个样本点依次执行以下操作:

1、计算已知类别数据集中的点与当前点(未知分类)的距离。

2、按照距离递增排序

3、选取与当前距离最小的k个点

4、确定前k个点所在类别的出现频率

5、返回前k个点出现频率最高的类别作为当前点的预测类别

 

<span style="font-family:Times New Roman;font-size:14px;"># 选择iris数据集为例,iris共有150条数据
#先大致看一下数据
head(iris)
#对iris进行归一化处理,scale归一化的公式为(x-mean(x))/sqrt(var(x))
iris_s <- data.frame(scale(iris[, 1:4]))
iris_s <- cbind(iris_s, iris[, 5])
names(iris_s)[5] = "Species"
#随机选出100条记录作为已知分类的样本集
sample_list <- sample(1:150, size = 100)
iris_know <- iris_s[sample_list, ]
#剩余的50条记录作为未知分类的样本
iris_unknow <- iris_s[-sample_list, ]
#对测试集中的每一个样本,计算其与已知样本的距离,因为已经归一化,此处直接使用欧氏距离
length_know <- nrow(iris_know)
length_unknow <- nrow(iris_unknow)
for (i in 1:length_unknow){
    dis_know <- data.frame(dis = rep(0, length_know))
    for (j in 1:length_know){
        #计算已知点和未知点的距离
        dis_know[j, 1] <- dist(rbind(iris_unknow[i, 1:4], iris_know[j, 1:4]), method = "euclidean")
        names(dis_know)[1] = "dis"
        # 保存已知样本分类
        dis_know[j, 2] <- iris_know[j, 5]
        names(dis_know)[2] = "Species"
    }
    #按距离从小到大排序
    dis_know <- dis_know[order(dis_know$dis), ]
    #定义K的大小
    k <-5
    #按因子(也就是分类)进行排序
    type_freq <- as.data.frame(table(dis_know[1:k, ]$Species))
    #按计数值进行排序
    type_freq <- type_freq[order(-type_freq$Freq), ]
    # 记录频数最大的类型
    iris_unknow[i, 6] <- type_freq[1,1]
    names(iris_unknow)[6] = "Species.pre"
}

#输出分类结果
iris_unknow[, 5:6]
</span>


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值