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

📄 clustering.cpp

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

CClustering::CClustering()
{
	this->num = 1;
	this->xdata = NULL;
	this->ydata = NULL;
	resultTotal = NULL;
	resultRight = NULL;
}

CClustering::~CClustering()
{
	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 CClustering::train(char* fileName)
{
	int m, n, k, l;
	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;
	bool sign = true;
	int* cnum = new int[pnum];
	DOUBLE* sumx = new DOUBLE[pnum*numFeature];
	DOUBLE* distance = new DOUBLE[pnum];
	DOUBLE temp2;
	DOUBLE minDistance = 1e10;
	DOUBLE error = 0;
	int index = 0;
	int times=0;
	for (m=0; m<numClass; m++)
	{
		t = -1;
		for (n=0; n<pnum; n++)
		{
			do
			{
				t++;
			}
			while (this->sdata.ydata[t] != m);
			this->ydata[m*pnum+n] = m;
			for (k=0; k<numFeature; k++)
			{
				this->xdata[(m*pnum+n)*numFeature+k] = this->sdata.xdata[t*numFeature+k];
			}
		}
		sign = true;
		for (; sign; )
		{
			sign=false;
			times ++;
			for (n=0; n<pnum; n++)
			{
				cnum[n] = 0;
				for (k=0; k<numFeature; k++)
				{
					sumx[n*numFeature+k] = 0;
				}
			}
			for (n=0; n<numSample; n++)
			{
				if (this->sdata.ydata[n] == m)
				{
					minDistance = 1e10;
					index =0;
					for (k=0; k<pnum; k++)
					{
						distance[k] = 0;
						for (l=0; l<numFeature; l++)
						{
							temp2 = this->sdata.xdata[n*numFeature+l]-this->xdata[(m*pnum+k)*numFeature+l];
							distance[k] += temp2 * temp2;
						}
						if (distance[k] < minDistance)
						{
							minDistance = distance[k];
							index = k;
						}
					}
					cnum[index] ++;
					for (k=0; k<numFeature; k++)
					{
						sumx[index*numFeature+k] += this->sdata.xdata[n*numFeature+k];
					}
				}
			}
			for (n=0; n<pnum; n++)
			{
				for (k=0; k<numFeature; k++)
				{
					temp2 = sumx[n*numFeature+k]/cnum[n];
					if (sign || this->xdata[(m*pnum+n)*numFeature+k]-temp2>error || temp2-this->xdata[(m*pnum+n)*numFeature+k]>error)
					{
						this->xdata[(m*pnum+n)*numFeature+k] = temp2;
						sign = true;
					}
				}
			}
		}
	}
	//cout << "times:" << times <<endl;
	delete[] cnum;
	delete[] sumx;
	delete[] distance;
	return ret;
}

bool CClustering::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 + -