Home | Develop | Download | Contact
extra_newhb.h
1 
2 #define q_factor_val 2.0
3 
4 namespace Pds{
5 namespace LogisticModel{
6 
7 double CostXqEntropy( const Pds::Vector &W,
8  const Pds::Matrix &X,
9  const Pds::Vector &Y,
10  double q);
11 
12 Pds::Vector GradientCostXqEntropy( const Pds::Vector &W,
13  const Pds::Matrix &X,
14  const Pds::Vector &Y,
15  double q,
16  double h);
17 
18 Pds::Vector GradientCostXqEntropySoft( const Pds::Vector &W,
19  const Pds::Matrix &X,
20  const Pds::Vector &Y,
21  double q);
22 
23 
24 }//LogisticModel
25 }//Pds
26 
28 
29 
30 
31 
32 double Pds::LogisticModel::CostXqEntropy( const Pds::Vector &W,
33  const Pds::Matrix &X,
34  const Pds::Vector &Y,
35  double q)
36 {
37  if(W.IsEmpty()) return Pds::Ra::Nan;
38  if(X.IsEmpty()) return Pds::Ra::Nan;
39  if(Y.IsEmpty()) return Pds::Ra::Nan;
40 
41  if(X.Nlin()!=Y.Nlin()) return Pds::Ra::Nan;
42  if(X.Ncol()!=(W.Nlin()-1)) return Pds::Ra::Nan;
43 
44  Pds::Vector Yh=Y.Geq(0.5);
45 
46  Pds::Vector z=Pds::LogisticModel::Classify(W,X);
47  z=z.Geq(0.5);
48 
49  unsigned int L=Yh.Nlin();
50 
51  double Np=Yh.Sum();
52  double Na=z.Sum();
53  double N1=Yh.Dot(z);
54 
55  // New entropy 1
56  double E1;
57  if(0==Na) E1=0;
58  else E1=Pds::XqHb(N1/Na,q);
59 
60  // New entropy 0
61  double E0;
62  double P=(Np-N1)/(L-Na);
63  if(P>1.0) P=1.0;
64  if(P<0) P=0.0;
65  if(L==Na) E0=0.0;
66  else E0=Pds::XqHb(P,q);
67 
68 
69  //return pow(Na/L,2)*E1+pow((L-Na)/L,2)*E0;
70  return (Na/L)*E1+((L-Na)/L)*E0;
71 }
72 
73 Pds::Vector Pds::LogisticModel::GradientCostXqEntropy( const Pds::Vector &W,
74  const Pds::Matrix &X,
75  const Pds::Vector &Y,
76  double q,
77  double h)
78 {
79  if(W.IsEmpty()) return Pds::Vector();
80  if(X.IsEmpty()) return Pds::Vector();
81  if(Y.IsEmpty()) return Pds::Vector();
82 
83  if(X.Nlin()!=Y.Nlin()) return Pds::Vector();
84  if(X.Ncol()!=(W.Nlin()-1)) return Pds::Vector();
85 
86  if(h==0.0) return Pds::Vector();
87 
88  unsigned int N=W.Nel();
89 
90  Pds::Vector D(N);
91  Pds::Vector Whp(N);
92  Pds::Vector Whm(N);
93  double dn;
94 
95  Whp.Copy(W);
96  Whm.Copy(W);
97 
98  for(unsigned int n=0;n<N;n++)
99  {
100  Whp.SetRaw(n,W.GetRaw(n)+h);
101  Whm.SetRaw(n,W.GetRaw(n)-h);
102 
103  dn=( Pds::LogisticModel::CostXqEntropy(Whp,X,Y,q)
104  -Pds::LogisticModel::CostXqEntropy(Whm,X,Y,q) )/(2*h);
105 
106  D.SetRaw(n,dn);
107 
108  Whp.SetRaw(n,W.GetRaw(n));
109  Whm.SetRaw(n,W.GetRaw(n));
110  }
111  return D;
112 }
113 
114 Pds::Vector Pds::LogisticModel::GradientCostXqEntropySoft( const Pds::Vector &W,
115  const Pds::Matrix &X,
116  const Pds::Vector &Y,
117  double q)
118 {
119  if(W.IsEmpty()) return Pds::Vector();
120  if(X.IsEmpty()) return Pds::Vector();
121  if(Y.IsEmpty()) return Pds::Vector();
122 
123  if(X.Nlin()!=Y.Nlin()) return Pds::Vector();
124  if(X.Ncol()!=(W.Nlin()-1)) return Pds::Vector();
125 
126  Pds::Vector Yt=Y.Geq(0.5);
127  unsigned int N=Yt.Sum();// numero total de 1s
128  unsigned int L=Yt.Nel();// numero de elementos
129 
130  Pds::Matrix R=Pds::RegressorMatrix(X);
131  Pds::Vector z=Pds::Sigmoid(R*W);
132  Pds::Vector Dz=z.Product(1.0-z);
133 
134  double Na=z.Sum();
135  double N1=Yt.Dot(z);
136  double p1=N1/Na;
137  double p2=(N-N1)/(L-Na);
138 
139  double h1=Pds::XqHb(p1,q);
140  double h2=Pds::XqHb(p2,q);
141  double Dh1=Pds::DXqHb(p1,q);
142  double Dh2=Pds::DXqHb(p2,q);
143 
144  double factor1=-(-h1+h2+p1*Dh1-p2*Dh2)/L;
145  double factor2=-(-Dh1+Dh2)/L;
146  Pds::Vector Der= factor1*R.TMul(Dz)+factor2*R.TMul(Dz.Product(Yt));
147 
148  return Der;
149 }
150 
151 
Pds::Vector Classify(const Pds::Vector &W, const Pds::Matrix &X)
Calculo del resultado del clasificador.
Pds::Vector GradientCostXqEntropy(const Pds::Vector &W, const Pds::Matrix &X, const Pds::Vector &Y, double q, double h)
Definition: extra_newhb.h:73
double CostXqEntropy(const Pds::Vector &W, const Pds::Matrix &X, const Pds::Vector &Y, double q)
Definition: extra_newhb.h:32
Pds::Vector GradientCostXqEntropySoft(const Pds::Vector &W, const Pds::Matrix &X, const Pds::Vector &Y, double q)
Definition: extra_newhb.h:114
Nombre de espacio para Pds (Procesamiento Digital de Senales)

Enlaces de interés

HomePage Bazaar Download Bug report Ayuda Developer Feed