@@ -94,26 +94,29 @@ class ParallelCalcError : public ParallelLoopBody
94
94
int idxErr = range.start ;
95
95
CV_TRACE_FUNCTION_SKIP_NESTED ();
96
96
Mat samples = data->getSamples ();
97
+ Mat weights=testerr? data->getTestSampleWeights () : data->getTrainSampleWeights ();
97
98
int layout = data->getLayout ();
98
99
Mat sidx = testerr ? data->getTestSampleIdx () : data->getTrainSampleIdx ();
99
100
const int * sidx_ptr = sidx.ptr <int >();
100
101
bool isclassifier = s.isClassifier ();
101
102
Mat responses = data->getResponses ();
102
103
int responses_type = responses.type ();
103
-
104
104
double err = 0 ;
105
105
106
+
107
+ const float * sw = weights.empty () ? 0 : weights.ptr <float >();
106
108
for (int i = range.start ; i < range.end ; i++)
107
109
{
108
110
int si = sidx_ptr ? sidx_ptr[i] : i;
111
+ double sweight = sw ? static_cast <double >(sw[i]) : 1 .;
109
112
Mat sample = layout == ROW_SAMPLE ? samples.row (si) : samples.col (si);
110
113
float val = s.predict (sample);
111
114
float val0 = (responses_type == CV_32S) ? (float )responses.at <int >(si) : responses.at <float >(si);
112
115
113
116
if (isclassifier)
114
- err += fabs (val - val0) > FLT_EPSILON;
117
+ err += sweight * fabs (val - val0) > FLT_EPSILON;
115
118
else
116
- err += (val - val0)*(val - val0);
119
+ err += sweight * (val - val0)*(val - val0);
117
120
if (!resp.empty ())
118
121
resp.at <float >(i) = val;
119
122
}
@@ -133,12 +136,17 @@ float StatModel::calcError(const Ptr<TrainData>& data, bool testerr, OutputArray
133
136
CV_TRACE_FUNCTION_SKIP_NESTED ();
134
137
Mat samples = data->getSamples ();
135
138
Mat sidx = testerr ? data->getTestSampleIdx () : data->getTrainSampleIdx ();
139
+ Mat weights = testerr ? data->getTestSampleWeights () : data->getTrainSampleWeights ();
136
140
int n = (int )sidx.total ();
137
141
bool isclassifier = isClassifier ();
138
142
Mat responses = data->getResponses ();
139
143
140
144
if (n == 0 )
145
+ {
141
146
n = data->getNSamples ();
147
+ weights = data->getTrainSampleWeights ();
148
+ testerr =false ;
149
+ }
142
150
143
151
if (n == 0 )
144
152
return -FLT_MAX;
@@ -155,11 +163,11 @@ float StatModel::calcError(const Ptr<TrainData>& data, bool testerr, OutputArray
155
163
156
164
for (size_t i = 0 ; i < errStrip.size (); i++)
157
165
err += errStrip[i];
158
-
166
+ float weightSum= weights. empty () ? n: static_cast < float >( sum (weights)( 0 ));
159
167
if (_resp.needed ())
160
168
resp.copyTo (_resp);
161
169
162
- return (float )(err / n * (isclassifier ? 100 : 1 ));
170
+ return (float )(err/ weightSum * (isclassifier ? 100 : 1 ));
163
171
}
164
172
165
173
/* Calculates upper triangular matrix S, where A is a symmetrical matrix A=S'*S */
0 commit comments