KNN最近邻算法——原理和Python代码

2023-11-02

KNN最近邻算法是一种监督学习算法,基本思想是取距离测试数据最近的K个点,这K个点训练数据属于某一类型的数量多,则将该测试数据点也判断为该类。

图片例子
距离可以取:
1.欧氏距离:
欧氏距离
2.曼哈顿距离:
曼哈顿距离

算法:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在的类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

# -*- coding:utf-8 -*-
import math
import numpy as np
from matplotlib import pyplot
from matplotlib.patches import Ellipse, Circle
import matplotlib.pyplot as plt
from collections import Counter
import warnings

#k-Nearest Neighbor算法
# 训练数据data
# 测试数据predict
# 参数k
def k_nearest_neighbors(data, predict, k=5):
    print("k=%d"%k)
    if len(data) >= k:
        warnings.warn("k is too small")
    # 计算predict点到各点的距离
    distances = []
    for group in data:
        for features in data[group]:
            # euclidean_distance = np.sqrt(np.sum(np.array(features)-np.array(predict))**2))
            euclidean_distance = np.linalg.norm(np.array(features)-np.array(predict))
            distances.append([euclidean_distance, group])#记录距离和组别
    sorted_distance = sorted(distances)
    print(sorted_distance)#对距离进行排序
    sorted_distance_kind = [i[1] for i in sorted_distance]#取出其中的类别
    top_nearest = sorted_distance_kind[:k]#取前k个样本所对用的类别
    print(top_nearest)
    # Counter用于频率数,Counter(top_nearest).most_common(1)[0]=('red', 2)
    group_res = Counter(top_nearest).most_common(1)[0][0]
    confidence = Counter(top_nearest).most_common(1)[0][1] * 1.0 / k#乘以1.0为了映射为浮点型数
    #confidence是对本次分类的确定程度,例如(red,red,red),(red,red,black)都分为red组,但red组更为自信
    return group_res, confidence, sorted_distance[k_val-1][0]

if __name__ == '__main__':
    dataset = {'black': [[1,2], [2,3], [3,1]], 'red':[[6,5], [7,7], [8,6]]}
    new_features = [3.5, 5.2]
    fig = plt.figure()
    ax = fig.add_subplot(111)

    k_val = 3
    for i in dataset:
        for ii in dataset[i]:
            pyplot.scatter(ii[0], ii[1], s=50, color=i)

    which_group, confidence, radius_val = k_nearest_neighbors(dataset, new_features, k_val)
    print(which_group, confidence, radius_val)

    pyplot.scatter(new_features[0], new_features[1], s=100, color="g")
    #画圆
    cir = pyplot.Circle(xy = new_features, radius=radius_val, color = 'b', fill=False)
    ax.add_patch(cir)

    pyplot.show()

运行结果为:
red 0.6666666666666666
即判断测试数据为分类为红色类,
原因是所取的k=3的范围内有两个红色训练数据,一个红色训练数据;
置信度为2/3即0.666666666.
结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KNN最近邻算法——原理和Python代码 的相关文章

随机推荐

  • 转载:中国电信、网通、联通ADSL用户必读:中国电信、网通、联通劫持dns(浏览器)解决方案

    中国电信 网通 联通ADSL用户必读 中国电信 网通 联通劫持dns 中国电信 网通 联通劫持ie浏览器 解决方案D 宽带连接有 也能上网但是本地连接一直显示为受限制的解决方法 我的电脑一直显示本地连接受限制或无连接而宽带连接能连上 这是为
  • Spring Cloud 集成Gson 包冲突

    昨天再引入包的时候 Run了下main直接报错 就知道是包版本冲突了 然后添加的包排除 启动是正常了 但是项目一跑方法直接抛出来 gson转换异常 所以又得放开 于是尝试下引入Gson包试试
  • 3D文档(BRD、MRD、PRD)怎么写

    3D文档 一般来说 BRD作为战略方向的制定 是最早产出的文档 而MRD则是在战略方向的基础上对市场进行的分析 同时对后续工作的方向进行一些说明和指导 也可以说是通过对市场环境 竞品的分析 明确用户定位和产品定位的过程 PRD则是在战略方向
  • rpm的安装和卸载

    1 安装rpm包 强制安装目录下所有rpm包 rpm ivh rpm force nodeps 2 卸载rpm包 rpm e 包名 rpm nodeps
  • Buck的振铃实验与分析

    上上期我们提到了buck电路的开关的振铃波形 本质原因是LC的阻尼振荡 文章偏理论 那BUCK到底是怎么产生尖峰振荡呢 要想把这个问题搞清楚 也很是不容易 所以文章有点长 请直接点赞转发加收藏 问题 本期主要分析以下这两个问题 1 死区时间
  • 缩尾处理 stata

    要求 对连续变量上下1 的分位数进行了缩尾处理 目录 安装 具体命令 疑问1 需要对所有变量缩尾吗 疑问2 面板数据每年的截面数据分别进行处理吗 还是这么多年都混在一起处理 安装 ssc install winsor2 结果发现自己卡在了第
  • android 绘图之Path与Paint详解 - 冷冷汤圆

    http www cnblogs com aibuli p efef9d774df97c553a8a0c0c3495ba35 html utm source tuicool utm medium referral
  • 注释转换小项目(c注释->到c++注释)

    首先欢迎阅读本文 注释转换小项目涉及到c语言对文件的操作 另外这个小项目还应该对各种情况都考虑到 将c语言注释转换为c 注释 经过分析思考 我得到证据要的注释转换有以下几类 我将之整理并放入一个文件里 起名input c 1 一般情况 in
  • 【JavaScript高级】函数相关知识:函数、纯函数、柯里化、严格模式

    文章目录 函数 函数对象的属性 arguments arguments转Array 箭头函数不绑定arguments 剩余参数 rest 纯函数 定义 纯函数的案例 作用和优势 柯里化 定义 优势 自动柯里化 组合函数 定义 组合函数的封装
  • QT信号与槽的6种连接方式以及传递参数为自定义参数时

    文章目录 前言 一 信号与槽的连接 二 connect的第五个参数 三 传递参数为自定义参数时 扩展 前言 QT提供了信号与槽机制来实现对象之间的通信 只有QObject及其派生类才能使用信号和槽机制 且在类之中还需要使用Q OBJECT宏
  • CVTE面试总结(全网面经,已收offer)

    CVTE面试总结 文章目录 CVTE面试总结 CVTE一面 CVTE二面 CVTE面试hr面准备工作 1 问工资 2 给前面两轮面试打分 3 家庭关系和谁最好 4 未来5 10年会做什么 怎么规划 5 有没有别的offer 6 如果给off
  • 专家讲解 Hadoop:HBASE松散数据存储设计

    http developer 51cto com art 201006 203833 htm 本节和大家一起学习一下Hadoop HBASE松散数据存储设计方面的内容 希望通过本节介绍大家能够掌握Hadoop HBASE松散数据存储设计的方
  • 设计模式复习(七)-------适配器模式

    1 定义 将一个类的接口转换成客户希望的另一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 设计模式 GoF 适配 即在不改变原有实现的基础上 将原先不兼容的接口转换为兼容的接口 Adapter模式很像货
  • C语言之移位操作符、位操作符详解

    目录 1 移位操作符 2 位操作符 1 移位操作符 分为左移操作符 lt lt 和右移操作符 gt gt 左移操作符 移位规则 左边抛弃 右边补0 什么意思呢 现在就让我来仔细讲解一番 比如我们定义一个整型变量a 给它赋初值5 如int a
  • tablayout固定在顶端

    当tablayout上方还有其他布局只需要给其他布局添加 app layout scrollFlags scroll 就可以实现
  • postgresql查找数据库端口

    netstat a grep PGSQL
  • 使用git时出现fatal: Authentication failed for

    出现如下错误 fatal Authentication failed for 这是因为我使用的git账号的密码修改了 但是之前已经保存了原来的密码 所以就是密码错误导致无法登陆 但是又不会弹出来让我重新输入密码的界面 这就尴尬了 后来找到了
  • MSYS2 介绍、下载与安装、Pacman常用命令

    一 MSYS2 介绍 MSYS2 官网 MSYS2 MSYS2 Minimal SYStem 2 是一个集成了大量的GNU工具链 工具和库的开源软件包集合 它提供了一个类似于Linux的shell环境 可以在Windows系统中编译和运行许
  • odoo15设置定时任务

    概念 主要是 ir cron模型 它有以下属性 ir actions server id 服务端动作 cron name 任务名称 user id 调度程序用户 默认是当前环境用户 active 默认True interval number
  • KNN最近邻算法——原理和Python代码

    KNN最近邻算法是一种监督学习算法 基本思想是取距离测试数据最近的K个点 这K个点训练数据属于某一类型的数量多 则将该测试数据点也判断为该类 距离可以取 1 欧氏距离 2 曼哈顿距离 算法 1 计算测试数据与各个训练数据之间的距离 2 按照