模糊識別算法設計


知識基礎:模糊數學、c/c++語言、linux編程 (例子代碼是linux下的)

 

一、模糊識別分析

1.1與算法無關

●各個屬性的參考集

●待識別的屬性的原始數據集

●結果集

●最后識別的結果

1.2模糊識別算法分類

I第一類模糊識別

1.最大隸屬原則

 

 

 

 

2.閥值原則

 

 

II第二類模糊識別

1.擇近原則

 

2.多個特性的擇近原則

 

1.3模糊識別過程

①得到帶識別的原始數據集

②調用模糊識別特征知識庫的函數計算帶識別集與各個參考集之間的隸屬度,從而構成隸屬集。

③調用模糊識別動態庫的函數把隸屬集隸屬集作為參數傳進去得到結果的下標。

④調用模糊識別特征知識庫的函數把得到的結果的下標作為參數傳入得到最后結果。

 

1.4模糊識別算法動態庫設計

 

class FrBase
{
public:
    FrBase():mthreshold_value_v(NULL),
            mdll_info(""),
            mdll_type(0),
            merror_no(0)
    {

    }

    virtual ~FrBase()
    {

    }

    /*
    *功能:開始模糊識別(最大隸屬原則或擇近原則或多個特性的擇近原則)
    *參數:
    *    nearness_vector:
    *               或待識別的向量與標准向量的貼近度向量
    *返回值:能識別返回mbs_vector下標,反之返回-1
    */
    virtual int fuzzyRecognition(std::vector<float> *const nearness_vector)=0;

    /*
    *功能:開始模糊識別(閥值原則)
    *參數:
    *    nearness_vector:待識別事物與標准事物的隸屬向量
    *    a:閥值
    *返回值:如果有大於閥值的則返回所有大於閥值的下標,反之返回NULL
    */
    virtual std::vector<int> *fuzzyRecognition(std::vector<float> *const nearness_vector,float a)=0;

    /*
     * 功能:得到動態庫的信息
     * 返回值:動態庫的信息
     */
    virtual std::string getMdllInfo(void)const=0;

    /*
     * 功能:得到動態庫的類型
     * 返回值:動態庫的類型(是模糊識別特征知識庫還是模糊識別動態庫)
     */
    virtual int getMdllType(void)const=0;

    /*
     * 功能:得到最近一次發生錯誤的詳細信息
     * 返回值:最近一次發生錯誤的詳細信息,如果沒有錯誤發生則返回空字符串
     */
    virtual std::string errorInfo(void)const=0;

    friend void set_error_no(int no);
protected:
    //設置錯誤號
    virtual void setMerrorNo(int no)=0;

protected:
    std::vector<int> *mthreshold_value_v;//識別算法是閥值原則時的結果集
    std::string mdll_info;//動態庫信息
    int mdll_type;//動態庫類型
    int merror_no;//錯誤號

};
//設置錯誤號
void set_error_no(int no);

/* * 功能:得到模糊識別算法類的對象 * 返回值:模糊識別算法類的對象 */ extern "C" FrBase *dllfr_getobj(void); /* * 功能:動態庫的初始化 * 返回值:成功返回0,失敗返回-1 */ extern "C" int dllfr_init(void); /* * 功能:動態庫的控制 * 參數: * type input output 成功返回 * 1 int-數組大小 char數組 實際信息大小 得到動態庫信息 * 2 NULL NULL 動態庫的類型 得到動態庫的類型 * 返回值:執行成功時返回看type。失敗返回-1 */ extern "C" int dllfr_control(int type,void *input,void *output); /* * 功能:開始模糊識別 * 參數: * type vector vsize output oszie a 成功返回 * 1 隸屬向量或貼近度向量 vector數組大小 NULL 無用 無用 0 模糊算法用的是非閥值原則 * 2 隸屬向量或貼近度向量 vector數組大小 滿足閥值的結果集 output數組大小 閥值 結果集大小 模糊算法用的是閥值原則(output的大小應該和vector大小相同) * 返回值:成功返回看type,失敗返回-1 */ extern "C" int dllfr_fr(int type,float *vector,int vsize,int *output,int osize,float a); /* * 功能:得到最近一次發生錯誤的詳細信息 * 返回值:最近一次發生錯誤的詳細信息,如果沒有錯誤發生則返回空字符串 */ extern "C" const char *dllfr_error(void); /* * 功能:關閉動態庫 */ extern "C" void dllfr_close(void);

1.5模糊識別特征知識庫設計

 模糊識別特征知識庫主要是提供隸屬函數和一些與算法無關的數據,因為不同的應用場景隸屬函數是不同的,同時所需的數據也是不同的,但不管那種場景都需要計算隸屬度或貼近度。所以每種應用場景的特征知識庫是不同的。

下面是模糊識別特征知識庫的一個例子

 

class FrckBase
{
public:
    FrckBase():mdll_type(0),malgorithm_type(0),mdata_matrix_cols(0),
                mdata_matrix_rows(0),mmbs_matrix_cols(0),mmbs_matrix_rows(0),
                merror_no(0),mthreshold_value(0),mdll_info(""),
                mmembership_matrix(NULL)
    {

    }

    virtual ~FrckBase()
    {

    }

    /*
    *功能:根據原始矩陣計算出隸屬度
    *參數:
    *   data_matrix:原始數據矩陣
    *返回值:計算成功返回隸屬度向量,失敗返回NULL
    */
    virtual std::vector<std::vector<float>> *caculateMembership(std::vector<std::vector<float>> *data_matrix)=0;

    /*
     * 功能:得到最近發生錯誤的錯誤信息
     * 返回值:最近有錯誤發生返回錯誤信息,反之返回NULL
     */
    virtual std::string errorInfo(void)const=0;

    /*
     * 功能:。得到動態庫的信息
     * 返回值:返回動態庫信息
     */
    virtual std::string getMdllInfo(void)const=0;

    /*
     * 功能:獲得該動態庫的類型(模糊識別特征知識庫、模糊綜合評判知識庫)
     * 返回值:該動態庫的類型
     */
    virtual int getMdllType(void)const=0;

    /*
     * 功能:獲得該動態庫支持的模糊識別算法類型(最大隸屬原則1 2、閥值原則、擇近原則、多個特性的擇近原則)
     * 返回值:該動態庫支持的模糊識別算法類型
     */
    virtual int getMalgorithmType(void)const=0;

    /*
     *功能:得到特征知識庫支持數據矩陣的行數
     *返回值:特征知識庫支持數據矩陣的行數
     */
    virtual int getMdataMatrixCols(void)const=0;

    /*
     *功能:得到特征知識庫支持數據矩陣的列數
     *返回值:特征知識庫支持數據矩陣的列數
     */
    virtual int getMdataMatrixRows(void)const=0;

    /*
     *功能:得到特征知識庫支持隸屬矩陣的行數
     *返回值:特征知識庫支持隸屬矩陣的行數
     */
    virtual int getMmbsMatrixCols(void)const=0;

    /*
     *功能:得到特征知識庫支持隸屬矩陣的列數
     *返回值:特征知識庫支持隸屬矩陣的列數
     */
    virtual int getMmbsMatrixRows(void)const=0;

    /*
     * 功能:得到閥值(模糊識別算法為閥值原則時可用)
     * 返回:如果模糊識別算法為閥值原則時返回閥值,其它情況返回-1,表示不可用
     */
    virtual int getMthresholdValue(void)=0;

    /*
     *功能:根據模糊識別算法得到的下標得到結果
     *參數:
     *    index:模糊識別算法得到的下標
     *返回:index正確返回結果,反之返回空字符串
     */
    virtual std::string getResult(int index)const=0;

    //設置錯誤號的友元函數
    friend void set_error_no(int no);
protected:
    //設置錯誤號
    virtual void setMerrorNo(int no)=0;

protected:
    int mdll_type;          //表示是模糊識別特征知識庫還是模糊綜合評判知識庫
    int malgorithm_type;    //支持那類模糊識別算法(最大隸屬原則1 2、閥值原則、擇近原則、多個特性的擇近原則)
    int mdata_matrix_cols;  //該特征知識庫支持數據矩陣的行數
    int mdata_matrix_rows;  //該特征知識庫支持數據矩陣的列數
    int mmbs_matrix_cols;   //該特征知識庫支持隸屬矩陣的行數
    int mmbs_matrix_rows;   //該特征知識庫支持隸屬矩陣的列數
    int merror_no;          //錯誤號
    int mthreshold_value;   //閥值(閥值原則時可用)
    std::string mdll_info;  //動態庫信息
    std::vector<std::vector<float>> *mmembership_matrix;//原始數據相對於標准數據的隸屬度構成的隸屬矩陣
};

void set_error_no(int no);




//===================================================================
/*
 * 功能:獲得模糊特征知識動態庫的對象
 * 返回值:成功返回模糊特征知識動態庫的對象(指針)
 */
extern  "C" FrckBase *dllfrck_getobj(void);

/*
 * 功能:模糊特征知識動態庫初始化
 * 返回值:初始化成功返回0,失敗返回-1
 */
extern  "C" int dllfrck_init(void);

/*
 * 功能:模糊特征知識動態庫的控制
 * 參數:
 *      type            input           output      成功返回
 *        1             NULL             NULL      動態庫的類型       得到動態庫的類型(模式別知識庫還是模糊綜合評判知識庫)
 *        2             NULL             NULL      模糊識別算法類型    得到支持的模糊識別算法類型(最大隸屬原則、閥值原則、擇近原則、多個特性的擇近原則)
 *        3             NULL             NULL      數據矩陣的行數      得到該知識庫支持數據矩陣的行數
 *        4             NULL             NULL      數據矩陣的列數      得到該知識庫支持數據矩陣的列數
 *        5             NULL             NULL      閥值              得到閥值(閥值原則時可用)
 *        6             int數組大小        char*     實際信息大小       得到動態庫信息
 *        7             NULL             NULL      隸屬矩陣的行數      得到該知識庫支持隸屬矩陣的行數
 *        8             NULl             NULL      隸屬矩陣的列數      得到該知識庫支持隸屬矩陣的列數
 *返回值:成功返回依type參數而定,失敗返回-1
 */
extern  "C" int dllfrck_control(int type,void *input,void *output);

/*
 * 功能:計算成績分數相對於優、良、差的隸屬度
 * 參數:
 *      data_matrix:待識別的成績矩陣(1x1)
 *      cols:data_matrix矩陣的行數
 *      rows:data_matrix矩陣的列數
 * 返回值:計算成功返回待識別分數相對於優、良、差的隸屬度(一個向量--1x3的矩陣)
 */
extern  "C" float **dllfrck_membership(float **data_matrix,int cols,int rows);

/*
 *功能:根據模糊識別算法得到的下標得到結果
 *參數:
 *    index:模糊識別算法得到的下標
 *返回:index正確返回結果,反之返回空字符串
 */
extern "C" const char *dllck_result(int index);

/*
 * 功能:得到最近發生錯誤的詳細信息
 * 返回值:最近有錯誤發生則返回錯誤的詳細信息,沒有則返回NULL
 */
extern  "C" const char *dllfck_error(void);

/*
 * 功能:關閉動態庫
 */
extern  "C" void dllfrck_close(void);

 

上面模糊識別特征知識庫的實現代碼:

github:https://github.com/moonzhu/frckdll 

上面模糊識別庫的實現代碼:

github:https://github.com/moonzhu/frdll

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM