最近也是刚接触KD树,刚开始也是一头雾水,自己也是搜了很多资料,通过自己的理解以及老师的讲解,对KD树有了更深的理解,然后就写个博客来记录一下,也好能帮助其他人去了解KD树。

关于KD树的原理网上有很多,我就不再讲述原理了,需要的数据集我会放在文章末尾,本文我主要用用Numpy去实现,没有涉及sklearn。

首先,导入所需要的库

import pandas as pd
import numpy as np
from collections import Counter

from collections import Counter是用来统计各个标签出现的次数的,因为我取得是前k个最近距离 ,也可省去不要。

读取鸢尾花数据,建立测试标签(x为所有鸢尾花特征值,y为标签,simple为测试数据)

x = np.array(pd.read_csv('iris.csv', usecols=(0, 1, 2, 3), delimiter=',', header=0))  # 读取特征集合
y = np.array(pd.read_csv('iris.csv')['species'])  # 读取标签集simple = np.array([3.5,2.4,0.3,2.5])

创建一个KD数节点的类,__str__函数用于输出KD树

class KDtreeNode:def __init__(self, val, label, dim, left=None, right=None):self.val = val  # 特征集self.dim = dim  # 维度self.label = label  # 标签self.left = left  # 左子树self.right = right  # 右子树def __str__(self):return f'特征是:{self.val}, 标签是:{self.label},划分维度:{self.dim}'

接下来要创建一颗KD树,代码中我注释的比较全面,也就不再解释了,看我的注释就行

def CreateKDtree(x, y, dim):if x.size == 0:return Noneelse:nidx = np.argsort(x, axis=0)[:, dim]  # 按照dim这个维度排序center_num = x.shape[0] // 2  # 中位数的序号cut_idx = nidx[center_num]  # 根节点的索引号left_idx = nidx[:center_num]  # 左子树的索引号right_idx = nidx[center_num + 1:]  # 右子树的索引号node_tree = KDtreeNode(x[cut_idx], y[cut_idx], dim)  # KD树的根节点dim = (dim + 1) % x.shape[1]  # 更新维度dim值node_tree.left = CreateKDtree(x[left_idx], y[left_idx], dim)  # 递归左子树node_tree.right = CreateKDtree(x[right_idx], y[right_idx], dim)  # 递归右子树return node_tree  # 得到KD树

对KD树进行搜索,得到预测结果

def search_KDtree(simple, k):# 初始化距离,最近点为None,最近距离为无穷大nearest_knn = np.array([[None, float('inf')] for _ in range(k)])# 创建一个列表,用于存放从根节点到一个叶子结点的所有节点,找距离最近的点node_list = []# 得到KD树,node_tree是一颗KD树node_tree = CreateKDtree(x, y, 0)while node_tree:# 将所有可能的节点加入到列表中,加入的位置为列表的第一个元素node_list.insert(0, node_tree)dim = node_tree.dimif simple[dim] < node_tree.val[dim]:node_tree = node_tree.leftelse:node_tree = node_tree.right#从叶子结点开始,回溯for node in node_list:#计算欧几里得距离distance = np.linalg.norm(node.val - simple, ord=2)#np.where返回一个二维数组,及满足要求的位置坐标.less_index为距离小于inf的行的索引less_index = np.where(distance < nearest_knn[:,1])[0]#print(nearest_knn)if less_index.size > 0:#对nearest_knn进行更新nearest_knn = np.insert(nearest_knn, less_index[0], [node, distance], axis=0)[:k]  #只取前k个距离最短的radius = nearest_knn[:,1][k-1]                #radius为k个距离中最远的那个,欧几里得距离dis = simple[node.dim] - node.val[node.dim]   #所求点到超平面的距离if radius > abs(dis):                              #如果欧几里得距离大于到超平面的距离if dis > 0:                               #如果simple[node.dim] > node.val[node.dim],加入左子树append_node = node.leftelse:append_node = node.right              #否则,加入左右树if append_node is not None:node_list.append(append_node)return([lab[0].label for lab in nearest_knn if lab[0] is not None])

依据KD搜索的原理,我们要从根节点出发,一直找下去,直到叶子节点,将这些节点存放在列表中,这些节点都可能是距离最短的,KD树搜索时,考虑的因素有很多,当欧几里得距离大于到超平面的距离时,同根节点的另外一颗树也可能存在最近距离,所以当条件满足时,还要将另外一棵树的节点添加到列表中

下面是主函数

lb = search_KDtree(simple, 3)
print('预测结果为:'+Counter(lb).most_common(1)[0][0])

直接调用搜索KD树函数就行,我只测试了一个样例,所以比较简单

下边是数据集下载地址,按照上边代码的顺序,直接粘贴过去是可以直接用的啊

https://pan.baidu.com/s/1nr7ocY3Pz30tfly5Iq8IoA

提取码为5912,希望能帮到各位

KD树实现鸢尾花分类(Numpy实现)相关推荐

  1. KNN分类器、最近邻分类、KD树、KNN分类的最佳K值、基于半径的最近邻分类器、KNN多分类、KNN多标签分类、KNN多输出分类、KNN分类的优缺点

    KNN分类器.最近邻分类.KD树.KNN分类的最佳K值.基于半径的最近邻分类器.KNN多分类.KNN多标签分类.KNN多输出分类.KNN分类的优缺点 目录

  2. 鸢尾花分类python,Python鸢尾花分类实现

    #coding:utf-8 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_ ...

  3. 基于kd树的k近邻算法——KNN

    1.简介 k近邻算法是机器学习中一种基本的分类与回归算法,对你没听错k近邻算法不仅可以用来做分类,还可以用于回归,英文全称为k-Nearest Neighbor简称k-NN.k近邻算法属于一种有监督学 ...

  4. K近邻法之kd树及其Python实现

    作为机器学习中一种基本的分类方法,K近邻(KNN)法是一种相对简单的方法.其中一个理由是K近邻法不需要对训练集进行学习.然而,不需要对训练集进行学习,反过来也会造成对测试集进行判定时,计算与空间复杂度 ...

  5. KNN算法与Kd树(转载+代码详细解释)

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

  6. python决策树分类鸢尾花_基于决策树—鸢尾花分类

    决策树算法广泛应用于:语音识别.医疗诊断.客户关系管理.模式识别.专家系统等,在实际工作中,必须根据数据类型的特点及数据集的大小,选择合适的算法. 本文选择经典案例--<鸢尾花分类> 一. ...

  7. k近邻法的实现(kd树)-相关问题梳理

    K邻近算法的伪代码 机器学习实战 李锐等译 对未知类别属性的数据集的每一个点依次进行如下操作: 1.计算已知类别数据集中的点与当前点之间的距离: 2.按照距离递增次序排序 3.选取与当前点距离最小的k ...

  8. K近邻算法的kd树实现

    k近邻算法的介绍 k近邻算法是一种基本的分类和回归方法,这里只实现分类的k近邻算法. k近邻算法的输入为实例的特征向量,对应特征空间的点:输出为实例的类别,可以取多类. k近邻算法不具有显式的学习过程 ...

  9. 浅谈KNN算法原理及python程序简单实现、KD树、球树

    最近比较空闲,打算利用这一段时间理一下机器学习的一些常见的算法.第一个是KNN算法: KNN 1.原理: KNN,K-NearestNeighbor---K最近邻 K最近邻,就是K个最近的邻居的意思, ...

最新文章

  1. 【腾讯面试题】熊出没
  2. 网页性能优化之异步加载js文件
  3. 烂泥:SQL Server 2005数据库备份与恢复
  4. Machine Learning课程 by Andrew Ng
  5. 数据结构与算法 / 队列(queue)
  6. 开发基础(字符编码、列表操作)
  7. 数据库主键设计之思考(转)
  8. P2495-[SDOI2011]消耗战【虚树,dp】
  9. ns3 入门案例2:third.cc
  10. easyUI根据参数动态的生成列数
  11. Makefile 函数
  12. 使用源代码编译安装基于LAMP的网站架构
  13. 2022年黑马程序员火爆全网的自学Java必刷教程(价值2w+的教程免费分享)
  14. Java常见异常类【整理】
  15. 大规模容器镜像管理方案
  16. 25.3. Continuous Archiving and Point-in-Time Recovery (PITR)
  17. iOS开发:使用大图+脚本,生成各种size的app icon和图片素材
  18. 【python牛客刷题】——深度学习第一弹
  19. android native 代码内存泄露 定位方案
  20. opencv 去除背景算法的比较

热门文章

  1. 如何排版 微信公众号「代码块」之 MarkEditor
  2. hyperlynx si 前仿真
  3. 《语义计算群:AI 理性主义的终结是不可能的吗》
  4. MySQL索引的详细分析和数据结构
  5. 探索性数据分析EDA(二)—— 缺失值处理
  6. 边云协同智能技术在电力领域的应用
  7. centos6下安装配置NFS
  8. 安卓libc setenv函数内存泄漏
  9. 十三个提高远程办公效率的工具
  10. 爬取了知乎2.2亿阅读量 有漂亮女朋友是什么体验,结果发现...