?? glvq2.cpp
字號(hào):
#include "stdlib.h"
#include <iostream>
#include <string.h>
#include <fstream>
#include <math.h>
using namespace std;
#include "global.h"
CGlvq::CGlvq()
{
num = 1;
alpha0 = 0;
xdata = NULL;
ydata = NULL;
resultTotal = NULL;
resultRight = NULL;
}
CGlvq::~CGlvq()
{
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 CGlvq::train(char* fileName)
{
int m, n, k, l;
int iteration = 45;
DOUBLE alpha0 = this->alpha0;
DOUBLE alpha = 0;
bool ret = true;
ret = this->sdata.readFile(fileName);//讀入訓(xùn)練數(shù)據(jù)
if (!ret)
return false;//如果數(shù)據(jù)格式不正確,退出程序。
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;
DOUBLE uu, ll, cc1, cc2;
int index1 = 0;
int index2 = 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];
}
}
}
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 (this->ydata[index1] == this->sdata.ydata[n] && this->ydata[index2] != this->sdata.ydata[n])
{
uu = (minDistance1 - minDistance2)/(minDistance1 + minDistance2);
ll = 1/(1+exp(-uu));
cc1 = 4 * alpha * ll * (1-ll) * minDistance2 / (minDistance1 + minDistance2);
cc2 = -4 * alpha * ll * (1-ll) * minDistance1 / (minDistance1 + minDistance2);
for (k=0; k<numFeature; k++)
{
this->xdata[index1*numFeature+k] = this->xdata[index1*numFeature+k]*(1-cc1)+cc1*this->sdata.xdata[n*numFeature+k];
this->xdata[index2*numFeature+k] = this->xdata[index2*numFeature+k]*(1-cc2)+cc2*this->sdata.xdata[n*numFeature+k];
}
}
else if (this->ydata[index2] == this->sdata.ydata[n] && this->ydata[index1] != this->sdata.ydata[n])
{
uu = (minDistance1 - minDistance2)/(minDistance1 + minDistance2);
ll = 1/(1+exp(-uu));
cc1 = -4 * alpha * ll * (1-ll) * minDistance2 / (minDistance1 + minDistance2);
cc2 = 4 * alpha * ll * (1-ll) * minDistance1 / (minDistance1 + minDistance2);
for (k=0; k<numFeature; k++)
{
this->xdata[index1*numFeature+k] = this->xdata[index1*numFeature+k]*(1-cc1)+cc1*this->sdata.xdata[n*numFeature+k];
this->xdata[index2*numFeature+k] = this->xdata[index2*numFeature+k]*(1-cc2)+cc2*this->sdata.xdata[n*numFeature+k];
}
}
}
}
return ret;
}
bool CGlvq::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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -