193 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
    LA: linear algebra C++ interface library
 | 
						|
    Kernel ridge regression module Copyright (C) 2024 
 | 
						|
    Pavel Florian <florian43@seznam.cz> and Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
						|
 | 
						|
    This program is free software: you can redistribute it and/or modify
 | 
						|
    it under the terms of the GNU General Public License as published by
 | 
						|
    the Free Software Foundation, either version 3 of the License, or
 | 
						|
    (at your option) any later version.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU General Public License
 | 
						|
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
*/
 | 
						|
#include <iostream>
 | 
						|
#include <string>
 | 
						|
#include <cmath>
 | 
						|
#include <bits/stdc++.h>
 | 
						|
#include <fstream>
 | 
						|
using namespace std;
 | 
						|
# include "mat.h" // vector support libla implementation
 | 
						|
# include "vec.h" // compiler parameters: -llapack -lblas
 | 
						|
 | 
						|
# include "la.h"
 | 
						|
# ifndef REG_H
 | 
						|
# define REG_H
 | 
						|
 | 
						|
namespace LA {
 | 
						|
 | 
						|
template <typename T>
 | 
						|
T Gaussian_kernel(const T* x, const unsigned int dimensions, const T sigma);
 | 
						|
 | 
						|
template <typename T>
 | 
						|
T Laplacian_kernel(const T* x, const unsigned int dimensions, const T sigma);
 | 
						|
 | 
						|
template <typename T>
 | 
						|
T Exponential_kernel(const T* x, const unsigned int dimensions, const T sigma);
 | 
						|
 | 
						|
template <typename T>
 | 
						|
T Matern_kernel(const T* x, const unsigned int dimensions, const T sigma, const unsigned int n, const T* Matern_comb_number);
 | 
						|
 | 
						|
template <typename T>
 | 
						|
unsigned int Matern_coefficient(const unsigned int n, T* comb_number);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// The kernel regression of points in 1D (curve), 2D (surface), 3D and multi-D space
 | 
						|
template <typename T>
 | 
						|
class REG { // Kernel regression (REG) library
 | 
						|
public:
 | 
						|
    // Constructor of kernel regression model from memory location
 | 
						|
    REG(const T* x, const T* y, const T* params, const unsigned int data_size, const unsigned int x_dimensions, const string kernel);
 | 
						|
    // Constructor of kernel regression model from files
 | 
						|
    REG(const string x_file, const string y_file, const string param_file);
 | 
						|
    // Init function for constructor
 | 
						|
    void Init(const T* x, const T* y, const T* params, const unsigned int data_size, const unsigned int x_dimensions, const string kernel);
 | 
						|
    // General kernel function
 | 
						|
    inline T Kernel(const T* x, const unsigned int dimensions, const unsigned int kernel_id);
 | 
						|
    // Function, that build matrix of distances between kernels
 | 
						|
    unsigned int Build_REG_distances_mat();
 | 
						|
    // Function, that build matrix of coefficients for kernel coordinates
 | 
						|
    unsigned int Build_REG_kernels_mat();
 | 
						|
    // Function, that build sums of matrix coefficients for kernel coordinates
 | 
						|
    unsigned int Build_REG_kernels_mat_sums();
 | 
						|
    // Function, that return root mean square error of model
 | 
						|
    T REG_RMSE(); // sum(delta_y)
 | 
						|
    // The Loss function
 | 
						|
    T Loss_Function(); // sum(delta_y) + lambda((1 - alpha)/2 * sum(weight^2) + alpha * sum(abs(weight)))
 | 
						|
    
 | 
						|
    // Function, that learn kernels and set weights
 | 
						|
    unsigned int REG_Fit(const T max_Loss, const unsigned int max_learning_cycles);
 | 
						|
    // Function, that learn kernels and set weights by gradient descent method
 | 
						|
    unsigned int REG_Fit_grad(const T max_Loss, const unsigned int max_learning_cycles, const T learning_rate);
 | 
						|
    // Function, that store fitted parameters of regression model to file
 | 
						|
    unsigned int REG_Save_fitted(const string model_file);
 | 
						|
    // Function, that load fitted parameters of model to file
 | 
						|
    unsigned int REG_Load_fitted(const string model_file);
 | 
						|
    // Function, that uses the kernel regression model to predict y for new data
 | 
						|
    unsigned int REG_Get_predictions(const T* x, T* y_preds, const unsigned int data_size);
 | 
						|
    // Function, that uses the kernel regression model to predict y for new data and investigate the model precision
 | 
						|
    unsigned int REG_Get_Score(const T* x, T* y_preds, const unsigned int data_size, const T* y, T* score);
 | 
						|
    // Setting parameters of kernel regression model
 | 
						|
    unsigned int REG_Set_params(const T* params, const string kernel);
 | 
						|
    // Getting parameters of kernel regression model
 | 
						|
    unsigned int REG_Get_params(T* params, string* kernel);
 | 
						|
    // Getting weight coefficients of kernels in regression model
 | 
						|
    unsigned int REG_Get_weight_coeff(T* weight);
 | 
						|
    // destructor of kernel regression model
 | 
						|
    ~REG();
 | 
						|
 | 
						|
private:
 | 
						|
    // string with type of kernel
 | 
						|
    string REG_kernel_type;
 | 
						|
    // number of type of kernel
 | 
						|
    unsigned int REG_kernel_id;
 | 
						|
    // Count of x items (dimensions) for kernels
 | 
						|
    unsigned int REG_count_dimensions;
 | 
						|
    // number of input x values/kernels
 | 
						|
    unsigned int REG_count_kernels;
 | 
						|
    // lambda parameter of regression
 | 
						|
    T REG_lambda;
 | 
						|
    // alpha parameter of regression
 | 
						|
    T REG_alpha;
 | 
						|
    // sigma parameter of kernels
 | 
						|
    T REG_sigma;
 | 
						|
    // n for Matern kernels
 | 
						|
    unsigned int REG_n;
 | 
						|
    // indicator of initialization or initialization errors
 | 
						|
    bool REG_base_init = false;
 | 
						|
    // indicator of initialization of allocation of memory
 | 
						|
    bool REG_aloc_init = false;
 | 
						|
    // indicator of initialization of REG_REG_distances_mat and REG_REG_kernels_mat
 | 
						|
    bool REG_mat_init = false;
 | 
						|
    
 | 
						|
    // Matern kernel coefficient computed from n and k
 | 
						|
    T* REG_Matern_comb_number = nullptr;
 | 
						|
    // pointer to parameters of kernel regression, various size, first is lambda, second alpha, third sigma parameter of kernels
 | 
						|
    // and fourth the n parameter, if is used Matern kernel 
 | 
						|
    T* REG_params = nullptr;
 | 
						|
    // variable which contains number of learning cycles of model
 | 
						|
    unsigned int learning_cycles = 0;
 | 
						|
    
 | 
						|
    // x values of kernel regression input data
 | 
						|
    T* REG_coordinates = nullptr;
 | 
						|
    // y values of kernel regression input data
 | 
						|
    T* REG_Y = nullptr;
 | 
						|
    
 | 
						|
    // matrix of distances between kernels
 | 
						|
    T* REG_distances = nullptr;
 | 
						|
    // matrix of kernel coefficients for kernel coordinates
 | 
						|
    T* REG_kernels = nullptr;
 | 
						|
    // vector of row sums of kernel coefficients for kernel coordinates
 | 
						|
    T* REG_kernels_sums = nullptr;
 | 
						|
    // vector of weight coefficients for each kernel
 | 
						|
    T* REG_weights = nullptr;
 | 
						|
    
 | 
						|
    // vector of distances between kernels
 | 
						|
    T* REG_coordinates_diff = nullptr;
 | 
						|
    // vector of kernel coefficients for kernel coordinates
 | 
						|
    T* REG_kernels_diff = nullptr;
 | 
						|
    // vector of y predictions for each kernel
 | 
						|
    T* REG_y_preds = nullptr;
 | 
						|
    // vector of differences between y values and predictions for each kernel
 | 
						|
    T* REG_y_delta = nullptr;
 | 
						|
    // vector of temporary results for processing y values and predictions for each kernel
 | 
						|
    T* REG_y_temp = nullptr;
 | 
						|
    
 | 
						|
    // pointer to x buffer for model loaded from file
 | 
						|
    T* REG_x_file = nullptr;
 | 
						|
    // pointer to y buffer for model loaded from file
 | 
						|
    T* REG_y_file = nullptr;
 | 
						|
    // pointer to parameters buffer for model loaded from file
 | 
						|
    T* REG_param_file = nullptr;
 | 
						|
    // pointer to fitted data for model loaded from file
 | 
						|
    T* REG_fit_file = nullptr;
 | 
						|
    
 | 
						|
    // NRVec for Matern kernel coefficient computed from n and k
 | 
						|
    NRVec<T> REG_Matern_comb_number_vec;
 | 
						|
 | 
						|
    // NRVec for matrix of distances between kernels
 | 
						|
    NRVec<T> REG_coordinates_vec;
 | 
						|
    // NRVec for vector of y imput values of kernels
 | 
						|
    NRVec<T> REG_y_vec;
 | 
						|
    // NRMat for matrix of distances between kernels
 | 
						|
    NRMat<T> REG_distances_mat;
 | 
						|
    // NRMat for matrix of kernel coefficients for kernel coordinates
 | 
						|
    NRMat<T> REG_kernels_mat;
 | 
						|
    // NRVec for vector of row sums of kernel coefficients for kernel coordinates
 | 
						|
    NRVec<T> REG_kernels_sums_vec;
 | 
						|
    // NRVec for vector of weight coefficients of kernels
 | 
						|
    NRVec<T> REG_weights_vec;
 | 
						|
    
 | 
						|
    // NRVec for matrix of coordinates differences between kernels
 | 
						|
    NRVec<T> REG_coordinates_diff_vec;
 | 
						|
    // NRVec for matrix of kernel coefficients for kernel coordinates
 | 
						|
    NRVec<T> REG_kernels_diff_vec;
 | 
						|
    
 | 
						|
    // NRVec for vector of y predictions of kernels
 | 
						|
    NRVec<T> REG_y_preds_vec;
 | 
						|
    // NRVec for vector of differences between estimated real and real y values for training kernels
 | 
						|
    NRVec<T> REG_y_delta_vec;
 | 
						|
    // NRVec for temporary results for processing y values and predictions for each kernel
 | 
						|
    NRVec<T> REG_y_temp_vec;
 | 
						|
};
 | 
						|
// Include the template classes definitions
 | 
						|
 | 
						|
} // end of namespace
 | 
						|
# endif /* REG_H */
 |