38 using namespace shogun;
39 using namespace Eigen;
52 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
54 "Labels must be type of CMulticlassLabels\n")
57 for (int32_t i=0;i<labels.vlen;i++)
58 REQUIRE(((labels[i]>-1)&&(labels[i]<func.
vlen/labels.vlen)),
59 "Labels must be between 0 and C(ie %d here). Currently labels[%d] is"
60 "%d\n",func.
vlen/labels.vlen,i,labels[i]);
63 Map<MatrixXd> eigen_f(func.
vector,labels.vlen,func.
vlen/labels.vlen);
66 VectorXd max_coeff=eigen_f.rowwise().maxCoeff();
67 eigen_f=eigen_f.array().colwise()-max_coeff.array();
68 VectorXd log_sum_exp=((eigen_f.array().exp()).rowwise().sum()).array().log();
69 log_sum_exp=log_sum_exp+max_coeff;
72 eigen_f=eigen_f.array().colwise()+max_coeff.array();
77 for (int32_t i=0;i<labels.vlen;i++)
78 eigen_ret(i)=eigen_f(i,labels[i]);
80 eigen_ret=eigen_ret-log_sum_exp;
89 int32_t num_cols=func.
vlen/num_rows;
93 return get_log_probability_derivative1_f(lab,f);
95 return get_log_probability_derivative2_f(f);
97 return get_log_probability_derivative3_f(f);
103 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
106 REQUIRE(lab->get_num_labels()==func.num_rows, "Number of labels must match "
107 "number of vectors in function\n")
110 for (int32_t i=0;i<labels.vlen;i++)
111 REQUIRE(((labels[i]>-1)&&(labels[i]<func.num_cols)),
112 "Labels must be between 0 and C(ie %d here). Currently labels[%d] is"
113 "%d\n",func.num_cols,i,labels[i]);
116 memcpy(ret.vector,func.matrix,func.num_rows*func.num_cols*sizeof(
float64_t));
119 Map<MatrixXd> eigen_ret(ret.vector,func.num_rows,func.num_cols);
122 VectorXd max_coeff=eigen_ret.rowwise().maxCoeff();
123 eigen_ret=eigen_ret.array().colwise()-max_coeff.array();
124 VectorXd log_sum_exp=((eigen_ret.array().exp()).rowwise().sum()).array().log();
125 eigen_ret=(eigen_ret.array().colwise()-log_sum_exp.array()).exp();
132 MatrixXd y=MatrixXd::Zero(func.num_rows,func.num_cols);
134 for (int32_t i=0;i<labels.vlen;i++)
137 eigen_ret=y-eigen_ret;
145 Map<MatrixXd> eigen_ret(ret.
vector,func.num_rows*func.num_cols,func.num_cols);
147 Map<MatrixXd> eigen_f(func.matrix,func.num_rows,func.num_cols);
149 MatrixXd f1= eigen_f.array().exp();
150 VectorXd tmp=f1.rowwise().sum();
151 f1=f1.array().colwise()/tmp.array();
153 for (int32_t i=0;i<eigen_f.rows();i++)
155 eigen_ret.block(i*eigen_f.cols(),0,eigen_f.cols(),eigen_f.cols())=
156 f1.transpose().col(i)*f1.row(i);
157 VectorXd D=eigen_ret.block(i*eigen_f.cols(),0,eigen_f.cols(),eigen_f.cols())
158 .diagonal().array().sqrt();
159 eigen_ret.block(i*eigen_f.cols(),0,eigen_f.cols(),eigen_f.cols())-=
160 MatrixXd(D.asDiagonal());
173 MatrixXd f1= eigen_f.array().exp();
174 VectorXd tmp=f1.rowwise().sum();
175 f1=f1.array().colwise()/tmp.array();
177 for (int32_t i=0;i<func.
num_rows;i++)
179 for (int32_t c1=0;c1<func.
num_cols;c1++)
181 for (int32_t c2=0;c2<func.
num_cols;c2++)
183 for (int32_t c3=0;c3<func.
num_cols;c3++)
185 float64_t sum_temp=0;
186 if ((c1==c2) && (c2==c3))
189 sum_temp=sum_temp-f1(i,c1)*f1(i,c3);
191 sum_temp=sum_temp-f1(i,c1)*f1(i,c2);
193 sum_temp=sum_temp-f1(i,c1)*f1(i,c2);
194 sum_temp+=2.0*f1(i,c1)*f1(i,c2)*f1(i,c3);
virtual SGVector< float64_t > get_log_probability_f(const CLabels *lab, SGVector< float64_t > func) const
Class that models Soft-Max likelihood.
virtual ELabelType get_label_type() const =0
The class Labels models labels, i.e. class assignments of objects.
virtual int32_t get_num_labels() const =0
multi-class labels 0,1,...
virtual SGVector< float64_t > get_log_probability_derivative_f(const CLabels *lab, SGVector< float64_t > func, index_t i) const
Multiclass Labels for multi-class classification.
virtual ~CSoftMaxLikelihood()
The Likelihood model base class.
static int32_t pow(bool x, int32_t n)