21 int n_classes = classes.size();
22 int n_samples =
nrow(X);
23 int n_features =
ncol(X);
27 this->covariance =
createMatrix(0,n_features,n_features);
28 this->covarianceInv =
createMatrix(0,n_features,n_features);
36 for(
int k=0; k < n_classes; k++) {
39 this->inturruptionPoint();
41 std::vector<bool> mask =
createMask(classes[k], Y);
42 matrix<double> Z =
rowMask(X,mask);
44 int n_samples_this_class =
nrow(Z);
45 priors(k) = double(n_samples_this_class) / n_samples;
51 n_samples_this_class, n_features,
true);
52 matrix<double> Zc = Z - temp;
55 this->covariance = this->covariance + prod(
t(Zc), Zc);
59 this->covariance = this->covariance / (n_samples - n_classes);
62 this->covarianceInv =
solve(this->covariance);
65 this->weights = prod(means,covarianceInv);
66 matrix<double> wm =
compProd(weights,means);
67 for (
unsigned int i=0; i < priors.size(); i++)
68 priors[i] = log(priors[i]);
69 this->bias = -0.5 *
rowSums(wm) + priors;
82 ublas::vector<int> LDA::use(
const ublas::matrix<double> & data)
85 ublas::matrix<double> X =
t(data);
87 int n_classes = classes.size();
88 int n_samples =
nrow(X);
91 ublas::matrix<double> disc_functions(n_samples,n_classes);
92 disc_functions = prod(X,
t(weights));
95 for (
unsigned int s = 0; s < disc_functions.size1(); s++)
96 row(disc_functions,s) = row(disc_functions,s) + bias;
99 ublas::vector<int> predicted_classes;
100 predicted_classes.resize(n_samples);
102 for(
int j=0; j<
nrow(disc_functions); j++) {
103 ublas::vector<double> disc_functionsRow = row(disc_functions,j);
104 predicted_classes[j] = classes[
whichMax(disc_functionsRow)];
113 ublas::vector<double> max_disc =
114 cppR::rowApply<double>(disc_functions,&cppR::max<double>);
118 matrix<double> max_discs =
119 createMatrix(max_disc,disc_functions.size1(),disc_functions.size2());
122 matrix<double> probabilities =
123 apply(matrix<double>(disc_functions - max_discs), exp);
129 matrix<double> sum_p_rep =
130 createMatrix(sum_p,probabilities.size1(),probabilities.size2());
131 probabilities =
compDiv(probabilities, sum_p_rep);
134 this->probabilities.resize(probabilities.size1());
135 for(
unsigned i=0;i<probabilities.size1();i++)
136 this->probabilities[i] =
137 asStdVector(ublas::vector<double>(row(probabilities,i)));
143 return predicted_classes;
152 map<string, SerializedObject> ret;
155 ret[
"covariance"] =
serialize(covariance);
156 ret[
"covarianceInv"] =
serialize(covarianceInv);
171 deserialize(objects[
"covarianceInv"],covarianceInv);
179 std::map<std::string, CEBL::Param> LDA::getParamsList()
181 std::map<std::string, CEBL::Param> params;
183 "Should LDA compute probabilities? If this is checked, LDA will need to create covariance matrices when training.",
185 params[
"probs"] = probs;
191 void LDA::setParamsList( std::map<std::string, CEBL::Param> &p)
193 compute_probs = p[
"probs"].getBool();