View Javadoc

1   package liblinear;
2   
3   class L2R_LrFunction implements Function {
4   
5       private final double[] C;
6       private final double[] z;
7       private final double[] D;
8       private final Problem  prob;
9   
10      public L2R_LrFunction( Problem prob, double Cp, double Cn ) {
11          int i;
12          int l = prob.l;
13          int[] y = prob.y;
14  
15          this.prob = prob;
16  
17          z = new double[l];
18          D = new double[l];
19          C = new double[l];
20  
21          for (i = 0; i < l; i++) {
22              if (y[i] == 1)
23                  C[i] = Cp;
24              else
25                  C[i] = Cn;
26          }
27      }
28  
29  
30      private void Xv(double[] v, double[] Xv) {
31  
32          for (int i = 0; i < prob.l; i++) {
33              Xv[i] = 0;
34              for (FeatureNode s : prob.x[i]) {
35                  Xv[i] += v[s.index - 1] * s.value;
36              }
37          }
38      }
39  
40      private void XTv(double[] v, double[] XTv) {
41          int l = prob.l;
42          int w_size = get_nr_variable();
43          FeatureNode[][] x = prob.x;
44  
45          for (int i = 0; i < w_size; i++)
46              XTv[i] = 0;
47  
48          for (int i = 0; i < l; i++) {
49              for (FeatureNode s : x[i]) {
50                  XTv[s.index - 1] += v[i] * s.value;
51              }
52          }
53      }
54  
55  
56      public double fun(double[] w) {
57          int i;
58          double f = 0;
59          int[] y = prob.y;
60          int l = prob.l;
61          int w_size = get_nr_variable();
62  
63          Xv(w, z);
64          for (i = 0; i < l; i++) {
65              double yz = y[i] * z[i];
66              if (yz >= 0)
67                  f += C[i] * Math.log(1 + Math.exp(-yz));
68              else
69                  f += C[i] * (-yz + Math.log(1 + Math.exp(yz)));
70          }
71          f = 2.0 * f;
72          for (i = 0; i < w_size; i++)
73              f += w[i] * w[i];
74          f /= 2.0;
75  
76          return (f);
77      }
78  
79      public void grad(double[] w, double[] g) {
80          int i;
81          int[] y = prob.y;
82          int l = prob.l;
83          int w_size = get_nr_variable();
84  
85          for (i = 0; i < l; i++) {
86              z[i] = 1 / (1 + Math.exp(-y[i] * z[i]));
87              D[i] = z[i] * (1 - z[i]);
88              z[i] = C[i] * (z[i] - 1) * y[i];
89          }
90          XTv(z, g);
91  
92          for (i = 0; i < w_size; i++)
93              g[i] = w[i] + g[i];
94      }
95  
96      public void Hv(double[] s, double[] Hs) {
97          int i;
98          int l = prob.l;
99          int w_size = get_nr_variable();
100         double[] wa = new double[l];
101 
102         Xv(s, wa);
103         for (i = 0; i < l; i++)
104             wa[i] = C[i] * D[i] * wa[i];
105 
106         XTv(wa, Hs);
107         for (i = 0; i < w_size; i++)
108             Hs[i] = s[i] + Hs[i];
109         // delete[] wa;
110     }
111 
112     public int get_nr_variable() {
113         return prob.n;
114     }
115 
116 }