def fit_probability_sigmoid(self, neg): print('Fitting probablity sigmoid to {} detector'.format(self.cls)) #apply calibration pos = self.pos * self.calib_params[0] + self.calib_params[1] neg = neg * self.calib_params[0] + self.calib_params[1] num_pos = len(pos) num_neg = len(neg) X = np.hstack((pos, neg)) y = np.hstack((np.ones(num_pos), -np.ones(num_neg))) #enforce max ratio between neg and pos example num if (num_neg / num_pos) > self.cfg.MAX_RATIO_NEG_POS: curr_pos_w = self.pos_weight * (num_neg / num_pos) * ( 1 / self.cfg.MAX_RATIO_NEG_POS) curr_neg_w = 1. else: curr_pos_w = self.pos_weight curr_neg_w = 1. weights = ([curr_pos_w] * num_pos) + ([curr_neg_w] * num_neg) A, B = _sigmoid_calibration(X, y, sample_weight=np.asarray(weights)) #A,B = _sigmoid_calibration(X, y, sample_weight=None) #TODO-maybe these should be saved seperatly? self.sigmoid_params = [ A, B, self.calib_params[0], self.calib_params[1] ] #self.evaluate_sigmoid_match(X_test,y_test,A,B) print('Sigmoid parameters : {},{}'.format(self.sigmoid_params[0], self.sigmoid_params[1]))
def fit_probability_sigmoid(self,neg): print('Fitting probablity sigmoid to {} detector'.format(self.cls)) pos = self.pos num_pos = pos.shape[0] num_neg = neg.shape[0] X = np.vstack((pos, neg)) * self.feature_scale y = np.hstack((np.ones(num_pos),-np.ones(num_neg))) A,B = _sigmoid_calibration(self.svm.decision_function(X), y, sample_weight=None) self.sigmoid_params = [A,B] #self.evaluate_sigmoid_match(X_test,y_test,A,B) print('Sigmoid parameters : {},{}'.format(self.sigmoid_params[0],self.sigmoid_params[1]))
def fit_probability_sigmoid(self, neg): print('Fitting probablity sigmoid to {} detector'.format(self.cls)) pos = self.pos num_pos = pos.shape[0] num_neg = neg.shape[0] X = np.vstack((pos, neg)) * self.feature_scale y = np.hstack((np.ones(num_pos), -np.ones(num_neg))) A, B = _sigmoid_calibration(self.svm.decision_function(X), y, sample_weight=None) self.sigmoid_params = [A, B] #self.evaluate_sigmoid_match(X_test,y_test,A,B) print('Sigmoid parameters : {},{}'.format(self.sigmoid_params[0], self.sigmoid_params[1]))
def test_sigmoid_calibration(): """Test calibration values with Platt sigmoid model""" exF = np.array([5, -4, 1.0]) exY = np.array([1, -1, -1]) # computed from my python port of the C++ code in LibSVM AB_lin_libsvm = np.array([-0.20261354391187855, 0.65236314980010512]) assert_array_almost_equal(AB_lin_libsvm, _sigmoid_calibration(exF, exY), 3) lin_prob = 1. / (1. + np.exp(AB_lin_libsvm[0] * exF + AB_lin_libsvm[1])) sk_prob = _SigmoidCalibration().fit(exF, exY).predict(exF) assert_array_almost_equal(lin_prob, sk_prob, 6) # check that _SigmoidCalibration().fit only accepts 1d array or 2d column # arrays assert_raises(ValueError, _SigmoidCalibration().fit, np.vstack((exF, exF)), exY)
def fit_probability_sigmoid(self,neg): print('Fitting probablity sigmoid to {} detector'.format(self.cls)) #apply calibration pos = self.pos * self.calib_params[0] + self.calib_params[1] neg = neg * self.calib_params[0] + self.calib_params[1] num_pos = len(pos) num_neg = len(neg) X = np.hstack((pos,neg)) y = np.hstack((np.ones(num_pos),-np.ones(num_neg))) #enforce max ratio between neg and pos example num if (num_neg/num_pos)>self.cfg.MAX_RATIO_NEG_POS: curr_pos_w = self.pos_weight * (num_neg / num_pos) * (1 / self.cfg.MAX_RATIO_NEG_POS) curr_neg_w = 1. else: curr_pos_w = self.pos_weight curr_neg_w = 1. weights = ([curr_pos_w] * num_pos) + ([curr_neg_w] * num_neg) A,B = _sigmoid_calibration(X, y, sample_weight=np.asarray(weights)) #A,B = _sigmoid_calibration(X, y, sample_weight=None) #TODO-maybe these should be saved seperatly? self.sigmoid_params = [A,B,self.calib_params[0],self.calib_params[1]] #self.evaluate_sigmoid_match(X_test,y_test,A,B) print('Sigmoid parameters : {},{}'.format(self.sigmoid_params[0],self.sigmoid_params[1]))
def fit(self, x, y): self.a, self.b = _sigmoid_calibration(x, y) return self