KNN算法是k-Nearest Neighbor Classification的简称,也就是k近邻分类算法。基本思路是在特征空间中查找k个最相似或者距离最近的样本,然后根据k个最相似的样本对未知样本进行分类。基本步骤为:

(1)计算已知样本空间中所有点与未知样本的距离;

(2)对所有距离按升序排列;

(3)确定并选取与未知样本距离最小的k个样本或点;

(4)统计选取的k个点所属类别的出现频率;

(5)把出现频率最高的类别作为预测结果,即未知样本所属类别。

下面的代码模拟了上面的算法思路和步骤,以身高+体重对肥胖程度进行分类为例,采用欧几里得距离。

from collections import Counter
import numpy as np

# 已知样本数据
# 每行数据分别为性别,身高,体重
knownData = ((1, 180, 85),
             (1, 180, 86),
             (1, 180, 90),
             (1, 180, 100),
 
             (1, 185, 120),
             (1, 175, 80),
             (1, 175, 60),
             (1, 170, 60),

(1, 175, 90),
             (1, 175, 100),
             (1, 185, 90),
             (1, 185, 80))

knownTarget = ('稍胖', '稍胖', '稍胖', '过胖',
               '太胖', '正常', '偏瘦', '正常',
               '过胖', '太胖', '正常', '偏瘦')

def KNNPredict(current, knownData=knownData, knownTarget=knownTarget, k=3):
    # current为未知样本,格式为(性别,身高,体重)
    data = dict(zip(knownData, knownTarget))
    # 如果未知样本与某个已知样本精确匹配,直接返回结果
    if current in data.keys():
        return data[current]
   
    # 按性别过滤,只考虑current性别一样的样本数据
    g = lambda item:item[0][0]==current[0]
    samples = list(filter(g, data.items()))
    g = lambda item:((item[0][1]-current[1])**2+\
                     (item[0][2]-current[2])**2)**0.5
    distances = sorted(samples, key=g)
    # 选取距离最小的前k个
    distances = (item[1] for item in distances[:k])
    # 计算选取的k个样本所属类别的出现频率
    # 选择频率最高的类别作为结果
    return Counter(distances).most_common(1)[0][0]

unKnownData = [(1, 180, 70), (1, 160, 90), (1, 170, 85)]
for current in unKnownData:
    print(current, ':', KNNPredict(current))

运行结果为:

(1, 180, 70) : 偏瘦
(1, 160, 90) : 过胖
(1, 170, 85) : 正常

下面的代码使用扩展库sklearn中的k近邻分类算法处理了同样的问题:

# 使用sklearn库的k近邻分类模型
from sklearn.neighbors import KNeighborsClassifier

# 创建并训练模型
clf = KNeighborsClassifier(n_neighbors=3, weights='distance')
clf.fit(knownData, knownTarget)

# 分类
for current in unKnownData:
    print(current, end=' : ')
    current = np.array(current).reshape(1,-1)
    print(clf.predict(current)[0])

运行结果为:

(1, 180, 70) : 偏瘦
(1, 160, 90) : 过胖
(1, 170, 85) : 正常

---------相关阅读-----------

Python+sklearn使用线性回归算法预测儿童身高

使用线性回归拟合平面最佳直线及预测之Python+sklearn实现

----------喜大普奔----------

1、继《Python程序设计基础》(2017年9月第5次印刷)、《Python程序设计(第2版)》(2017年9月第4次印刷)、《Python可以这样学》(2017年7月第3次印刷)系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版,并于2017年9月进行了第2次印刷。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3
2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

KNN分类算法原理与Python+sklearn实现根据身高和体重对体型分类相关推荐

  1. python最佳身高_KNN分类算法原理与Python+sklearn实现根据身高和体重对体型分类

    KNN算法是k-Nearest Neighbor Classification的简称,也就是k近邻分类算法.基本思路是在特征空间中查找k个最相似或者距离最近的样本,然后根据k个最相似的样本对未知样本进 ...

  2. softmax分类算法原理(用python实现)

    逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 - 导入模块 import numpy as n ...

  3. 机器学习-KNN最近邻算法原理及实践

    一.KNN最近邻算法原理 1.KNN(k-nearest neighbor)最近邻算法是一种有监督学习(存在特征标签)能够解决分类与回归问题的方法,是一个理论上比较成熟的.也是最简单的机器学习算法之一 ...

  4. 【机器学习】总结了九种机器学习集成分类算法(原理+代码)

    大家好,我是云朵君! 导读: 本文是分类分析(基于Python实现五大常用分类算法(原理+代码))第二部分,继续沿用第一部分的数据.会总结性介绍集成分类算法原理及应用,模型调参数将不在本次讨论范围内. ...

  5. 总结了九种机器学习集成分类算法(原理+代码)

    公众号后台回复"图书",了解更多号主新书内容作者:云朵君来源: 数据STUDIO 导读: 本文是分类分析(基于Python实现五大常用分类算法(原理+代码))第二部分,继续沿用第一 ...

  6. python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现

    第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...

  7. 手把手教你EMD算法原理与Python实现(更新)

    Rose今天主要介绍一下EMD算法原理与Python实现.关于EMD算法之前介绍过<EMD算法之Hilbert-Huang Transform原理详解和案例分析>, SSVEP信号中含有自 ...

  8. 匈牙利算法原理与Python实现

    匈牙利算法原理与Python实现 今天学习一个新的算法-匈牙利算法,用于聚类结果分析,先用图表示我当前遇到的问题: 这两列值是我用不同算法得到的聚类结果,从肉眼可以看出第一列聚类为0的结果在第二列中对 ...

  9. Apriori 算法原理以及python实现详解

    Apriori 算法原理以及python实现 ​ Apriori算法是第一个关联规则挖掘算法,也是最经典的算法.它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与 ...

最新文章

  1. html制作顶部选项卡,html: 原生javascript实现选项卡
  2. linux下arp***的解决方案[转]
  3. 根据工作时间计算小组成员得分
  4. Redis中的主从复制原理
  5. Row size too large ( 8126)(解决)
  6. JavaOne 2012:使用HTML5和Java构建移动应用程序
  7. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
  8. 浙江工商大学计算机专业有博士点吗,[浙江工商大学]统计学(博士点)
  9. Python基础知识 D9
  10. iOS中 Bugly iOS 符号表手动配置详细教程 韩俊强的博客
  11. Python 基础——一张图告诉你PyCharm如何进行断点调试
  12. 吴恩达《机器学习》笔记
  13. idea工具(1):依赖包详解
  14. 批处理命令——bat文件创建和基本命令语法
  15. 4种方法设置Word文档保护
  16. 【Linux】使用grep命令查找文件内容
  17. php图片翻转,php识别翻转iphone拍摄的颠倒图片
  18. Unity 3D学习之雷霆战机(一)
  19. JpGrap引入以及中文乱码问题
  20. c语言中x=y=100合法吗,【单选题】已知:int x; int y[10]; 下列合法的选项是( )。 A. x B. (x+3) C. 5 D. y...

热门文章

  1. java lucence_Lucence使用入门
  2. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...
  3. linux下lsof命令,Linux lsof命令使用详解
  4. java 图像边界识别_图像识别原理之如何识别图像边缘
  5. python期末题目_Python期末复习题必考
  6. windows无法访问_注册CourseMaker之后无法登录,显示“网络无法访问……”,怎么办?...
  7. android加载富文本可点击链接,Android富文本解析器,支持网络图片,图片和链接点击事件...
  8. struts集成spring官方例子
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的电影院管理系统
  10. 基于JAVA+SpringBoot+Mybatis+MYSQL的销售团队管理系统