模糊识别算法设计
知识基础:模糊数学、c/c++语言、linux编程(例子代码是linux下的)
一、模糊识别分析
1.1与算法无关●各个属性的参考集
●待识别的属性的原始数据集
●结果集
●最后识别的结果
1.2模糊识别算法分类I第一类模糊识别1.最大隶属原则
2.阀值原则
II第二类模糊识别
1.择近原则
2.多个特性的择近原则
1.3模糊识别过程
①得到带识别的原始数据集
②调用模糊识别特征知识库的函数计算带识别集与各个参考集之间的隶属度,从而构成隶属集。
③调用模糊识别动态库的函数把隶属集隶属集作为参数传进去得到结果的下标。
④调用模糊识别特征知识库的函数把得到的结果的下标作为参数传入得到最后结果。
1.4模糊识别算法动态库设计
classFrBase{public:FrBase():mthreshold_value_v(NULL),mdll_info(""),mdll_type(0),merror_no(0){}virtual~FrBase(){}/**功能:开始模糊识别(最大隶属原则或择近原则或多个特性的择近原则)*参数:*nearness_vector:*或待识别的向量与标准向量的贴近度向量*返回值:能识别返回mbs_vector下标,反之返回-1*/virtualintfuzzyRecognition(std::vector*constnearness_vector)=0;/**功能:开始模糊识别(阀值原则)*参数:*nearness_vector:待识别事物与标准事物的隶属向量*a:阀值*返回值:如果有大于阀值的则返回所有大于阀值的下标,反之返回NULL*/virtualstd::vector*fuzzyRecognition(std::vector*constnearness_vector,floata)=0;/**功能:得到动态库的信息*返回值:动态库的信息*/virtualstd::stringgetMdllInfo(void)const=0;/**功能:得到动态库的类型*返回值:动态库的类型(是模糊识别特征知识库还是模糊识别动态库)*/virtualintgetMdllType(void)const=0;/**功能:得到最近一次发生错误的详细信息*返回值:最近一次发生错误的详细信息,如果没有错误发生则返回空字符串*/virtualstd::stringerrorInfo(void)const=0;friendvoidset_error_no(intno);protected://设置错误号virtualvoidsetMerrorNo(intno)=0;protected:std::vector*mthreshold_value_v;//识别算法是阀值原则时的结果集std::stringmdll_info;//动态库信息intmdll_type;//动态库类型intmerror_no;//错误号};//设置错误号voidset_error_no(intno);/**功能:得到模糊识别算法类的对象*返回值:模糊识别算法类的对象*/extern"C"FrBase*dllfr_getobj(void);/**功能:动态库的初始化*返回值:成功返回0,失败返回-1*/extern"C"intdllfr_init(void);/**功能:动态库的控制*参数:*typeinputoutput成功返回*1int-数组大小char数组实际信息大小得到动态库信息*2NULLNULL动态库的类型得到动态库的类型*返回值:执行成功时返回看type。失败返回-1*/extern"C"intdllfr_control(inttype,void*input,void*output);/**功能:开始模糊识别*参数:*typevectorvsizeoutputosziea成功返回*1隶属向量或贴近度向量vector数组大小NULL无用无用0模糊算法用的是非阀值原则*2隶属向量或贴近度向量vector数组大小满足阀值的结果集output数组大小阀值结果集大小模糊算法用的是阀值原则(output的大小应该和vector大小相同)*返回值:成功返回看type,失败返回-1*/extern"C"intdllfr_fr(inttype,float*vector,intvsize,int*output,intosize,floata);/**功能:得到最近一次发生错误的详细信息*返回值:最近一次发生错误的详细信息,如果没有错误发生则返回空字符串*/extern"C"constchar*dllfr_error(void);/**功能:关闭动态库*/extern"C"voiddllfr_close(void);
1.5模糊识别特征知识库设计
模糊识别特征知识库主要是提供隶属函数和一些与算法无关的数据,因为不同的应用场景隶属函数是不同的,同时所需的数据也是不同的,但不管那种场景都需要计算隶属度或贴近度。所以每种应用场景的特征知识库是不同的。
下面是模糊识别特征知识库的一个例子
classFrckBase{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*/virtualstd::vector*caculateMembership(std::vector*data_matrix)=0;/**功能:得到最近发生错误的错误信息*返回值:最近有错误发生返回错误信息,反之返回NULL*/virtualstd::stringerrorInfo(void)const=0;/**功能:。得到动态库的信息*返回值:返回动态库信息*/virtualstd::stringgetMdllInfo(void)const=0;/**功能:获得该动态库的类型(模糊识别特征知识库、模糊综合评判知识库)*返回值:该动态库的类型*/virtualintgetMdllType(void)const=0;/**功能:获得该动态库支持的模糊识别算法类型(最大隶属原则12、阀值原则、择近原则、多个特性的择近原则)*返回值:该动态库支持的模糊识别算法类型*/virtualintgetMalgorithmType(void)const=0;/**功能:得到特征知识库支持数据矩阵的行数*返回值:特征知识库支持数据矩阵的行数*/virtualintgetMdataMatrixCols(void)const=0;/**功能:得到特征知识库支持数据矩阵的列数*返回值:特征知识库支持数据矩阵的列数*/virtualintgetMdataMatrixRows(void)const=0;/**功能:得到特征知识库支持隶属矩阵的行数*返回值:特征知识库支持隶属矩阵的行数*/virtualintgetMmbsMatrixCols(void)const=0;/**功能:得到特征知识库支持隶属矩阵的列数*返回值:特征知识库支持隶属矩阵的列数*/virtualintgetMmbsMatrixRows(void)const=0;/**功能:得到阀值(模糊识别算法为阀值原则时可用)*返回:如果模糊识别算法为阀值原则时返回阀值,其它情况返回-1,表示不可用*/virtualintgetMthresholdValue(void)=0;/**功能:根据模糊识别算法得到的下标得到结果*参数:*index:模糊识别算法得到的下标*返回:index正确返回结果,反之返回空字符串*/virtualstd::stringgetResult(intindex)const=0;//设置错误号的友元函数friendvoidset_error_no(intno);protected://设置错误号virtualvoidsetMerrorNo(intno)=0;protected:intmdll_type;//表示是模糊识别特征知识库还是模糊综合评判知识库intmalgorithm_type;//支持那类模糊识别算法(最大隶属原则12、阀值原则、择近原则、多个特性的择近原则)intmdata_matrix_cols;//该特征知识库支持数据矩阵的行数intmdata_matrix_rows;//该特征知识库支持数据矩阵的列数intmmbs_matrix_cols;//该特征知识库支持隶属矩阵的行数intmmbs_matrix_rows;//该特征知识库支持隶属矩阵的列数intmerror_no;//错误号intmthreshold_value;//阀值(阀值原则时可用)std::stringmdll_info;//动态库信息std::vector*mmembership_matrix;//原始数据相对于标准数据的隶属度构成的隶属矩阵};voidset_error_no(intno);//===================================================================/**功能:获得模糊特征知识动态库的对象*返回值:成功返回模糊特征知识动态库的对象(指针)*/extern"C"FrckBase*dllfrck_getobj(void);/**功能:模糊特征知识动态库初始化*返回值:初始化成功返回0,失败返回-1*/extern"C"intdllfrck_init(void);/**功能:模糊特征知识动态库的控制*参数:*typeinputoutput成功返回*1NULLNULL动态库的类型得到动态库的类型(模式别知识库还是模糊综合评判知识库)*2NULLNULL模糊识别算法类型得到支持的模糊识别算法类型(最大隶属原则、阀值原则、择近原则、多个特性的择近原则)*3NULLNULL数据矩阵的行数得到该知识库支持数据矩阵的行数*4NULLNULL数据矩阵的列数得到该知识库支持数据矩阵的列数*5NULLNULL阀值得到阀值(阀值原则时可用)*6int数组大小char*实际信息大小得到动态库信息*7NULLNULL隶属矩阵的行数得到该知识库支持隶属矩阵的行数*8NULlNULL隶属矩阵的列数得到该知识库支持隶属矩阵的列数*返回值:成功返回依type参数而定,失败返回-1*/extern"C"intdllfrck_control(inttype,void*input,void*output);/**功能:计算成绩分数相对于优、良、差的隶属度*参数:*data_matrix:待识别的成绩矩阵(1x1)*cols:data_matrix矩阵的行数*rows:data_matrix矩阵的列数*返回值:计算成功返回待识别分数相对于优、良、差的隶属度(一个向量--1x3的矩阵)*/extern"C"float**dllfrck_membership(float**data_matrix,intcols,introws);/**功能:根据模糊识别算法得到的下标得到结果*参数:*index:模糊识别算法得到的下标*返回:index正确返回结果,反之返回空字符串*/extern"C"constchar*dllck_result(intindex);/**功能:得到最近发生错误的详细信息*返回值:最近有错误发生则返回错误的详细信息,没有则返回NULL*/extern"C"constchar*dllfck_error(void);/**功能:关闭动态库*/extern"C"voiddllfrck_close(void);
上面模糊识别特征知识库的实现代码:
github:https://github.com/moonzhu/frckdll
上面模糊识别库的实现代码:
github:https://github.com/moonzhu/frdll