面向对象——类设计(六)——算法类

来源:互联网 发布:易语言文本处理源码 编辑:程序博客网 时间:2024/06/05 11:30

对于一个基于面向对象的数据聚类的基础类库(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;                // 聚合关系};
0 0
原创粉丝点击