摘錄的一個特徵選取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]);
}
}