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树的简称)ÿ