特徵選取relief算法

摘錄的一個特徵選取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]);  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章