コード例 #1
0
void 
SupportVectorMachine::train(const std::vector<float>& labels, const FeatureSet& fset, double C)
{	
	if(labels.size() != fset.size()) throw std::runtime_error("Database size is different from feature set size!");

	_fVecShape = fset[0].Shape();

	// Figure out size and number of feature vectors
	int nVecs = labels.size();
	CShape shape = fset[0].Shape();
	int dim = shape.width * shape.height * shape.nBands;

	// Parameters for SVM
	svm_parameter parameter;
	parameter.svm_type = C_SVC;
	parameter.kernel_type = LINEAR;
	parameter.degree = 0;
	parameter.gamma = 0;
	parameter.coef0 = 0;
	parameter.nu = 0.5;
	parameter.cache_size = 100;  // In MB
	parameter.C = C;
	parameter.eps = 1e-3;
	parameter.p = 0.1;
	parameter.shrinking = 1;
	parameter.probability = 0;
	parameter.nr_weight = 0; // ?
	parameter.weight_label = NULL;
	parameter.weight = NULL;
	//cross_validation = 0;

	// Allocate memory
	svm_problem problem;
	problem.l = nVecs;
	problem.y = new double[nVecs];
	problem.x = new svm_node*[nVecs];
	if(_data) delete [] _data;

	/******** BEGIN TODO ********/
	// Copy the data used for training the SVM into the libsvm data structures "problem".
	// Put the feature vectors in _data and labels in problem.y. Also, problem.x[k]
	// should point to the address in _data where the k-th feature vector starts (i.e.,
	// problem.x[k] = &_data[starting index of k-th feature])
	//
	// Hint:
	// * Don't forget to set _data[].index to the corresponding dimension in
	//   the original feature vector. You also need to set _data[].index to -1
	//   right after the last element of each feature vector

	// Vector containing all feature vectors. svm_node is a struct with
	// two fields, index and value. Index entry indicates position 
	// in feature vector while value is the value in the original feature vector, 
	// each feature vector of size k takes up k+1 svm_node's in _data
	// the last one being simply to indicate that the feature has ended by setting the index
	// entry to -1
	_data = new svm_node[nVecs * (dim + 1)];
	int j = 0;
	for(int i=0; i<nVecs; i++){
		Feature feat = fset.at(i);
		int index=0;
		problem.x[i] = &_data[j];
		problem.y[i] = labels.at(i);
		for (int y=0; y<feat.Shape().height; y++){
			for (int x=0; x<feat.Shape().width; x++){
				for(int b=0; b<feat.Shape().nBands; b++){
					_data[j].index = index;
					_data[j].value = feat.Pixel(x,y,b);
					j++;
					index++;
				}
			}
		}
		_data[j++].index = -1;
	}
	
	//printf("TODO: SupportVectorMachine.cpp:87\n"); exit(EXIT_FAILURE); 

	/******** END TODO ********/

	// Train the model
	if(_model != NULL) svm_free_and_destroy_model(&_model);
	_model = svm_train(&problem, &parameter);

	// Cleanup
	delete [] problem.y;
	delete [] problem.x;
}