View Javadoc

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