博客
关于我
KNN —— 基本介绍与简要实现
阅读量:347 次
发布时间:2019-03-04

本文共 1345 字,大约阅读时间需要 4 分钟。

KNN

介绍

knn又叫做k最近邻,也是一个分类的算法,其基本思想如下:

我们预测一个样本属于哪一类,就看在一定范围内,它离那个类别最近。

K代表你指定的范围,比如你指定K为7,就是说在离测试数据最近的7个样本中,哪个类别占得多,那我们就把测试数据分到那一类。

一般来说如果是二分类的话,K都会取奇数,免得出现一样的情况。

步骤

  1. 计算测试点到所有样本点的距离
  2. 对距离进行从小到大排序
  3. 取前K个最近的距离,找到对应的类别
  4. 那个类别最多就把测试点归到哪一类

实现

sklearn中自带了一些数据集,这里以鸢尾花为例;

数据包括四个特征: 花萼长度、花萼宽度、花瓣长度、花瓣宽度 ;

类别有三个:山鸢尾花、变色鸢尾花、维吉尼亚鸢尾花。用0、1、2表示;

K取5。

import numpy as npfrom sklearn import datasetsfrom sklearn.model_selection._split import train_test_splitfrom sklearn.metrics import classification_reportdef knn(x_test,x_train,y_train,k):    x_data_size = x_train.shape[0]        # 求距离    diffMat = np.tile(x_test,(x_data_size,1))-x_train    dis = (diffMat**2).sum(axis=1)    dis = dis**0.5        # 排序,argsort排序存的是索引,不是值    sortedDis = np.argsort(dis)        # 统计前k个最近点的标签    classCount = {   }    for i in range(k):        label = y_train[sortedDis[i]]        classCount[label] = classCount.get(label, 0)+1    sortedClassCount = sorted(classCount.items(), key=lambda item:item[1], reverse=True)    return sortedClassCount[0][0]# 导入sklearn自带的鸢尾花数据集iris = datasets.load_iris()# 切分测试机,训练集x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2)# knn环节predictions = []for i in range(x_test.shape[0]):    predictions.append(knn(x_test[i], x_train, y_train, 5))# 计算指标print(classification_report(y_test,predictions))

以上例子计算得出的正确率、召回率和F1如下图所示:

knn

转载地址:http://hehe.baihongyu.com/

你可能感兴趣的文章
Mysql进阶索引篇03——2个新特性,11+7条设计原则教你创建索引
查看>>
mysql远程连接设置
查看>>
MySql连接出现1251Client does not support authentication protocol requested by server解决方法
查看>>
Mysql连接时报时区错误
查看>>
MySql连接时提示:unknown Mysql server host
查看>>
MySQL连环炮,你扛得住嘛?
查看>>
mysql逗号分隔的字符串如何搜索
查看>>
MySQL通用优化手册
查看>>
Mysql通过data文件恢复
查看>>
MYSQL遇到Deadlock found when trying to get lock,解决方案
查看>>
MYSQL遇到Deadlock found when trying to get lock,解决方案
查看>>
mysql部署错误
查看>>
MySQL配置信息解读(my.cnf)
查看>>
Mysql配置文件my.ini详解
查看>>
MySQL配置文件深度解析:10个关键参数及优化技巧---强烈要求的福利来咯。
查看>>
Mysql配置表名忽略大小写(SpringBoot连接表时提示不存在,实际是存在的)
查看>>
mysql配置读写分离并在若依框架使用读写分离
查看>>
MySQL里为什么会建议不要使用SELECT *?
查看>>
MySQL里的那些日志们
查看>>
mysql重新安装?忘记root密码?重装Windows、Linux系统导致mysql没法用吗? 这里有你想要的答案
查看>>