22 using namespace shogun;
47 SG_ERROR(
"Specified features are not of type CDotFeatures\n");
58 int32_t* classidx_neg=
SG_MALLOC(int32_t, num_vec);
59 int32_t* classidx_pos=
SG_MALLOC(int32_t, num_vec);
65 for (i=0; i<train_labels.
vlen; i++)
67 if (train_labels.
vector[i]==-1)
68 classidx_neg[num_neg++]=i;
69 else if (train_labels.
vector[i]==+1)
70 classidx_pos[num_pos++]=i;
73 SG_ERROR(
"found label != +/- 1 bailing...");
78 if (num_neg<=0 || num_pos<=0)
80 SG_ERROR(
"whooooo ? only a single class found\n");
87 memset(mean_neg,0,num_feat*
sizeof(
float64_t));
90 memset(mean_pos,0,num_feat*
sizeof(
float64_t));
93 double* scatter=
SG_MALLOC(
double, num_feat*num_feat);
95 int nf = (int) num_feat;
99 for (i=0; i<num_neg; i++)
107 for (j=0; j<vlen; j++)
110 buffer[num_feat*i+j]=vec[j];
116 for (j=0; j<num_feat; j++)
117 mean_neg[j]/=num_neg;
119 for (i=0; i<num_neg; i++)
121 for (j=0; j<num_feat; j++)
122 buffer[num_feat*i+j]-=mean_neg[j];
124 cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, nf, nf,
125 (
int) num_neg, 1.0, buffer, nf, buffer, nf, 0, scatter, nf);
128 for (i=0; i<num_pos; i++)
136 for (j=0; j<vlen; j++)
139 buffer[num_feat*i+j]=vec[j];
145 for (j=0; j<num_feat; j++)
146 mean_pos[j]/=num_pos;
148 for (i=0; i<num_pos; i++)
150 for (j=0; j<num_feat; j++)
151 buffer[num_feat*i+j]-=mean_pos[j];
153 cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, nf, nf, (
int) num_pos,
154 1.0/(train_labels.
vlen-1), buffer, nf, buffer, nf,
155 1.0/(train_labels.
vlen-1), scatter, nf);
160 for (i=0; i<num_feat*num_feat; i++)
163 for (i=0; i<num_feat; i++)
164 scatter[i*num_feat+i]+= trace*
m_gamma/num_feat;
167 scatter, num_feat, num_feat, NULL);
172 cblas_dsymv(CblasColMajor, CblasUpper, nf, 1.0, inv_scatter, nf,
173 (
double*) mean_pos, 1, 0., (
double*) w_pos, 1);
174 cblas_dsymv(CblasColMajor, CblasUpper, nf, 1.0, inv_scatter, nf,
175 (
double*) mean_neg, 1, 0, (
double*) w_neg, 1);
178 for (i=0; i<num_feat; i++)