有一个带标签的数据集X,标签为y。我们想通过这个数据集预测目标点x0的所属类别。

K近邻算法是指在X的特征空间中,把x0放进去,然后找到距离x0最近的K个点。通过这K个点所属类别,一般根据少数服从多数的原则,这K个点哪个类别多,就将x0设为哪一类。

关键有三个部分:

1.距离度量:目标点与训练集中的点距离计算,一般采用欧式距离。也可以为其他距离

2.K值选择:K为超参数,所以可以通过交叉验证的方法原则K的值。K一般选比较小的值,假如K值取跟数据集一样大小,就相当于直接认定据集中哪个类的类别多,就认目标点为哪一类。所以肯定不合适。

3.分类决策规则:一般为多数表决,少数服从多数。

K近邻算法还有一个问题是,通过什么算法来选择 距离目标点x0最近的K个样本点。线性扫描最简单,计算数据集中每个样本点与X0的距离,然后对这些距离排序,选择最小的几个。但这样复杂度高。还有一种方法是构造kd树,这里不在说明如何构造k-d树,下面文章解释的很清楚。

完结篇|一文搞懂k近邻(k-NN)算法(二) - 忆臻的文章 - 知乎 https://zhuanlan.zhihu.com/p/26029567

代码中选择K个样本点是通过numpy的内置函数np.argpartition(a,kth)即返回前K小个树的位置坐标。

数据集采用鸢尾花数据集,地址在下面,将鸢尾花数据集标签改为0,1,2。

鸢尾花数据集

K原则4,正确率一般在95%以上

代码:

import numpy as np
from matplotlib import pyplot as plt
from random import shuffle
import csv
def data():
'''
加载数据,数据集为鸢尾花数据集120个训练集,30个测试集
:return:
'''
with open('iris.data')as f:
reader = csv.reader(f)
data_list =list(reader)
shuffle(data_list)
X_orign = np.array([(list(map(float,x[:4]))) for x in data_list])
y_orign = []
for x in data_list:
if x[4]=='Iris-setosa':
y_orign.append(0)
elif x[4]=='Iris-versicolor':
y_orign.append(1)
else:
y_orign.append(2)
y_orign = np.array(y_orign)
X_train = X_orign[:120]
y_train = y_orign[:120]
X_test = X_orign[120:]
y_test = y_orign[120:]
return X_train,y_train,X_test,y_test
def plot_data(X,y):
'''
绘制数据集
:param X:
:param y:
:return:
'''
plt.scatter(X[y==0,0],X[y==0,2],s=15,c='r',marker='o')
plt.scatter(X[y==1,0],X[y==1,2],s=15,c='b',marker='+')
plt.scatter(X[y==2,0],X[y==2,2],s=15,c='y',marker='*')
plt.show()
def knn(x,K,X,y):
'''
采用线性扫描,求得与目标点x在X中前K个最近的距离
:param x:
:param K:
:param X:
:param y:
:return:
'''
y = y[np.argpartition(np.sum((X-x)**2,axis=1),K)[:K]]#欧式距离,获得前K小个元素的索引位置
return np.argmax([sum(y==0),sum(y==1),sum(y==2)])#返回所属类别,少数服从多数 K = 5
X_train,y_train,X_test,y_test = data()
predict = np.array([knn(i,K,X_train,y_train) for i in X_test])#预测测试集每个元素所属的类别
print('正确率为:{}%'.format(sum(predict==y_test)/len(y_test)*100))#计算正确率

参考资料:李航,统计学习方法

K近邻python的更多相关文章

  1. K近邻 Python实现 机器学习实战(Machine Learning in Action)

    算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...

  2. kd树 求k近邻 python 代码

      之前两篇随笔介绍了kd树的原理,并用python实现了kd树的构建和搜索,具体可以参考 kd树的原理 python kd树 搜索 代码 kd树常与knn算法联系在一起,knn算法通常要搜索k近邻, ...

  3. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  4. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  5. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  6. 机器学习之路: python k近邻分类器 KNeighborsClassifier 鸢尾花分类预测

    使用python语言 学习k近邻分类器的api 欢迎来到我的git查看源代码: https://github.com/linyi0604/MachineLearning from sklearn.da ...

  7. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  8. 统计学习方法与Python实现(二)——k近邻法

    统计学习方法与Python实现(二)——k近邻法 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.定义 k近邻法假设给定一个训练数据集,其中的实例类别已定 ...

  9. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

随机推荐

  1. 74HC164dD驱动LED

    驱动要点: 1.上升沿写入串行数据: CLK=0; DAT=num&0x01; CLK=1; 2.写入数据的数码管编码(指代码中的 tab[]) 串行数据是FIFO先进先出,也就是先写高位,移 ...

  2. JVM系统性能监控总结

    (1) uptime 查看系统运行时间.连接数(终端连接数).平均负载 (2) top 查看CPU.内存.交换空间使用情况,可以看到当前系统性能进程消耗资源情况 (3) vmstat 统计系统CPU. ...

  3. 离线 + 位优化 - SGU 108 Self-numbers 2

    SGU 108 Self-numbers 2 Problem's Link Mean: 略有这样一种数字:对于任意正整数n,定义d(n)为n加上n的各个位上的数字(d是数字的意思,Kaprekar发明 ...

  4. e2fsprogs 移植

    e2fsprogs是用维护ext2,ext3和ext4文件系统的工具程序集.检测和修复文件系统,需要用到其中的fsck, ext2fs等工具, 由于开发板上没有,重新制作文件系统又比较麻烦.所以就需要 ...

  5. MyBatis学习4---使用MyBatis_Generator生成Dto、Dao、Mapping

    由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类.Dao接口类甚至Mappi ...

  6. 在堆栈中,push为入栈操作,pop为出栈操作

    LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...

  7. Android使用Intent实现拨打电话的动作

    使用Intent实现打电话的动作,我们须要在 AnroidMainfest.xml中增加通话权限,打开这个文件,在application节点的前面增加以下内容 <uses-permission ...

  8. 【Debian】ftp安装

    http://www.2cto.com/os/201107/98311.html http://jingyan.baidu.com/article/adc815133476bdf723bf7393.h ...

  9. 《C++ Primer Plus》第6章 学习笔记

    使用引导程序选择不同操作的语句后,程序和编程将更有趣.C++提供了if 语句 .if else 语 句 和 switch 语句来管理选项.if 语句使程序有条件地执行语句或语句块,也就是说,如果满足特 ...

  10. 《C++ Primer Plus》第5章 循环和关系表达式 学习笔记

    C++提供了3种循环: for 循环. while 循环 和 do while 循环 .如果循环测试条件为 true 或非零,则循环将重复执行一组指令: 如果测试条件为 false 或 0 , 则结束 ...