Пример #1
0
	// Kernel Operations
	double OnlineSVR::Kernel (Vector<double>* V1, Vector<double>* V2)
	{
		double K;
		Vector<double>* V;

		switch (this->KernelType) {

			case KERNEL_LINEAR:
				// K = V1 * V2'
				return Vector<double>::ProductVectorScalar(V1,V2);
				break;

			case KERNEL_POLYNOMIAL:
				// K = (V1*V2' + 1) ^ KernelParam
				K = Vector<double>::ProductVectorScalar(V1,V2);						
				return pow (K+1, this->KernelParam);
				break;

			case KERNEL_RBF:		
				// K = exp (-KernelParam * sum(dist(V1,V2)^2))
				V = Vector<double>::SubtractVector(V1,V2);
				V->PowScalar(2);
				K = V->Sum();
				K *= -this->KernelParam;
				delete V;
				return exp(K);
				break;
			
			case KERNEL_RBF_GAUSSIAN:
				// K = exp (-sum(dist(V1,V2)^2 / 2*(KernelParam^2))
				V = Vector<double>::SubtractVector(V1,V2);
				V->PowScalar(2);
				K = V->Sum();
				if (this->KernelParam!=0)
					K /= -(2*pow(this->KernelParam,2));
				else
					K /= -2;
				delete V;
				return exp(K);
				break;
				
			case KERNEL_RBF_EXPONENTIAL:
				// K = exp (-sum(dist(V1,V2) / 2*(KernelParam^2))
				V = Vector<double>::SubtractVector(V1,V2);			
				K = V->AbsSum();
				if (this->KernelParam!=0)
					K /= -(2*pow(this->KernelParam,2));
				else
					K /= -2;
				delete V;
				return exp(K);
				break;

			case KERNEL_MLP:
				// K = tanh((V1*V2')*KernelParam + KernelParam2)
				K = Vector<double>::ProductVectorScalar(V1,V2);
				K = tanh(K*this->KernelParam + this->KernelParam2);
				return K;
				break;
			}

		return -1;
	}