/usr/include/shogun/distributions/LinearHMM.h is in libshogun-dev 3.2.0-7.5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | /*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Written (W) 1999-2009 Soeren Sonnenburg
* Written (W) 1999-2008 Gunnar Raetsch
* Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
*/
#ifndef _LINEARHMM_H__
#define _LINEARHMM_H__
#include <shogun/features/StringFeatures.h>
#include <shogun/labels/Labels.h>
#include <shogun/distributions/Distribution.h>
namespace shogun
{
/** @brief The class LinearHMM is for learning Higher Order Markov chains.
*
* While learning the parameters \f${\bf \theta}\f$ in
*
* \f{eqnarray*}
* P({\bf x}|{\bf \theta}^\pm)&=&P(x_1, \ldots, x_N|{\bf \theta}^\pm)\\
* &=&P(x_1,\ldots,x_{d}|{\bf \theta}^\pm)\prod_{i=d+1}^N
* P(x_i|x_{i-1},\ldots,x_{i-d},{\bf \theta}^\pm)
* \f}
*
* are determined.
*
* A more detailed description can be found in
*
* Durbin et.al, Biological Sequence Analysis -Probabilistic Models of Proteins
* and Nucleic Acids, 1998
*
* */
class CLinearHMM : public CDistribution
{
public:
/** default constructor */
CLinearHMM();
/** constructor
*
* @param f features to use
*/
CLinearHMM(CStringFeatures<uint16_t>* f);
/** constructor
*
* @param p_num_features number of features
* @param p_num_symbols number of symbols in features
*/
CLinearHMM(int32_t p_num_features, int32_t p_num_symbols);
virtual ~CLinearHMM();
/** estimate LinearHMM distribution
*
* @param data training data (parameter can be avoided if distance or
* kernel-based classifiers are used and distance/kernels are
* initialized with train data)
*
* @return whether training was successful
*/
virtual bool train(CFeatures* data=NULL);
/** alternative train distribution
*
* @param indizes indices
* @param num_indizes number of indices
* @param pseudo_count pseudo count
* @return if training was successful
*/
bool train(
const int32_t* indizes, int32_t num_indizes,
float64_t pseudo_count);
/** get logarithm of one example's likelihood
*
* @param vector the example
* @param len length of vector
* @return logarithm of likelihood
*/
float64_t get_log_likelihood_example(uint16_t* vector, int32_t len);
/** get one example's likelihood
*
* @param vector the example
* @param len length of vector
* @return likelihood
*/
float64_t get_likelihood_example(uint16_t* vector, int32_t len);
/** compute likelihood for example
*
* @param num_example which example
* @return likelihood for example
*/
float64_t get_likelihood_example(int32_t num_example);
/** get logarithm of one example's likelihood
*
* @param num_example which example
* @return logarithm of example's likelihood
*/
virtual float64_t get_log_likelihood_example(int32_t num_example);
/** get logarithm of one example's derivative's likelihood
*
* @param num_param which example's param
* @param num_example which example
* @return logarithm of example's derivative
*/
virtual float64_t get_log_derivative(
int32_t num_param, int32_t num_example);
/** obsolete get logarithm of one example's derivative's
* likelihood
*
* @param obs observation
* @param pos position
*/
virtual float64_t get_log_derivative_obsolete(
uint16_t obs, int32_t pos)
{
return 1.0/transition_probs[pos*num_symbols+obs];
}
/** obsolete get one example's derivative
*
* @param vector vector
* @param len length
* @param pos position
*/
virtual float64_t get_derivative_obsolete(
uint16_t* vector, int32_t len, int32_t pos)
{
ASSERT(pos<len)
return get_likelihood_example(vector, len)/transition_probs[pos*num_symbols+vector[pos]];
}
/** get sequence length of each example
*
* @return sequence length of each example
*/
virtual int32_t get_sequence_length() { return sequence_length; }
/** get number of symbols in examples
*
* @return number of symbols in examples
*/
virtual int32_t get_num_symbols() { return num_symbols; }
/** get number of model parameters
*
* @return number of model parameters
*/
virtual int32_t get_num_model_parameters() { return num_params; }
/** get positional log parameter
*
* @param obs observation
* @param position position
* @return positional log parameter
*/
virtual float64_t get_positional_log_parameter(
uint16_t obs, int32_t position)
{
return log_transition_probs[position*num_symbols+obs];
}
/** get logarithm of given model parameter
*
* @param num_param which param
* @result logarithm of given model parameter
*/
virtual float64_t get_log_model_parameter(int32_t num_param)
{
ASSERT(log_transition_probs)
ASSERT(num_param<num_params)
return log_transition_probs[num_param];
}
/** get logarithm of all transition probs
*
* @return logarithm of transition probs vector
*/
virtual SGVector<float64_t> get_log_transition_probs();
/** set logarithm of all transition probs
*
* @param probs new logarithm transition probs
* @return if setting was successful
*/
virtual bool set_log_transition_probs(const SGVector<float64_t> probs);
/** get all transition probs
*
* @return vector of transition probs
*/
virtual SGVector<float64_t> get_transition_probs();
/** set all transition probs
*
* @param probs new transition probs
* @return if setting was successful
*/
virtual bool set_transition_probs(const SGVector<float64_t> probs);
/** @return object name */
virtual const char* get_name() const { return "LinearHMM"; }
protected:
virtual void load_serializable_post() throw (ShogunException);
private:
void init();
protected:
/** examples' sequence length */
int32_t sequence_length;
/** number of symbols in examples */
int32_t num_symbols;
/** number of parameters */
int32_t num_params;
/** transition probs */
float64_t* transition_probs;
/** logarithm of transition probs */
float64_t* log_transition_probs;
};
}
#endif
|