KNN算法
"""
KNN算法
即K最邻近算法,用于搜索K个最近邻居的算法,--最简单机器学习算法之一
当某一个模型T的周围的K个模型中大多数都是某一类G,则T也划分为G类
k-d树:(K-Dimension tree)
是对数据点在k维空间(2维(x,y) 3维(x,y,z) k维(a,b,c...k))中划分的一种数据结构
主要应用与多维空间关键数据的搜索--范围搜索和最近邻搜索
本质:
一颗二叉查找树,时间复杂度O(log₂N)
存储流程:
在存储k维数据时,k-d树的第n层(根节点为第一层)使用第n%k(取余数)维度数据作为二叉树左右节点的存储数据
例如:
要存储一个三维数据(4,2,6) 4 是第一维度 2是第二维度 6是第三维度
若该数据需要被村道第四层,因为4%3=1 所以使用第一维度的4 作为左右节点的存储依据
要搜索距离点(a,b)最近的K个近邻,D用于存储搜索到的近邻点
查找流程:
1. 从根节点出发, 依次比较当前节点和点(a,b)第n%2维度数据,向左子结点或右子节点搜索
直到搜索到叶节点(n为层数)
2. 将经过的节点标记为已访问,并判断D中存储的数据数量是否小于K,若小于K,则将该叶节点
存入D, 否则计算该叶节点到点(a,b)的距离, 若大于D中的任何一个点到点(a,b)的距离,
则删除D中距离最大的点,然后将该叶节点存入D中
3. 回溯其父节点和父节点的另一个子节点重复 1 和 2 直到某个父节点的距离已经大于D中最大的距离,搜索结束
"""
class KDNode():
"""
k-d树的节点
"""
def __init__(self, point=None, split=None, leftNode=None, rightNode=None):
self.point = point
self.leftNode = leftNode
self.rightNode = rightNode
self.split = split
def __str__(self):
return f'point={
self.point}'
class KDTree():
def __init__(self, data_list):
self.dimension = len(data_list[0])
self.root = self.createKDTree(data_list)
def createKDTree(self, data_list, n=0):
"""
将列表数据构建成k-d树
:param data_list:
:param n:
:return:
"""
length = len