日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征选择算法java实现_relief算法特征选择

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征选择算法java实现_relief算法特征选择 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.[文件]

Relief算法程序.txt?~?6KB

下載(44)

package com.relief.algorithm;

import java.util.Random;

import java.util.Set;

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class Relief {

public Relief(){

}

public double[][] matrix;

public int length;

public int width;

public double[] weight;

//樣本抽樣次數

public int m;

//樣本數量

public int k;

public int n_vars;

/**

* 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;

}

}

}

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]);

}

}

//有t個不同類

public int t;

/**

* reliefF算法

*/

public void reliefF(){

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次

Map map = new HashMap();

double[][] H = new double[k][width];

double[][] M = new double[k][width];

List lstM = new ArrayList();

double[] R = new double[width];

for(int i = 0; i < m; i++){

//隨機抽取樣本R

Random random = new Random();

int R_index = random.nextInt(width);

for(int index = 0; index < width; index++){

R[index] = matrix[R_index][index];

}

//計算所有數據到樣本的距離

for(int len = 0; len < length; len++){

double distince = 0.0;

int row = 0;

if(len != R_index){

for(int wid = 0; wid < width; wid++){

distince += Math.pow(R[wid]-matrix[len][wid], 2);

}

distince = Math.sqrt(distince);

row = len;

map.put(distince, row);

}

}

//對樣本距離排序

Set set = map.keySet();

List lst = new ArrayList(set);

Collections.sort(lst);

//獲取距離最近的k個樣本作為H

for(int a = 0; a < k; a++){

double d = lst.get(a);

int r = map.get(d);

for(int b = 0; b < width; b++){

H[a][b] = matrix[r][b];

}

}

//假設有t個不同分類,在每個不同類中獲取k個樣本

//在數據中隨機獲取k個樣本作為M(C)

for(int a = 0; a < t; a++){

double[] RD = new double[width];

//隨機抽取樣本

Random rd = new Random();

int id = rd.nextInt(width);

while(true){

if(id != R_index){

break;

}

else{

id = rd.nextInt(width);

}

}

for(int index = 0; index < width; index++){

R[index] = matrix[R_index][index];

}

//計算所有數據到樣本的距離

Map maprd = new HashMap();

for(int len = 0; len < length; len++){

double distince = 0.0;

int row = 0;

if(len != R_index){

for(int wid = 0; wid < width; wid++){

distince += Math.pow(R[wid]-matrix[len][wid], 2);

}

distince = Math.sqrt(distince);

row = len;

maprd.put(distince, row);

}

}

//對樣本距離排序

Set setrd = map.keySet();

List lstrd = new ArrayList(set);

Collections.sort(lst);

//獲取不同類距離最近的k個樣本作為

for(int q = 0; q < k; q++){

double d = lst.get(q);

int r = map.get(d);

for(int p = 0; p < width; p++){

M[q][p] = matrix[r][p];

}

}

lstM.add(M);

}

}

//計算H的diff

double[] tmpval1 = new double[n_vars];

double[] tmpval2 = new double[n_vars];

for(int i = 0; i < n_vars; i++){

for(int j = 0; j < k; j++){

tmpval1[i] += Math.abs(R[i]-H[j][i])/(max[i]-min[i]);

}

}

//計算不同類的diff

double[] value = new double[n_vars];

for(double[][] d : lstM){

for(int i = 0; i < n_vars; i++){

for(int j = 0; j < k; j++){

value[i] += Math.abs(R[i]-M[j][i])/(max[i]-min[i]);

}

}

}

for(int i = 0; i < n_vars; i++){

tmpval2[i] += value[i]/t;

}

//計算權重

for(int j = 0; j < n_vars; j++){

weight[j] = weight[j]- tmpval1[j]/(m*k) + tmpval2[j]/(m*k);

}

for(int i = 0; i < width; i++){

System.out.println(weight[i]);

}

}

}

總結

以上是生活随笔為你收集整理的特征选择算法java实现_relief算法特征选择的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。