特征选取relief算法

来源:互联网 发布:excel怎么剔除重复数据 编辑:程序博客网 时间:2024/05/21 17:53

摘录的一个特征选取relief算法的一段java代码,还是讲的很清晰的
样本点之间的距离用欧氏距离来实现
原文链接:
http://blog.csdn.net/nma_123456/article/details/51490637

/**  * relief算法  */  public void relief(){             matrix = new double[length][width];      //将样本数据赋值到matrix中      //权重值全部置为0      weight = new double[n_vars];          for(int i = 0; i < n_vars; i++){          weight[i] = 0.0;      }      //属性的最大值和最小值      double[] max = new double[n_vars];      double[] min = new double[n_vars];      for(int i = 0; i < width; i++){          for(int j = 0; j < length; j++){              double d = matrix[j][i];              if(d > max[i]){                  max[i] = d;              }              if(d < min[i]){                  min[i] = d;              }          }      }    // 找到每个特征下样本数据的最大值最小值    //随机抽样m次      for(int i = 0; i < m; i++){          //随机抽取样本R          Random random = new Random();          int R_index = random.nextInt(width);          double[] R = new double[width];          for(int index = 0; index < width; index++){              R[index] = matrix[R_index][index];          }          //计算出距离样本R最近的样本和最远的样本          double maxvalue = 0.0;          double minvalue = 0.0;          int maxrow = 0;          int minrow = 0;          double distince = 0.0;                    for(int len = 0; len < length; len++){              if(len != R_index){                  for(int wid = 0; wid < width; wid++){                      distince += Math.pow(R[wid]-matrix[len][wid], 2);                  }                  distince = Math.sqrt(distince);                  if(len == 0){                      maxvalue = distince;                      minvalue = distince;                  }                  if(distince > maxvalue){                      maxvalue = distince;                      maxrow = len;                  }                  if(distince < minvalue){                      minvalue = distince;                      minrow = len;                  }              }          }          // 得到了距离最近(minrow)和距离最远(maxrow)两个样本数据        int H_index = minrow;          double[] H = new double[width];          for (int index = 0; index < width; index++) {              H[index] = matrix[H_index][index];          }          int M_index = maxrow;          double[] M = new double[width];          for(int index = 0; index < width; index++){              M[index] = matrix[M_index][index];          }          //relief计算权重                      for(int j = 0; j < n_vars; j++){              weight[j] = weight[j]-(Math.abs(R[j]-H[j])/(max[j]-min[j]))/m             + (Math.abs(R[j]-M[j])/(max[j]-min[j]))/m;          }      }      for(int i = 0; i < width; i++){          System.out.println(weight[i]);      }  }