1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
// -*- Mode: C++; tab-width: 2; -*-
// vi: set ts=2:
//
//
#include <BALL/QSAR/kpcrModel.h>
#include <BALL/QSAR/pcrModel.h>
#include <Eigen/Dense>
namespace BALL
{
namespace QSAR
{
KPCRModel::KPCRModel(const QSARData& q, int k_type, double p1, double p2) : KernelModel(q, k_type, p1, p2)
{
type_="KPCR";
frac_var_ = 0.99;
}
KPCRModel::KPCRModel(const QSARData& q, Eigen::VectorXd& w) : KernelModel(q, w)
{
type_="KPCR";
frac_var_ = 0.99;
}
KPCRModel::KPCRModel(const QSARData& q, String s1, String s2) : KernelModel(q, s1, s2)
{
type_="KPCR";
frac_var_ = 0.99;
}
KPCRModel::KPCRModel(const QSARData& q, const LinearModel& lm, int column) : KernelModel(q, lm, column)
{
type_="KPCR";
frac_var_ = 0.99;
}
KPCRModel::~KPCRModel()
{
}
void KPCRModel::setFracVar(double frac_var)
{
frac_var_ = frac_var;
}
void KPCRModel::train()
{
if (descriptor_matrix_.cols() == 0)
{
throw Exception::InconsistentUsage(__FILE__, __LINE__, "Data must be read into the model before training!");
}
kernel->calculateKernelMatrix(descriptor_matrix_, K_);
PCRModel::calculateEigenvectors(K_, frac_var_, loadings_);
latent_variables_ = K_*loadings_;
//result of RR is a linear combination of latente variables
// = column with length = no of latente variables = > matrix for more than one modelled activity
Eigen::MatrixXd m = latent_variables_.transpose()*latent_variables_;
weights_ = m.colPivHouseholderQr().solve(latent_variables_.transpose()*Y_);
training_result_ = loadings_*weights_;
calculateOffsets();
}
void KPCRModel::setParameters(vector<double>& v)
{
if (v.size() != 1)
{
String c = "Wrong number of model parameters! Needed: 1;";
c = c+" given: "+String(v.size());
throw Exception::ModelParameterError(__FILE__, __LINE__, c.c_str());
}
frac_var_ = v[0];
}
vector<double> KPCRModel::getParameters() const
{
vector<double> d;
d.push_back(frac_var_);
return d;
}
}
}
|