TrainingSampleCheckerResult checkTrainingSample(const MatrixDouble &in) { VectorDouble stddev = in.getStdDev(); if (*max_element(stddev.begin(), stddev.end()) < 0.1) return TrainingSampleCheckerResult(TrainingSampleCheckerResult::WARNING, "Warning: Gesture contains very little movement."); return TrainingSampleCheckerResult::SUCCESS; }
CalibrateResult restingDataCollected(const MatrixDouble& data) { // take average of X and Y acceleration as the zero G value zeroG = (data.getMean()[0] + data.getMean()[1]) / 2; oneG = data.getMean()[2]; // use Z acceleration as one G value double range = abs(oneG - zeroG); vector<double> stddev = data.getStdDev(); if (stddev[0] / range > 0.05 || stddev[1] / range > 0.05 || stddev[2] / range > 0.05) return CalibrateResult(CalibrateResult::WARNING, "Accelerometer readings are noisy, check circuit."); return CalibrateResult::SUCCESS; }
CalibrateResult restingDataCollected(const MatrixDouble& data) { // take average of X and Y acceleration as the zero G value zeroG = (data.getMean()[0] + data.getMean()[1]) / 2; oneG = data.getMean()[2]; // use Z acceleration as one G value double range = abs(oneG - zeroG); vector<double> stddev = data.getStdDev(); if (stddev[0] / range > 0.05 || stddev[1] / range > 0.05 || stddev[2] / range > 0.05) return CalibrateResult(CalibrateResult::WARNING, "Accelerometer seemed to be moving; consider recollecting the " "calibration sample."); if (abs(data.getMean()[0] - data.getMean()[1]) / range > 0.1) return CalibrateResult(CalibrateResult::WARNING, "X and Y axes differ by " + std::to_string( abs(data.getMean()[0] - data.getMean()[1]) / range * 100) + " percent. Check that accelerometer is flat."); return CalibrateResult::SUCCESS; }
bool PrincipalComponentAnalysis::computeFeatureVector_(const MatrixDouble &data,const UINT analysisMode) { trained = false; const UINT M = data.getNumRows(); const UINT N = data.getNumCols(); this->numInputDimensions = N; MatrixDouble msData( M, N ); //Compute the mean and standard deviation of the input data mean = data.getMean(); stdDev = data.getStdDev(); if( normData ) { //Normalize the data for(UINT i=0; i<M; i++) for(UINT j=0; j<N; j++) msData[i][j] = (data[i][j]-mean[j]) / stdDev[j]; } else { //Mean Subtract Data for(UINT i=0; i<M; i++) for(UINT j=0; j<N; j++) msData[i][j] = data[i][j] - mean[j]; } //Get the covariance matrix MatrixDouble cov = msData.getCovarianceMatrix(); //Use Eigen Value Decomposition to find eigenvectors of the covariance matrix EigenvalueDecomposition eig; if( !eig.decompose( cov ) ) { mean.clear(); stdDev.clear(); componentWeights.clear(); sortedEigenvalues.clear(); eigenvectors.clear(); errorLog << "computeFeatureVector(const MatrixDouble &data,UINT analysisMode) - Failed to decompose input matrix!" << endl; return false; } //Get the eigenvectors and eigenvalues eigenvectors = eig.getEigenvectors(); VectorDouble eigenvalues = eig.getRealEigenvalues(); //Any eigenvalues less than 0 are not worth anything so set to 0 for(UINT i=0; i<eigenvalues.size(); i++) { if( eigenvalues[i] < 0 ) eigenvalues[i] = 0; } //Sort the eigenvalues and compute the component weights double sum = 0; UINT componentIndex = 0; sortedEigenvalues.clear(); componentWeights.resize(N,0); while( true ) { double maxValue = 0; UINT index = 0; for(UINT i=0; i<eigenvalues.size(); i++) { if( eigenvalues[i] > maxValue ) { maxValue = eigenvalues[i]; index = i; } } if( maxValue == 0 || componentIndex >= eigenvalues.size() ) { break; } sortedEigenvalues.push_back( IndexedDouble(index,maxValue) ); componentWeights[ componentIndex++ ] = eigenvalues[ index ]; sum += eigenvalues[ index ]; eigenvalues[ index ] = 0; //Set the maxValue to zero so it won't be used again } double cumulativeVariance = 0; switch( analysisMode ) { case MAX_VARIANCE: //Normalize the component weights and workout how many components we need to use to reach the maxVariance numPrincipalComponents = 0; for(UINT k=0; k<N; k++) { componentWeights[k] /= sum; cumulativeVariance += componentWeights[k]; if( cumulativeVariance >= maxVariance && numPrincipalComponents==0 ) { numPrincipalComponents = k+1; } } break; case MAX_NUM_PCS: //Normalize the component weights and compute the maxVariance maxVariance = 0; for(UINT k=0; k<N; k++) { componentWeights[k] /= sum; if( k < numPrincipalComponents ) { maxVariance += componentWeights[k]; } } break; default: errorLog << "computeFeatureVector(const MatrixDouble &data,UINT analysisMode) - Unknown analysis mode!" << endl; break; } //Flag that the features have been computed trained = true; return true; }
int main (int argc, const char * argv[]) { //Create an empty matrix double MatrixDouble matrix; //Resize the matrix matrix.resize( 100, 2 ); //Set all the values in the matrix to zero matrix.setAllValues( 0 ); //Loop over the data and set the values to random values UINT counter = 0; for(UINT i=0; i<matrix.getNumRows(); i++){ for(UINT j=0; j<matrix.getNumCols(); j++){ matrix[i][j] = counter++; } } //Add a new row at the very end of the matrix VectorDouble newRow(2); newRow[0] = 1000; newRow[1] = 2000; matrix.push_back( newRow ); //Print the values cout << "Matrix Data: \n"; for(UINT i=0; i<matrix.getNumRows(); i++){ for(UINT j=0; j<matrix.getNumCols(); j++){ cout << matrix[i][j] << "\t"; } cout << endl; } cout << endl; //Get the second row as a vector VectorDouble rowVector = matrix.getRowVector( 1 ); cout << "Row Vector Data: \n"; for(UINT i=0; i<rowVector.size(); i++){ cout << rowVector[i] << "\t"; } cout << endl; //Get the second column as a vector VectorDouble colVector = matrix.getColVector( 1 ); cout << "Column Vector Data: \n"; for(UINT i=0; i<colVector.size(); i++){ cout << colVector[i] << "\n"; } cout << endl; //Get the mean of each column VectorDouble mean = matrix.getMean(); cout << "Mean: \n"; for(UINT i=0; i<mean.size(); i++){ cout << mean[i] << "\n"; } cout << endl; //Get the Standard Deviation of each column VectorDouble stdDev = matrix.getStdDev(); cout << "StdDev: \n"; for(UINT i=0; i<stdDev.size(); i++){ cout << stdDev[i] << "\n"; } cout << endl; //Get the covariance matrix MatrixDouble cov = matrix.getCovarianceMatrix(); cout << "Covariance Matrix: \n"; for(UINT i=0; i<cov.getNumRows(); i++){ for(UINT j=0; j<cov.getNumCols(); j++){ cout << cov[i][j] << "\t"; } cout << endl; } cout << endl; vector< MinMax > ranges = matrix.getRanges(); cout << "Ranges: \n"; for(UINT i=0; i<ranges.size(); i++){ cout << "i: " << i << "\tMinValue: " << ranges[i].minValue << "\tMaxValue:" << ranges[i].maxValue << "\n"; } cout << endl; //Save the matrix data to a csv file matrix.save( "data.csv" ); //load the matrix data from a csv file matrix.load( "data.csv" ); return EXIT_SUCCESS; }