Skip to content

Commit

Permalink
Made MulticlassRiskFunction use COFFIN operations and fixed reference…
Browse files Browse the repository at this point in the history
… count for data in dual lib qpbmsosvm
  • Loading branch information
lisitsyn committed Aug 14, 2012
1 parent 122079a commit d16ae4b
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/shogun/structure/DualLibQPBMSOSVM.cpp
Expand Up @@ -45,6 +45,7 @@ CDualLibQPBMSOSVM::CDualLibQPBMSOSVM(

// risk data
m_risk_data=risk_data;
SG_REF(m_risk_data);

// get dimension of w
uint32_t nDim=this->m_model->get_dim();
Expand Down
20 changes: 6 additions & 14 deletions src/shogun/structure/MulticlassRiskFunction.cpp
Expand Up @@ -67,10 +67,8 @@ void CMulticlassRiskFunction::risk(
const uint32_t w_dim=data_struct->m_w_dim;

*R=0;
SGVector< float64_t > subgradient(w_dim);
subgradient.zero();

SGVector< float64_t > xi;
for (uint32_t i=0; i<w_dim; i++)
subgrad[i] = 0;

float64_t Rtmp=0.0;
float64_t Rmax=0.0;
Expand All @@ -82,14 +80,13 @@ void CMulticlassRiskFunction::risk(
for(uint32_t i=from; i<to; ++i)
{
Rmax=-CMath::INFTY;
xi=X->get_computed_dot_feature_vector(i);
GT=(uint32_t)((CRealNumber*)y->get_label(i))->value;

for (uint32_t c = 0; c < num_classes; ++c)
{
loss=(c == GT) ? 0.0 : 1.0;
Rtmp=loss+SGVector< float64_t >::dot(W+c*feats_dim, xi.vector, feats_dim)
-SGVector< float64_t >::dot(W+GT*feats_dim, xi.vector, feats_dim);
Rtmp=loss+X->dense_dot(i, W+c*feats_dim, feats_dim)
-X->dense_dot(i, W+GT*feats_dim, feats_dim);

if (Rtmp > Rmax)
{
Expand All @@ -99,12 +96,7 @@ void CMulticlassRiskFunction::risk(
}
*R += Rmax;

for(uint32_t j = 0; j < feats_dim; ++j)
{
subgradient[yhat*feats_dim+j]+=xi[j];
subgradient[GT*feats_dim+j]-=xi[j];
}

X->add_to_dense_vec(1.0, i, subgrad+yhat*feats_dim, feats_dim);
X->add_to_dense_vec(-1.0, i, subgrad+GT*feats_dim, feats_dim);
}
memcpy(subgrad, subgradient.vector, w_dim*sizeof(float64_t));
}

0 comments on commit d16ae4b

Please sign in to comment.