知识基础:模糊数学、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