def __init__(self, y, x): assert len(y) == len(x) self.prob = prob = svmc.new_svm_problem() self.size = size = len(y) self.y_array = y_array = svmc.new_double(size) for i in xrange(size): svmc.double_setitem(y_array, i, y[i]) self.x_matrix = x_matrix = svmc.svm_node_matrix(size) data = [None for i in xrange(size)] maxlen = 0 for i in xrange(size): x_i = x[i] lx_i = len(x_i) data[i] = d = seq_to_svm_node(x_i) svmc.svm_node_matrix_set(x_matrix, i, d) if isinstance(x_i, dict): if (lx_i > 0): maxlen = max(maxlen, max(x_i.keys())) else: maxlen = max(maxlen, lx_i) # bind to instance self.data = data self.maxlen = maxlen svmc.svm_problem_l_set(prob, size) svmc.svm_problem_y_set(prob, y_array) svmc.svm_problem_x_set(prob, x_matrix)
def predict_values_raw(self, x): #convert x into SVMNode, allocate a double array for return n = self.nr_class*(self.nr_class-1)//2 data = seq_to_svm_node(x) dblarr = svmc.new_double(n) svmc.svm_predict_values(self.model, data, dblarr) ret = double_array_to_list(dblarr, n) svmc.delete_double(dblarr) svmc.svm_node_array_destroy(data) return ret
def predict_values_raw(self, x): #convert x into SVMNode, allocate a double array for return n = self.nr_class * (self.nr_class - 1) // 2 data = seq_to_svm_node(x) dblarr = svmc.new_double(n) svmc.svm_predict_values(self.model, data, dblarr) ret = double_array_to_list(dblarr, n) svmc.delete_double(dblarr) svmc.svm_node_array_destroy(data) return ret
def predict_probability(self, x): #c code will do nothing on wrong type, so we have to check ourself if self.svm_type == NU_SVR or self.svm_type == EPSILON_SVR: raise TypeError, "call get_svr_probability or get_svr_pdf " \ "for probability output of regression" elif self.svm_type == ONE_CLASS: raise TypeError, "probability not supported yet for one-class " \ "problem" #only C_SVC, NU_SVC goes in if not self.probability: raise TypeError, "model does not support probabiliy estimates" #convert x into SVMNode, alloc a double array to receive probabilities data = seq_to_svm_node(x) dblarr = svmc.new_double(self.nr_class) pred = svmc.svm_predict_probability(self.model, data, dblarr) pv = double_array_to_list(dblarr, self.nr_class) svmc.delete_double(dblarr) svmc.svm_node_array_destroy(data) p = {} for i in range(len(self.labels)): p[self.labels[i]] = pv[i] return pred, p
def double_array(seq): size = len(seq) array = svmc.new_double(size) for i, item in enumerate(seq): svmc.double_setitem(array, i, item) return array