16 using namespace shogun;
29 m_num_plif_nodes = 20;
30 m_use_plifs = use_plifs;
39 SG_ERROR(
"The EStateModelType given is not valid\n")
57 return free_states*(free_states + D*m_num_plif_nodes);
59 return free_states*(free_states + D*m_num_obs);
79 m_transmission_weights.
zero();
81 for ( int32_t i = 0 ; i < state_seq.
vlen-1 ; ++i )
82 m_transmission_weights(state_seq[i],state_seq[i+1]) += 1;
86 "obs.num_rows (%d) != D (%d) OR obs.num_cols (%d) != state_seq.vlen (%d)\n",
88 m_emission_weights.
zero();
93 for ( int32_t f = 0 ; f < D ; ++f )
95 aux_idx = f*m_num_obs;
97 for ( int32_t j = 0 ; j < state_seq.
vlen ; ++j )
99 weight_idx = aux_idx + state_seq[j]*D*m_num_obs + obs(f,j);
100 m_emission_weights[weight_idx] += 1;
104 m_state_model->
weights_to_vector(psi, m_transmission_weights, m_emission_weights,
111 for ( int32_t f = 0 ; f < D ; ++f )
113 aux_idx = f*m_num_plif_nodes;
115 for ( int32_t j = 0 ; j < state_seq.
vlen ; ++j )
124 for ( int32_t i = 0 ; i < m_num_plif_nodes ; ++i )
126 if ( limits[i] <= value )
132 weight_idx = aux_idx + state_seq[j]*D*m_num_plif_nodes;
135 m_emission_weights[weight_idx] += 1;
136 else if ( count == m_num_plif_nodes )
137 m_emission_weights[weight_idx + m_num_plif_nodes-1] += 1;
140 m_emission_weights[weight_idx + count] +=
141 (value-limits[count-1]) / (limits[count]-limits[count-1]);
143 m_emission_weights[weight_idx + count-1] +=
144 (limits[count]-value) / (limits[count]-limits[count-1]);
151 m_state_model->
weights_to_vector(psi, m_transmission_weights, m_emission_weights,
152 D, m_num_plif_nodes);
174 REQUIRE(m_plif_matrix,
"PLiF matrix not allocated, has the SO machine been trained with "
175 "the use_plifs option?\n");
177 "feature dimension and/or number of states changed from training to prediction?\n");
199 for ( int32_t i = 0 ; i < T ; ++i )
201 for ( int32_t j = 0 ; j < D ; ++j )
206 for ( int32_t s = 0 ; s < S ; ++s )
207 E(s,i) += m_emission_weights[s*D*m_num_obs + em_idx];
215 for ( int32_t i = 0 ; i < T ; ++i )
217 for ( int32_t f = 0 ; f < D ; ++f )
219 for ( int32_t s = 0 ; s < S ; ++s )
222 E(s,i) += plif->
lookup( x(f,i) );
236 "x^i (%d) and the length of its corresponding label y^i "
237 "(%d) must be the same.\n", T, ytrue->
get_data().
size());
242 loss_matrix.num_cols == E.
num_cols);
256 for ( int32_t s = 0 ; s < S ; ++s )
273 for ( int32_t i = 1 ; i < T ; ++i )
275 for ( int32_t cur = 0 ; cur < S ; ++cur )
285 for ( int32_t prev = 0 ; prev < S ; ++prev )
288 a = m_transmission_weights[cur*S + prev];
293 tmp_score = e + a + dp[prev*T + i-1];
295 if ( tmp_score > dp[idx] )
312 for ( int32_t s = 0 ; s < S ; ++s )
318 ret->
score = dp[idx];
323 REQUIRE(opt_path[T-1]!=-1,
"Viterbi decoding found no possible sequence states.\n"
324 "Maybe the state model used cannot produce such sequence.\n"
325 "If using the TwoStateModel, please use sequences of length greater than two.\n");
327 for ( int32_t i = T-1 ; i > 0 ; --i )
328 opt_path[i-1] = trb[opt_path[i]*T + i];
353 return m_state_model->
loss(seq1, seq2);
377 float64_t C_smooth = 0.02*regularization;
381 for ( int32_t i = 0 ; i <
get_dim() ; ++i )
396 int32_t
delta = m_use_plifs ? m_num_plif_nodes : m_num_obs;
397 for ( int32_t idx = S*S, k = 0 ; k < S*D ; idx +=
delta, ++k )
398 score_starts[k] = idx;
402 for ( int32_t idx =
get_dim(), k = 0 ; k < S*D ; idx += delta-1, ++k )
403 aux_starts_smooth[k] = idx;
409 int32_t con_idx = 0, scr_idx, aux_idx;
411 for ( int32_t i = 0 ; i < score_starts.
vlen ; ++i )
413 scr_idx = score_starts[i];
414 aux_idx = aux_starts_smooth[i];
416 for ( int32_t j = 0 ; j < delta-1 ; ++j )
418 A(con_idx, scr_idx) = 1;
419 A(con_idx, scr_idx+1) = -1;
421 if ( monotonicity[i] != 1 )
422 A(con_idx, aux_idx) = -1;
425 A(con_idx, scr_idx) = -1;
426 A(con_idx, scr_idx+1) = 1;
428 if ( monotonicity[i] != -1 )
429 A(con_idx, aux_idx) = -1;
432 ++scr_idx, ++aux_idx;
456 for ( int32_t j = 0 ; j < seq_data.size() ; ++j )
462 SG_ERROR(
"Found state out of {0, 1, ..., "
478 if ( state_freq[i] <= 0 )
480 SG_ERROR(
"What? State %d has never appeared\n", i)
488 void CHMSVMModel::init()
491 SG_ADD(&m_transmission_weights,
"m_transmission_weights",
493 SG_ADD(&m_emission_weights,
"m_emission_weights",
495 SG_ADD(&m_num_plif_nodes,
"m_num_plif_nodes",
"The number of points per PLiF",
502 m_state_model = NULL;
503 m_plif_matrix = NULL;
504 m_num_plif_nodes = 0;
519 m_use_plifs = use_plifs;
541 m_num_aux = free_states*D*(m_num_plif_nodes-1);
543 m_num_aux = free_states*D*(m_num_obs-1);
564 for ( int32_t i = 0 ; i < signal_idxs.
vlen ; ++i )
569 for ( int32_t f = 0 ; f < D ; ++f )
576 for ( int32_t j = 0 ; j < feat_vec.
num_cols ; ++j )
577 signal[idx++] = feat_vec(f,j);
582 for ( int32_t i = 0 ; i < m_num_plif_nodes ; ++i )
583 limits[i] = signal[ signal_idxs[i] ];
586 for ( int32_t s = 0 ; s < S ; ++s )
600 return m_transmission_weights;
605 return m_emission_weights;
611 return m_state_model;