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

📄 lvq2.cpp

📁 该程序包实现了三个模式识别的聚类算法
💻 CPP
字号:
#include "stdlib.h"
#include <iostream>
#include <string.h>
#include <fstream>
#include <math.h>
using namespace std;
#include "global.h"

CLvq2::CLvq2()
{
	num = 1;
	alpha0 = 0;
	xdata = NULL;
	ydata = NULL;
	resultTotal = NULL;
	resultRight = NULL;
}

CLvq2::~CLvq2()
{
	if (this->xdata != NULL)
		delete[] this->xdata;
	if (this->ydata != NULL)
		delete[] this->ydata;
	if (this->resultTotal != NULL)
		delete[] this->resultTotal;
	if (this->resultRight != NULL)
		delete[] this->resultRight;
}

bool CLvq2::train(char* fileName)
{
	int m, n, k, l;
	int iteration = 45;
	DOUBLE w = 0.15;
	DOUBLE w2 = (1-w)/(1+w);
	DOUBLE alpha0 = this->alpha0;
	DOUBLE alpha = 0;
	bool ret = true;
	ret = this->sdata.readFile(fileName);//读入训练数据
	if (!ret)
		return false;//如果数据格式不正确,退出程序。
	int pnum = this->num;
	int numClass = this->sdata.numClass;
	int numFeature = this->sdata.numFeature;
	int numSample = this->sdata.numSample;
	this->xdata = new DOUBLE[numClass * pnum * numFeature];
	this->ydata = new int[numClass * pnum];
	int t;
	int* cnum = new int[pnum];
	DOUBLE* sumx = new DOUBLE[pnum*numFeature];
	DOUBLE temp2;
	DOUBLE distance = 0;
	DOUBLE minDistance1 = 1e10;
	DOUBLE minDistance2 = 1e10;
	int index1 = 0;
	int index2 = 0;
	CClustering cClustering;
	cClustering.num = this->num;
	cClustering.train(fileName);
	int total = numClass*pnum;
	for (m=0; m<numClass*pnum; m++)
	{
		this->ydata[m] = cClustering.ydata[m];
		for (n=0; n<numFeature; n++)
		{
			this->xdata[m*numFeature+n] = cClustering.xdata[m*numFeature+n];
		}
	}
	for (m=0; m<iteration; m++)
	{
		alpha = alpha0*(iteration-m)/iteration;
		for (n=0; n<numSample; n++)
		{
			minDistance1 = 1e10;
			minDistance2 = 1e10;
			for (k=0; k<numClass*pnum; k++)
			{
				distance = 0;
				for (l=0; l<numFeature; l++)
				{
					temp2 = this->sdata.xdata[n*numFeature+l] - this->xdata[k*numFeature+l];
					distance += temp2 * temp2;
				}
				if (distance < minDistance1)
				{
					minDistance2 = minDistance1;
					minDistance1 = distance;
					index2 = index1;
					index1 = k;
				}
				else if (distance < minDistance2)
				{
					minDistance2 = distance;
					index2 = k;
				}
			}
			if ((minDistance1/minDistance2)>w2)
			{
				if (this->ydata[index1] == this->sdata.ydata[n] && this->ydata[index2] != this->sdata.ydata[n])
				{
					for (k=0; k<numFeature; k++)
					{
						this->xdata[index1*numFeature+k] = this->xdata[index1*numFeature+k]*(1-alpha)+alpha*this->sdata.xdata[n*numFeature+k];
						this->xdata[index2*numFeature+k] = this->xdata[index2*numFeature+k]*(1+alpha)-alpha*this->sdata.xdata[n*numFeature+k];
					}
				}
				else if (this->ydata[index2] == this->sdata.ydata[n] && this->ydata[index1] != this->sdata.ydata[n])
				{
					for (k=0; k<numFeature; k++)
					{
						this->xdata[index1*numFeature+k] = this->xdata[index1*numFeature+k]*(1+alpha)-alpha*this->sdata.xdata[n*numFeature+k];
						this->xdata[index2*numFeature+k] = this->xdata[index2*numFeature+k]*(1-alpha)+alpha*this->sdata.xdata[n*numFeature+k];
					}
				}
			}
		}
	}
	return ret;
}

bool CLvq2::test(char* fileName)
{
	bool ret = true;
	int numClass = this->sdata.numClass;
	int numFeature = this->sdata.numFeature;
	int pnum = this->num;
	int numSample = pnum * numClass;
	CKnn cKnn;
	cKnn.paramK = 1;
	cKnn.sdata.numClass = numClass;
	cKnn.sdata.numFeature = numFeature;
	cKnn.sdata.numSample = numSample;
	cKnn.sdata.ydata = new int[numSample];
	cKnn.sdata.xdata = new DOUBLE[numSample*numFeature];
	cKnn.sdata.nameClass = new char*[numClass];
	int m, n, k, l;
	for (m=0; m<numClass; m++)
	{
		cKnn.sdata.nameClass[m] = new char[strlen(this->sdata.nameClass[m])];
		strcpy(cKnn.sdata.nameClass[m], this->sdata.nameClass[m]);
		for (n=0; n<pnum; n++)
		{
			cKnn.sdata.ydata[m*pnum+n] = m;
			for (k=0; k<numFeature; k++)
			{
				cKnn.sdata.xdata[(m*pnum+n)*numFeature+k] = this->xdata[(m*pnum+n)*numFeature+k];
			}
		}
	}
	cKnn.test(fileName);
	this->resultTotal = new DOUBLE[numClass];
	this->resultRight = new DOUBLE[numClass];
	for (m=0; m<numClass; m++)
	{
		this->resultTotal[m] = cKnn.resultTotal[m];
		this->resultRight[m] = cKnn.resultRight[m];
	}
	return ret;
}

⌨️ 快捷键说明

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