KNN算法框架的实现、K-d树的实现、K-d树的加快搜索的原理、K-d树的最近邻以及K近邻搜索、K-d树的BBF优化

public class DataNode{

private T label;

private double[] vector;

private int dimension;

/**

  • @param label 此样本实例元素的所属的标签

  • @param vector 高维输入向量

  • @param dimension 向量的维度

*/

public DataNode(T label, double[] vector, int dimension) {

this.label = label;

this.vector = vector;

this.dimension = dimension;

}

// ……………………

  • 考虑第一个参数:k

这是KNN算法中是一个极其关键的参数,放在KNN实例构造器里,考虑到并非持久化参数,所以也给出setter接口。

  • 考虑第二个参数:距离计算公式

由于这部分和KNN算法并不是紧耦合,于是设计成函数式接口、并用一个类用静态方法给予距离函数不同实现,如欧几里得距离、哈密顿距离等等。

  • 考虑第三个参数:决策函数

决策函数的实现和KNN算法紧耦合,所以在KNN算法中用公共枚举类,将参暴露出来,并在类的内部给予实现。

public enum DecisionFunction {

MajorityVote,

WeightedMajorityVote;

}

如下图便是这次KNN算法实现的基本框架:

在这里插入图片描述

设计理由如下:

  1. 每一个KNN实例提供未知数据的分类或回归的功能;

  2. 每一个KNN实例是分类器或回归器。

  3. 每一个KNN实例都依赖一个KNN训练模型KNN训练模型提供搜索未知数据点的 k k k个近邻的功能。

  4. KNN训练模型可以有不同的实现方式,暴力的,KD树的,等等。

  5. 样本点规范了数据集的格式,易于操作。

下面三张图是详细的类的方法的设计。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

KD (K dimension) Tree (K维度树)


k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索。

k-d树是一个k维二叉树,每个节点表示一个空间范围;

这种搜索有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K-neighbor searches)。

范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据;

K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值