| 38 | |
| 39 | |
| 40 | class AdaBoost(object): |
| 41 | |
| 42 | def __init__(self): |
| 43 | ll = ctypes.cdll.LoadLibrary |
| 44 | self.lib = ll("Sign/x64/Release/Sign.dll") |
| 45 | |
| 46 | def rebuild_X(self,X): |
| 47 | length = self.n*self.N |
| 48 | self.X_matrix = (ctypes.c_int * length)() |
| 49 | |
| 50 | for i in xrange(self.n): |
| 51 | for j in xrange(self.N): |
| 52 | self.X_matrix[i*self.N+j] = X[j][i] |
| 53 | |
| 54 | def rebuild_Y(self,Y): |
| 55 | self.C_Y = (ctypes.c_int * self.N)() |
| 56 | for i in xrange(self.N): |
| 57 | self.C_Y[i] = Y[i] |
| 58 | |
| 59 | |
| 60 | def _init_parameters_(self,features,labels): |
| 61 | self.Y = labels |
| 62 | |
| 63 | self.n = len(features[0]) |
| 64 | self.N = len(features) |
| 65 | self.M = 100 # 分类器数目 |
| 66 | |
| 67 | self.w = [1.0/self.N]*self.N |
| 68 | self.alpha = [] |
| 69 | self.classifier = [] |
| 70 | |
| 71 | self.rebuild_X(features) |
| 72 | self.rebuild_Y(labels) |
| 73 | |
| 74 | def _w_(self,index,classifier,i): |
| 75 | feature = self.X_matrix[index*self.N+i] |
| 76 | return self.w[i]*math.exp(-self.alpha[-1]*self.Y[i]*classifier.predict(feature)) |
| 77 | |
| 78 | def _Z_(self,index,classifier): |
| 79 | Z = 0 |
| 80 | |
| 81 | for i in xrange(self.N): |
| 82 | Z += self._w_(index,classifier,i) |
| 83 | |
| 84 | return Z |
| 85 | |
| 86 | def build_c_w(self): |
| 87 | C_w = (ctypes.c_double * self.N)() |
| 88 | for i in xrange(self.N): |
| 89 | C_w[i] = ctypes.c_double(self.w[i]) |
| 90 | return C_w |
| 91 | |
| 92 | def train(self,features,labels): |
| 93 | |
| 94 | self._init_parameters_(features,labels) |
| 95 | |
| 96 | for times in xrange(self.M): |
| 97 | logging.debug('iterater %d' % times) |