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

📄 pnn.cpp

📁 DNA分类
💻 CPP
字号:
// PNN.cpp: implementation of the CPNN class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DNAClassification.h"
#include "PNN.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPNN::CPNN()
{
	m_bIsTraining = FALSE;

	m_cWeight = NULL;
	m_nClass = 0;
	m_pWeight = NULL;
	m_A =NULL;

	m_ParzenWidth = 0.45;

	m_nSample = 0;
}

CPNN::~CPNN()
{
	Clear();
}

/********************************************************/
/*功  能:PNN训练算法
/*参  数:sample:是一个第一维大小为n,第二维大小为c的二维数组,样本已归一化
/*        pClass:n维数组,样本的分类信息,取值是0,1,2,3
/*        n     :第一维大小,即样本个数
/*        c     :第二维大小,即类别数目
/*返回值:训练是否成功
/********************************************************/
BOOL CPNN::Training(double **ppSample,int* pClass,int n,int c)
{
	if(m_bIsTraining)//已经训练过
	{
		//if(c!=m_nClass)//类别数不一致
			return FALSE;
	}
	else //没有训练过
	{		
		if(c<=0)
			return FALSE;

		m_nSample = n;
		m_nClass = c;

		m_cWeight = new double[c];
		m_pWeight = new double*[n];
		m_A = new BOOL*[n];
		for(int i=0;i<n;i++)
		{
			m_pWeight[i] = new double[c];
			m_A[i] = new BOOL[c];
		}
		//初始化
		for(int w = 0;w<n;w++)
		{
			for(int h = 0;h<c;h++)
			{
				m_pWeight[w][h] = 0;
				m_A[w][h] = 0;
			}
		}
		
		//训练
		for(int ii=0;ii<n;ii++)
		{
			for(int jj=0;jj<c;jj++)
			{
				m_pWeight[ii][jj] = ppSample[ii][jj];//w(jk)<-x(jk)
			}
			ASSERT(pClass[ii]<c);
			m_A[ii][pClass[ii]] = TRUE;

			double dRate = (double)((double)ii/(double)n);
			ReportStatus(&dRate);
		}

		m_bIsTraining = TRUE;
	}

	return TRUE;
}

/********************************************************/
/*功  能:PNN分类算法
/*参  数:testsample:是一个第一维大小为n,第二维大小为c的二维数组
/*        pClass:n维数组,样本的分类信息,取值是0,1,2,3,用于输出
/*        n     :第一维大小,即样本个数,必须与训练时所传参数一致
/*        c     :第二维大小,即类别数目,必须与训练时所传参数一致
/*返回值:是否分类成功
/********************************************************/
BOOL CPNN::Classify(double **ppTestSample,int* pClass,int n,int c)
{
	if(m_bIsTraining==FALSE)//还没有训练
		return FALSE;

	double* net = new double[m_nSample];
	double*	g = new double[c];
	memset(g,0,c*sizeof(double));

	for(int nSam = 0;nSam<n;nSam++)
	{
		for(int i=0;i<m_nSample;i++)
		{
			//MatrixMul(m_pWeight,ppTestSample,1,c,1,c,result);
			double result = 0.0;
			for(int r = 0;r<c;r++)
			{
				result += m_pWeight[i][r]*ppTestSample[nSam][r];
			}
			net[i] =result;

			for(int j=0;j<c;j++)
			{
				if(m_A[i][j] ==TRUE)
				{
					g[j]+=exp((net[i]-1)/(m_ParzenWidth*m_ParzenWidth));
				}
			}
		}

		double max =0;
		int nClass = 0;
		for(int jj=0;jj<c;jj++)
		{
			if(g[jj]>max)
			{
				max = g[jj];
				nClass =jj;
			}
		}
		pClass[nSam] = nClass;

		memset(g,0,c*sizeof(double));
	}

	delete[] net;
	delete[] g;
	return TRUE;
}


/********************************************************/
/*功  能:
/*参  数:
/*返回值:
/********************************************************/
void CPNN::Clear()
{
	if(m_cWeight)
	{
		delete[] m_cWeight;
		m_cWeight = NULL;

	}
	if(m_pWeight)
	{
		for(int i=0;i<m_nSample;i++)
		{
			delete[] m_pWeight[i];			
			m_pWeight[i] = NULL;
		}
		delete m_pWeight;
		m_pWeight = NULL;
	}
	if(m_A)
	{		
		for(int i=0;i<m_nSample;i++)
		{
			delete[] m_A[i];
			m_A[i] = NULL;
		}
		delete m_A;
		m_A = NULL;
	}
	
	m_bIsTraining = FALSE;	
	m_nClass = 0;
	m_nSample = 0;
}

⌨️ 快捷键说明

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