⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 feedforward.cpp

📁 模糊K近邻分类器
💻 CPP
字号:
//该函数实现分类的过程
/* 输入参数:
   prototype -- 指向prototype部分的指针
   N -- prototype部分的结点个数
   exemplar -- 指向exemplar部分的指针
   M -- exemplar部分的结点个数
   sample -- 输入模式
   L -- 输入模式的维数
   输出参数:
   输入模式属于的类号
 */
#include <math.h>
#include <stdio.h>
#include "FuzzyNN.h"
#include "tools.h"

int feedforward(ProtoNode *prototype,int N,ExemNode *exemplar,int M,FuzzyNum *sample,int L)
{
	int i,j;

	double *s;
	s=new double[N+1];
	mcheck(s);

	//计算s1,s2,...,sN,并求其最大值
	for(j=1;j<=N;j++)
	{
		s[j]=0;
		for(i=1;i<=L;i++)
			s[j]+=(coa(sample[i])-coa((prototype[j].w)[i]))*(coa(sample[i])-coa((prototype[j].w)[i]));
		s[j]=s[j]/L;
		s[j]=sqrt(s[j]);
		s[j]=1-s[j];
	}

	double pmax; //s1,s2,...,sN中的最大值
	int pindex; //最大值对应的下标

	pmax=s[1];
	pindex=1;
	for(i=2;i<=N;i++)
		if(s[i]>pmax)
		{
			pmax=s[i];
			pindex=i;
		}


	//如果exemplar不为空的话,计算r1,r2,...,rM,并求其最大值
	double emax=0; //r1,r2,...,rM中的最大值
	int eindex=0; //最大值对应的下标
	
	if(exemplar!=NULL)
	{
		double *r;
		r=new double[M+1];
		mcheck(r);

		j=0;
		ExemNode *p=exemplar;
		int flag;
		while(p!=NULL)
		{
			j++;
			r[j]=0;
			flag=1;
			for(i=1;i<=L;i++)
				if(!((p->v)[i].w1<=sample[i].w1 && (p->v)[i].w2>=sample[i].w2))
					flag=0;
			if(flag)
			{
				for(i=1;i<=L;i++)
					r[j]+=(sample[i].w1-(p->v)[i].w1)*(sample[i].w1-(p->v)[i].w1)+(sample[i].w2-(p->v)[i].w2)*(sample[i].w2-(p->v)[i].w2);
				r[j]=r[j]/L;
				r[j]=sqrt(r[j]);
				r[j]=2-r[j];
			}
			p=p->next;
		}

		emax=r[1];
	    eindex=1;
	    for(i=2;i<=M;i++)
		   if(r[i]>emax)
		   {
			  emax=r[i];
			  eindex=i;
		   }
		delete []r;
	}

  	if(exemplar==NULL)return pindex;
	else
	{
		if(pmax>emax)return pindex;
		else
		{
			ExemNode *p=exemplar;
			for(i=1;i<eindex;i++)
				p=p->next;
			return p->classnum;
		}
	}
	delete []s;
}
	 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -