def estNum(neigh,epsilon): m=len(neigh); if epsilon<0: return len([i for i in neigh if i>0]); sc=[0.0 for i in range(0,m+1)]; for i in range(0,m): if neigh[i]>0: sc[i]=-epsilon*neigh[i]/2.0; else: sc[i]=epsilon*(neigh[i]-1)/2.0; for i in range(0,m+1): sc[i]=math.exp(sc[i]); sm=sum(sc); sc=[i/sm for i in sc] multi=mult(1,sc); ret=min([i for i in range(0,m+1) if multi[i]>0]); if ret==m: return len([i for i in neigh if i>0]); val=neigh[ret]; v1=len([i for i in neigh if i>val]); v2=len([i for i in neigh if i==val]); return rand.randint(v1,v1+v2-1);
def estNum(MU,y,pval,epsilon): #bnd_sc=math.sqrt(chi2.ppf((1.0-pval),df=1)); bnd_sc=math.sqrt(pval); ret=MU.normY(y); nm=ret[0]; sen=ret[1]; n=len(y); if sen>0: bnd_est=bnd_sc*abs(nm+Lap(0.0,2.0*sen/epsilon)); if MU.k>0: bnd_est=bnd_est/math.sqrt(n-MU.k-1); else: bnd_est=bnd_sc*nm; neigh=MU.neighDist(y,bnd_est); m=len(neigh); if epsilon<0: return len([i for i in neigh if i>0]); sc=[0.0 for i in range(0,m+1)]; for i in range(0,m): if neigh[i]>0: sc[i]=-epsilon*neigh[i]/4.0; else: sc[i]=epsilon*(neigh[i]-1)/4.0; for i in range(0,m+1): sc[i]=math.exp(sc[i]); sm=sum(sc); sc=[i/sm for i in sc] multi=mult(1,sc); ret=min([i for i in range(0,m+1) if multi[i]>0]); if ret==m: return len([i for i in neigh if i>0]); val=neigh[ret]; v1=len([i for i in neigh if i>val]); v2=len([i for i in neigh if i==val]); return rand.randint(v1,v1+v2-1);
def expPick(sc,mret): m=len(sc); fnd=[0 for i in range(0,mret)] scores=[s for s in sc] for i in range(0,mret): ms=max(scores); scores=[s-ms for s in scores]; prb=[math.exp(s) for s in scores]; sm=sum(prb); prb=[s/sm for s in prb]; while sum(prb)>1: sm=sum(prb); prb=[s/sm for s in prb]; mlt=mult(1,prb); k=min([k for k in range(0,m) if mlt[k]>0]); fnd[i]=k; scores[k]=-float("inf");
def sample(self, N=100, shuffle=True): """ Generate N samples from the model. Returns three numpy arrays: z2 of size (N,) with cluster assignments, x = (N,d) with the observations, and z with the cluster counts (used for debugging only). """ z = mult(N, self.phi, size=1).reshape(self.K) # these are the cluster assignments x = np.zeros((N, self.d)) z2 = np.zeros( N, dtype=int) # To rexpress z as vector with cluster assignments ct = 0 for k in np.arange(self.K): x[ct:ct + z[k], :] = mnorm(self.mu[k], self.Sigma[k], z[k]) z2[ct:ct + z[k]] = k ct += z[k] if shuffle: idx = np.random.permutation(np.arange(N)) z2 = z2[idx] x = x[idx, :] return (z2, x, z)
def expPick(sc,mret): m=len(sc); fnd=[0 for i in range(0,mret)] scores=[s for s in sc] for i in range(0,mret): ms=max(scores); scores=[s-ms for s in scores]; prb=[math.exp(s) for s in scores]; sm=sum(prb); prb=[s/sm for s in prb]; while sum(prb)>1: sm=sum(prb); prb=[s/sm for s in prb]; mlt=mult(1,prb); k=min([k for k in range(0,m) if mlt[k]>0]); fnd[i]=k; scores[k]=-float("inf"); return fnd;
def expPick(sc, mret): m = len(sc) fnd = [0 for i in range(0, mret)] scores = [s for s in sc] for i in range(0, mret): ms = max(scores) scores = [s - ms for s in scores] prb = [math.exp(s) for s in scores] sm = sum(prb) prb = [s / sm for s in prb] while sum(prb) > 1: sm = sum(prb) prb = [s / sm for s in prb] mlt = mult(1, prb) k = min([k for k in range(0, m) if mlt[k] > 0]) fnd[i] = k scores[k] = -float("inf") return fnd
def estNum(MU, y, pval, epsilon): #bnd_sc=math.sqrt(chi2.ppf((1.0-pval),df=1)); bnd_sc = math.sqrt(pval) ret = MU.normY(y) nm = ret[0] sen = ret[1] n = len(y) if sen > 0: bnd_est = bnd_sc * abs(nm + Lap(0.0, 2.0 * sen / epsilon)) if MU.k > 0: bnd_est = bnd_est / math.sqrt(n - MU.k - 1) else: bnd_est = bnd_sc * nm neigh = MU.neighDist(y, bnd_est) m = len(neigh) if epsilon < 0: return len([i for i in neigh if i > 0]) sc = [0.0 for i in range(0, m + 1)] for i in range(0, m): if neigh[i] > 0: sc[i] = -epsilon * neigh[i] / 4.0 else: sc[i] = epsilon * (neigh[i] - 1) / 4.0 for i in range(0, m + 1): sc[i] = math.exp(sc[i]) sm = sum(sc) sc = [i / sm for i in sc] multi = mult(1, sc) ret = min([i for i in range(0, m + 1) if multi[i] > 0]) if ret == m: return len([i for i in neigh if i > 0]) val = neigh[ret] v1 = len([i for i in neigh if i > val]) v2 = len([i for i in neigh if i == val]) return rand.randint(v1, v1 + v2 - 1)
def estNum(MU,y,pval,epsilon): bnd_sc=math.sqrt(chi2.ppf((1.0-pval),df=1)); [nm,sen]=MU.normY(self,y); if sen>0: bnd_est=bnd_sc*abs(nm+Lap(0.0,2.0*sen/epsilon)); else: bnd_est=bnd_sc*nm; neigh=MU.neighDist(y,bnd_est); m=len(neigh); if epsilon<0: return len([i for i in neigh if i>0]); sc=[0.0 for i in range(0,m+1)]; for i in range(0,m): if neigh[i]>0: sc[i]=-.5*epsilon*neigh[i]/2.0; else: sc[i]=.5*epsilon*(neigh[i]-1)/2.0; for i in range(0,m+1): sc[i]=math.exp(sc[i]); sm=sum(sc); sc=[i/sm for i in sc] multi=mult(1,sc); ret=min([i for i in range(0,m+1) if multi[i]>0]); if ret==m: return len([i for i in neigh if i>0]); val=neigh[ret]; v1=len([i for i in neigh if i>val]); v2=len([i for i in neigh if i==val]); return rand.randint(v1,v1+v2-1);