示例#1
0
void domainModel::xArithCodec::xSymbolModel::scanSymbolsForInitialScaling(domainModel::xMDLPAR::xSymbolList theSymbolList)
{
    domainModel::xMDLPAR::xSymbol theCurrentSymbol;
    theSymbolList.moveToFirstSymbol(); //will never be empty?
    //int tempBob = 0;
    while(true)
    {
        theCurrentSymbol = theSymbolList.getCurrentSymbol();
        addSymbol(theCurrentSymbol.getValue());
        if (theSymbolList.atLastSymbol()) break;
        theSymbolList.moveToNextSymbol();
        //tempBob++;
    }

    double symbolCountLimit = 255;
    double maxSymbolCount = rawSymbolCounts.maxCoeff();
    double symbolScaleFactor = symbolCountLimit / maxSymbolCount;
    Eigen::Array<double,256,1> tempFloatingArray(rawSymbolCounts.cast<double>());
    tempFloatingArray *= symbolScaleFactor;
    rawSymbolCounts = tempFloatingArray.cast<int>();
    assert(rawSymbolCounts.maxCoeff() <= 255);
    assert(rawSymbolCounts.sum()>0);
    rescaleModel();

}
示例#2
0
/* pääfunktio ****************************/
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) {
	
	doubleMatrix trainingData, A, means, variances, weights; 
	double noiseLevel;
	
	int numberOfIterations, updateDistributions;
	int n, k, i, j, l;
	
	
	
	
	/* parametrit */
	trainingData = createDoubleMatrixMx(TRAININGDATA_IN);
	A = createDoubleMatrixMx(A_IN);
	means = createDoubleMatrixMx(MEANS_IN);
	variances = createDoubleMatrixMx(VARIANCES_IN);
	weights = createDoubleMatrixMx(WEIGHTS_IN);
	noiseLevel = mxGetScalar(NOISELEVEL_IN);
	numberOfIterations = (int)mxGetScalar(MAX_ITERATIONS_IN);
	updateDistributions = (int)mxGetScalar(UPDATE_DISTRIBUTIONS);
	
	
	/* globaaleiden muuttujien alustus */
	numberOfGaussians = mxGetM(MEANS_IN);
	dimensions = mxGetN(MEANS_IN);
	numberOfObserved = mxGetM(TRAININGDATA_IN);
	numberOfDataRows = mxGetN(TRAININGDATA_IN);
	numberOfLatent = dimensions - numberOfObserved;	
	states = statelist();
	numberOfStates = pow(numberOfGaussians,dimensions);
	
	
	/* skaalaus */
	doubleMatrix dummyA = createDoubleMatrix(numberOfObserved,dimensions);
	rescaleModel(dummyA,means,variances,weights);
	freeDoubleMatrix(dummyA);
	
	/* virhefunktion arvot */
	doubleMatrix objMatrix = createDoubleMatrix(2,numberOfIterations / RANGE);
	l = 0;
	
	n = dimensions*dimensions;
	
	/* alustetaan globaalit matriisit */
	matrixInitialize();
	
	/* EM-algoritmin pääsilmukka */
	for (k = 0;k < numberOfIterations;k++) {
		/* painojen päivitys */
		if (updateDistributions)
			meanMarginalpstategivenx(weights, trainingData, A, means, variances, weights, noiseLevel);
		
		/* A:n päivitys */
		meanssgivenx(mgssx, mgsx, trainingData, A, means, variances, weights, noiseLevel);
		
		multiplyABt(trainingData, mgsx, XmgsxTran);
		multiplyConst(XmgsxTran,1.0 / numberOfDataRows, XmgsxTranDiv);
		
		
		
		for (i = 0;i < n;i++)
			IND(meanMgssx,i,0) = 0;
		for (i = 0;i < n;i++)
			for (j = 0;j < numberOfDataRows;j++)
				IND(meanMgssx,i,0) += IND(mgssx,i,j) / numberOfDataRows;
		
		for (i = 0;i < dimensions;i++)
			for (j = 0;j < dimensions;j++)
				IND(meanMgssx2,j,i) = IND(meanMgssx,i*dimensions+j,0);
	
		inverse(meanMgssx2, invMeanMgssx);
		
		
		
		multiply(XmgsxTranDiv, invMeanMgssx, A);
		
		
		/* varianssien ja keskiarvojen päivitys */
		if (updateDistributions) {
			meanMarginalpstategivenx(mmpgx, trainingData, A, means, variances, weights, noiseLevel);
			a11meanx2(ax2, ax, trainingData, A, means, variances, weights, noiseLevel);
			
			for (i = 0;i < numberOfGaussians;i++)
				for (j = 0;j < dimensions;j++)
					IND(means,i,j) = IND(ax,i,j) / IND(mmpgx,i,j);
			
			
			for (i = 0;i < numberOfGaussians;i++)
				for (j = 0;j < dimensions;j++) 
					IND(variances,i,j) = IND(ax2,i,j) / IND(mmpgx,i,j)
						- pow(IND(means,i,j),2);
		}
		
		/* skaalataan IF-malli */
		rescaleModel(A,means,variances,weights);
		
		
		if (k % RANGE == 0) {
			/* tarkistetaan A:n validisuus (ei sisällä pelkästään nollia) */
			/* if (!isValid(variances)) { */
			if (IND(A,0,0) - NAN < EPSILON) { 
				/* jos ei enää validi, niin laitetaan tästä eteenpäin virhefunktiolle 
				vain Inf -arvoa */
				while (l < numberOfIterations / RANGE) {
					IND(objMatrix,0,l) = FLT_MAX;
					IND(objMatrix,1,l++) = k;
				}
				/* tulostetaan varianssit ja häivytään silmukasta */
				printDoubleMatrix(variances);
				break;
 
			} else {
				IND(objMatrix,0,l) = evaluateObj(trainingData, A, means, variances, weights, noiseLevel);
				IND(objMatrix,1,l++) = k;
			}
		}
	}
	
	/* vapautetaan globaaleiden matriisien varaama muisti*/
	matrixFinalize();
	
	
	
	/* ulostulot */
	A_OUT = createMxArray(A);
	MEANS_OUT = createMxArray(means);
	VARIANCES_OUT = createMxArray(variances);
	WEIGHTS_OUT = createMxArray(weights);
	OBJ_OUT = createMxArray(objMatrix);
	

	free2d(states,dimensions);
	freeDoubleMatrix(trainingData);
	freeDoubleMatrix(A);
	freeDoubleMatrix(means);
	freeDoubleMatrix(variances);
	freeDoubleMatrix(weights);
	freeDoubleMatrix(objMatrix);
	
	return;
}
示例#3
0
void domainModel::xArithCodec::xSymbolModel::rescaleAfterReloading()
{
    rescaleModel();
}