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算法实现的基本框架:
设计理由如下:
-
每一个KNN实例提供未知数据的分类或回归的功能;
-
每一个KNN实例是分类器或回归器。
-
每一个KNN实例都依赖一个KNN训练模型,KNN训练模型提供搜索未知数据点的 k k k个近邻的功能。
-
KNN训练模型可以有不同的实现方式,暴力的,KD树的,等等。
-
样本点规范了数据集的格式,易于操作。
下面三张图是详细的类的方法的设计。
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索。
k-d树是一个k维二叉树,每个节点表示一个空间范围;
这种搜索有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K-neighbor searches)。
范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据;
K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时