📄 clustering.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 + -