对于一个基于面向对象的数据聚类的基础类库(Class Library)而言,算法类(Algorithm,这里特指聚类算法 clustering algorithms)的设计是必不可少的一环。
聚类算法名目繁多,但都具有如下的三种共同的属性:
- (1)参数(parameters or arguments)
- (2)结果(clustering results)
- (3)聚类算法本身(perform data clustering)
- (4)不同的聚类算法需要不同的参数集(Arguments),产生不同的聚类结果(Results);
Arguments
所有的聚类算法在执行数据聚类的时候无一例外都需要参数(有时甚至是超参),而且不同的算法需要不同类型的参数。例如,k-means 算法需要首先指定聚类的数目,FCM聚类算法同时也需要样本与类别的隶属度。
Additional 类用于持有任意可见(类型任意 boost::any)的参数;
class Additional
{
public:
const boost::any& get(const std::string& name) const;
void insert(const std::string& name, const boost::any& value);
std::map<std::string, boost::any> additional;
protected:
Additional() {}
};
在我们的设计中,我们将数据集(dataset)以及距离度量的类(distance measure,几乎所有的聚类算法都需要距离的度量)也作为参数。
class Arguments :public Additional
{
public:
boost::shared_ptr<Dataset> ds;
boost::shared_ptr<Distance> dist;
};
Results
与 Arguments 类相似,不同的聚类算法产生不同的聚类结果,如 k-means 聚类算法产生 hard clustering results,而 FCM 聚类算法产生 fuzzy clustering results。
class Results :public Additional
{
public:
void reset();
// 清空聚类结果
std::vector<Size> CM;
// 存储样本的所属类别
// 这不正是聚类算法要做的事吗
};
Clustering Algorithms
这里,我们将给出全部聚类算法的基类 Algorithm 的设计;
class Algorithm
{
public:
virtual ~Algorithm(){}
virtual Arguments& getArguments();
// non-const 型成员函数
virtual const Results& getResults() const;
virtual void reset() const;
virtual void clusterize();
protected:
virtual void setupArguments();
virtual void performClustering() const = 0;
virtual void fetchResults() const = 0;
boost::shared_ptr<Dataset> _ds;
mutable Results _results;
Arguments _arguments;
// 聚合关系
};