Download v21graph/ppr.py from Eric-Yyvuw/yeepee-ctr: direct link, hf CLI and curl.
- Browser
- Download file 1.73 kB
-
https://huggingface.co/Eric-Yyvuw/yeepee-ctr/resolve/main/v21graph/ppr.py
- Command line
-
hf download hf://Eric-Yyvuw/yeepee-ctr/v21graph/ppr.py
-
curl -L -o ppr.py https://huggingface.co/Eric-Yyvuw/yeepee-ctr/resolve/main/v21graph/ppr.py
1.73 kB
| """item-item PPR-style scores. python ppr.py K TABLE -> out/ppr_{TABLE}.npy (n_rows, nfeat)""" | |
| import sys,numpy as np,scipy.sparse as sp,time; sys.dont_write_bytecode=True | |
| k=int(sys.argv[1]); nm=sys.argv[2]; O='/workspace/huawei/v21graph/out/' | |
| NU,NI=np.load(O+'dims.npy'); g=np.load(O+f'g_{k}.npz'); key=np.unique(g['cu'].astype(np.int64)*NI+g['ci'].astype(np.int64)); eu=key//NI; ei=key%NI | |
| B=sp.csr_matrix((np.ones(len(key),np.float32),(eu,ei)),shape=(NU,NI)) | |
| du=np.asarray(B.sum(1)).ravel(); di=np.asarray(B.sum(0)).ravel() | |
| Bu=sp.diags(1/np.maximum(du,1)**.5)@B # user-degree damped | |
| C=(Bu.T@Bu).tocsr(); C.setdiag(0); C.eliminate_zeros() | |
| S=sp.diags(1/np.maximum(di,1)**.5)@C@sp.diags(1/np.maximum(di,1)**.5); S=S.tocsr().astype(np.float32) | |
| print('S nnz',S.nnz,flush=True) | |
| T=np.load(O+f'tab_{nm}.npz'); H=T['hist']; it=T['item'].reshape(-1,10) if False else T['item']; n=len(H); t0=time.time() | |
| rep=np.repeat(np.arange(n),10); out=np.zeros((len(it),4),np.float32) # hop1,hop2,ppr(.5 mix,3 hops), hop1 w/ recency | |
| for s in range(0,n,1500): | |
| e=np.arange(s,min(n,s+1500)); h=H[e]; m=h!=NI; r=np.repeat(np.arange(len(e)),30)[m.ravel()]; c=h[m] | |
| x0=np.zeros((len(e),NI),np.float32); np.add.at(x0,(r,c),1.0) | |
| x1=(S@x0.T).T; x2=(S@x1.T).T; x3=(S@x2.T).T | |
| ppr=.5*x0*0+.5*x1+.25*x2+.125*x3 | |
| rows=np.arange(s*10,min(n,s+1500)*10); cr=np.repeat(np.arange(len(e)),10); ci_=it[rows] | |
| out[rows,0]=x1[cr,ci_]; out[rows,1]=x2[cr,ci_]; out[rows,2]=ppr[cr,ci_] | |
| # recency-weighted hop1 | |
| w=np.zeros((len(e),NI),np.float32); wt=(0.9**np.arange(30))[None,:].repeat(len(e),0)[m]; np.add.at(w,(r,c),wt); out[rows,3]=(S@w.T).T[cr,ci_] | |
| if s%6000==0: print(s,time.time()-t0,flush=True) | |
| np.save(O+f'ppr_{nm}.npy',out) | |