24 using namespace Eigen;
35 m_tolerance = tolerance;
36 m_store_covs = store_covs;
53 m_tolerance = tolerance;
62 m_store_covs = store_covs;
73 m_tolerance = tolerance;
74 m_store_covs = store_covs;
111 SG_ERROR(
"Specified features are not of type CDotFeatures\n")
127 VectorXd norm2(num_vecs*m_num_classes);
133 for (
int k = 0; k < m_num_classes; k++)
136 for (
int i = 0; i < num_vecs; i++)
138 vec = rf->get_feature_vector(i, vlen, vfree);
144 X.row(i) = Evec - Em_means_col;
146 rf->free_feature_vector(vec, i, vfree);
152 for (
int i = 0; i < num_vecs; i++)
153 norm2(i + k*num_vecs) = A.row(i).array().square().sum();
157 for (
int i = 0; i < num_vecs; i++)
158 for (
int k = 0; k < m_num_classes; k++)
160 norm2[i + k*num_vecs] += m_slog[k];
161 norm2[i + k*num_vecs] *= -0.5;
167 for (
int i = 0 ; i < num_vecs; i++)
176 SG_ERROR(
"No labels allocated in QDA training\n")
181 SG_ERROR(
"Speficied features are not of type CDotFeatures\n")
187 SG_ERROR(
"No features allocated in QDA training\n")
192 SG_ERROR(
"No train_labels allocated in QDA training\n")
200 if (num_vec != train_labels.
vlen)
201 SG_ERROR(
"Dimension mismatch between features and labels in QDA training")
203 int32_t* class_idxs = SG_MALLOC(int32_t, num_vec*m_num_classes);
204 int32_t* class_nums = SG_MALLOC(int32_t, m_num_classes);
205 memset(class_nums, 0, m_num_classes*
sizeof(int32_t));
208 for (
int i = 0; i < train_labels.
vlen; i++)
210 class_idx = train_labels.
vector[i];
212 if (class_idx < 0 || class_idx >= m_num_classes)
214 SG_ERROR(
"found label out of {0, 1, 2, ..., num_classes-1}...")
219 class_idxs[ class_idx*num_vec + class_nums[class_idx]++ ] = i;
223 for (
int i = 0; i < m_num_classes; i++)
225 if (class_nums[i] <= 0)
227 SG_ERROR(
"What? One class with no elements\n")
238 cov_dims[2] = m_num_classes;
249 rot_dims[2] = m_num_classes;
259 for (
int k = 0; k < m_num_classes; k++)
261 MatrixXd buffer(class_nums[k], m_dim);
263 for (
int i = 0; i < class_nums[k]; i++)
265 vec = rf->get_feature_vector(class_idxs[k*num_vec + i], vlen, vfree);
270 buffer.row(i) = Evec;
272 rf->free_feature_vector(vec, class_idxs[k*num_vec + i], vfree);
275 Em_means /= class_nums[k];
277 for (
int i = 0; i < class_nums[k]; i++)
278 buffer.row(i) -= Em_means;
284 Eigen::JacobiSVD<MatrixXd> eSvd;
285 eSvd.compute(buffer,Eigen::ComputeFullV);
286 memcpy(col, eSvd.singularValues().data(), m_dim*
sizeof(
float64_t));
287 memcpy(rot_mat, eSvd.matrixV().data(), m_dim*m_dim*
sizeof(
float64_t));
296 for (
int i = 0; i < m_dim; i++)
297 for (
int j = 0; j < m_dim; j++)
298 M(i,j)*=scalings[k*m_dim + j];
301 resE = MEig * rotE.transpose();
313 M_dims[2] = m_num_classes;
320 for (
int k = 0; k < m_num_classes; k++)
322 for (
int j = 0; j < m_dim; j++)
324 sinvsqrt[j] = 1.0 /
CMath::sqrt(scalings[k*m_dim + j]);
325 m_slog[k] +=
CMath::log(scalings[k*m_dim + j]);
328 for (
int i = 0; i < m_dim; i++)
329 for (
int j = 0; j < m_dim; j++)
331 idx = k*m_dim*m_dim + i + j*m_dim;
332 m_M[idx] = rotations[idx] * sinvsqrt[j];
static int32_t arg_max(T *vec, int32_t inc, int32_t len, T *maxv_ptr=NULL)
experimental abstract native multiclass machine class
The class Labels models labels, i.e. class assignments of objects.
virtual int32_t get_num_vectors() const =0
Features that support dot products among other operations.
T * get_matrix(index_t matIdx) const
virtual int32_t get_dim_feature_space() const =0
bool set_label(int32_t idx, float64_t label)
static void scale_vector(T alpha, T *vec, int32_t len)
Scale vector inplace.
Multiclass Labels for multi-class classification.
Class SGObject is the base class of all shogun objects.
virtual CMulticlassLabels * apply_multiclass(CFeatures *data=NULL)
static void vector_multiply(T *target, const T *v1, const T *v2, int32_t len)
Compute vector multiplication.
T * get_column_vector(index_t col) const
all of classes and functions are contained in the shogun namespace
virtual void set_features(CDotFeatures *feat)
The class Features is the base class of all feature objects.
static float64_t log(float64_t v)
virtual bool train_machine(CFeatures *data=NULL)
static float32_t sqrt(float32_t x)
bool has_property(EFeatureProperty p) const
virtual void set_labels(CLabels *lab)