Advertisement
Guest User

3++

a guest
Oct 20th, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.46 KB | None | 0 0
  1. import java.util.Random;
  2.  
  3. public class AdoptiveStepOR {
  4.  
  5.     static double[][] getTruthTable(int n, double top) {
  6.         double[][] points = new double[64][n];
  7.         for (int i = 0; i < points.length; i++) {
  8.             for (int j = 0; j < n; j++) {
  9.                 points[i][j] = (i >> j & 1) * top;
  10.             }
  11.         }
  12.         return points;
  13.     }
  14.  
  15.     static double[] getRandomWeights(int n) {
  16.         Random r = new Random();
  17.         double[] w = new double[n];
  18.         for (int i = 0; i < w.length; i++) {
  19.             w[i] = r.nextDouble();
  20.         }
  21.         return w;
  22.     }
  23.    
  24.     static double weightedSum(double[] x, double[] w, double t){
  25.         double sum = 0;
  26.         for (int i = 0; i < x.length; i++) {
  27.             sum += x[i]*w[i];
  28.         }
  29.         return sum - t;
  30.     }
  31.  
  32.     static double f(double sum){
  33.         return sum > 0 ? 1.0 : 0.0;
  34.     }
  35.    
  36.     static double sample(double[] x){
  37.         for (double d : x) {
  38.             if(d > 0) return 1;
  39.         }
  40.         return 0;
  41.     }
  42.    
  43.     static double getNewSpeed(double currentSpeed, double[] x){
  44.         double newSpeed = 1;
  45.         for (int i = 0; i < x.length; i++) {
  46.             newSpeed += x[i]*x[i];
  47.         }
  48.         return 1/newSpeed;
  49.     }
  50.  
  51.     static double[] getNewWeights(double[] x, double[] w, double diff){
  52.         double[] newW = new double[w.length];
  53.         for (int i = 0; i < w.length; i++) {
  54.             newW[i] = w[i] - diff*x[i];
  55.         }
  56.         return newW;
  57.     }
  58.    
  59.     static double getNewThreshold(double t,double diff){
  60.         return t + diff;
  61.     }
  62.    
  63.     public static void main(String[] args) {
  64.         int n = 6;
  65.         double learnigSpeed = 1.0, top = 9, t = new Random().nextDouble()*top - 2;
  66.         double[] w = getRandomWeights(n);
  67.         double[][] points = getTruthTable(n, top);
  68.        
  69.         System.out.print("sum =");
  70.         for (int i = 0; i < w.length; i++) {
  71.             System.out.printf(" %6.3f*x%d +", w[i], i + 1);
  72.         }
  73.         System.out.printf("- %4.2f\n", t);
  74.  
  75.         for (int j = 1;; j++) {
  76.             boolean check = true;
  77.             for (int i = 0; i < 64; i++) {
  78.                 double[] x = points[i];
  79.                 double sum = weightedSum(x, w, t),
  80.                         err = f(sum) - sample(x),
  81.                         diff = learnigSpeed* err;
  82.                 w = getNewWeights(x, w, diff);
  83.                 t = getNewThreshold(t, diff);
  84.                 learnigSpeed = getNewSpeed(learnigSpeed, x);
  85.                 System.out.printf("alpha = %6.4f, sum = %6.3f, error = %4.1f, t = %4.2f\n", learnigSpeed, sum, err, t);
  86.                 check &= err == 0.0;
  87.             }
  88.             System.out.println("========= " + j);
  89.             if (check)
  90.                 break;
  91.         }
  92.         System.out.print("sum =");
  93.         for (int i = 0; i < w.length; i++) {
  94.             System.out.printf(" %6.3f*x%d +", w[i], i + 1);
  95.         }
  96.         System.out.printf("- %4.2f\n", t);
  97.         System.out.println(f(weightedSum(points[0], w, top)));
  98.     }
  99.  
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement