Changeset 8806009 in tol
- Timestamp:
- Aug 10, 2009, 1:41:14 PM (17 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- d346108
- Parents:
- 41d0e3c
- File:
-
- 1 edited
-
tol/bmath/bstat/logit.cpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tol/bmath/bstat/logit.cpp
r41d0e3c r8806009 63 63 BTimer tm(BText("Logit model (")+N+"x"+n+")"); 64 64 65 BMatrix<BDat> dif, f(N,1), H_(n,n) ;65 BMatrix<BDat> dif, f(N,1), H_(n,n), Xb(N,1); 66 66 e.Alloc(N,1); 67 67 p.Alloc(N,1); … … 74 74 clock_t tm_1, tm_0 = BTimer::Clocks(); 75 75 BReal tm_dif; 76 BDat Lp, L1p; 76 77 77 78 for(iter=0; iter<BDat::MaxIter(); iter++) … … 81 82 if(iter==0) 82 83 { 83 p.SetAllValuesTo(0);84 Xb.SetAllValuesTo(0); 84 85 } 85 86 else … … 87 88 //Std(BText("\nTRACE Logit B=\n")+B.Name()); 88 89 //Std(BText("\nTRACE Logit X=\n")+X.Name()); 89 p= X*B;90 //Std(BText("\nTRACE Logit p=\n")+p.Name());90 Xb = X*B; 91 //Std(BText("\nTRACE Logit Xb=\n")+Xb.Name()); 91 92 } 92 93 oldLlh = lnLikelyhood; … … 94 95 for(i=0; i<N; i++) 95 96 { 96 p(i,0) = 1.0/(1+Exp(-p(i,0))); 97 f(i,0) = p(i,0)*(1-p(i,0)); 97 if(Xb(i,0)>=0) 98 { 99 p(i,0) = 1.0/(Exp(-Xb(i,0))+1.0); 100 } 101 else 102 { 103 p(i,0) = Exp(Xb(i,0))/(Exp(Xb(i,0))+1.0); 104 } 105 f(i,0) = p(i,0)*(1.0-p(i,0)); 98 106 e(i,0) = y(i,0)-p(i,0); 99 107 for(j=0; j<n; j++) … … 105 113 } 106 114 } 107 if(Abs(e(i,0))<=BDat::Tolerance()) { lnL(i,0) = 0.0; } 108 else if(Abs(e(i,0))==1 ) 109 { 110 #if defined(_MSC_VER) || defined(UNIX) 111 //lnL(i,0) = -INFINITY; 112 lnL(i,0) = BDat::NegInf(); 113 #else 114 lnL(i,0) = -1.0/0.0; 115 #endif 116 } 117 else 118 { 119 lnL(i,0) = y(i,0)*Log(p(i,0))+(1-y(i,0))*Log(1-p(i,0)); 120 } 121 // Std(BText("\ny=")+y(i,0)+"\tp="+p(i,0)+"\te="+e(i,0)+"\tlnL="+lnL(i,0)); 115 if(Abs(e(i,0))<=BDat::Tolerance()) { lnL(i,0) = 0.0; } 116 else 117 { 118 if(Xb(i,0)>=0) 119 { 120 Lp = Log(p(i,0)); 121 L1p = -Xb(i,0)-Log(1+Exp(-Xb(i,0))); 122 } 123 else 124 { 125 Lp = Xb(i,0)-Log(1+Exp( Xb(i,0))); 126 L1p = Log(1-p(i,0)); 127 } 128 lnL(i,0) = y(i,0)*Lp + (1-y(i,0))*L1p; 129 } 130 if(!lnL(i,0).IsFinite()) 131 { 132 Std(BText("\n Non finite log-likelihood i=")+i+"\ty="+y(i,0)+"\tXb="+Xb(i,0)+"\tp="+p(i,0)+"\tlog(p)="+Lp+"\tlog(1-p)="+L1p+"\tlnL="+lnL(i,0)); 133 } 122 134 lnLikelyhood += lnL(i,0); 123 135 } … … 141 153 142 154 if(advance.IsUnknown()) { break; } 143 B -= dif;144 155 if(norm < DEpsilon() ) { break; } 145 156 if(maxAbsDif < BDat::Tolerance()) { break; } 146 157 if(advance < DEpsilon() ) { break; } 147 158 if(Abs(oldLlh-lnLikelyhood) < DEpsilon()) { break; } 159 if(iter==BDat::MaxIter()-1) { break; } 160 B -= dif; 148 161 } 149 162 return BTRUE; … … 194 207 BReal tm_dif; 195 208 lnLikelyhood = BDat::NegInf(); 209 BDat _p, _1p; 196 210 for(iter=0; iter<BDat::MaxIter(); iter++) 197 211 { … … 203 217 for(i=0; i<N; i++) 204 218 { 205 p(i,0) = BNormalDist::Dist01(XB(i,0)); 219 _1p = BNormalDist::Dist01(-XB(i,0)); 220 _p = BNormalDist::Dist01( XB(i,0)); 221 p(i,0) = _p; 206 222 f(i,0) = Exp(-0.5*(XB(i,0)*XB(i,0)))/Sqrt(2.0*BDat::Pi());//BNormalDist::Dens01(XB(i,0)); 207 l(i,0) = (y(i,0)==0)?-f(i,0)/( 1-p(i,0)):f(i,0)/p(i,0);208 e(i,0) = y(i,0)- p(i,0);223 l(i,0) = (y(i,0)==0)?-f(i,0)/(_1p):f(i,0)/_p; 224 e(i,0) = y(i,0)-_p; 209 225 for(j=0; j<n; j++) 210 226 { … … 216 232 } 217 233 if(Abs(e(i,0))<=BDat::Tolerance()) { lnL(i,0) = 0.0; } 218 else if(Abs(e(i,0))==1 )219 {220 lnL(i,0) = BDat::NegInf();221 }222 234 else 223 235 { 224 lnL(i,0) = y(i,0)*Log( p(i,0))+(1-y(i,0))*Log(1-p(i,0));236 lnL(i,0) = y(i,0)*Log(_p)+(1-y(i,0))*Log(_1p); 225 237 } 226 238 // Std(BText("\ny=")+y(i,0)+"\tXB="+XB(i,0)+ 227 // "\tp="+ p(i,0)+"\tf="+f(i,0)+"\tl="+l(i,0)+239 // "\tp="+_p+"\tf="+f(i,0)+"\tl="+l(i,0)+ 228 240 // "\te="+e(i,0)+"\tlnL="+lnL(i,0)); 229 241 lnLikelyhood += lnL(i,0); … … 247 259 248 260 if(advance.IsUnknown()) { break; } 249 B -= dif;250 261 if(norm < chop ) { break; } 251 262 if(maxAbsDif < BDat::Tolerance()) { break; } 252 263 if(advance < chop ) { break; } 253 264 if(Abs(oldLlh-lnLikelyhood) < DEpsilon()) { break; } 265 if(iter==BDat::MaxIter()-1) { break; } 266 B -= dif; 254 267 } 255 268 return BTRUE;
Note: See TracChangeset
for help on using the changeset viewer.
