特征选择算法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算法特征选择相关推荐
- svm算法 java实现_SVM算法实现(一)
关键字(keywords):SVM 支持向量机 SMO算法 实现 机器学习 假设对SVM原理不是非常懂的,能够先看一下入门的视频,对帮助理解非常实用的,然后再深入一点能够看看这几篇入门文章,作者写得挺 ...
- JAVA分析html算法(JAVA网页蜘蛛算法)
近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...
- 算法 | Java 常见排序算法(纯代码)
目录 汇总 1. 冒泡排序 1. 冒泡排序 每轮循环确定最值: public void bubbleSort(int[] nums) { int temp; boolean isSort = fals ...
- java实现棋盘覆盖算法,java 棋盘覆盖算法
import java.util.Scanner; /** 棋盘覆盖 */ public class Arithmetic { /** 被覆盖后显示的数字,会根据覆盖的顺序有所递增 */ privat ...
- bm25算法Java代码_BM25算法在Lucene中的应用
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个用Java写的全文检索引擎工具包,可以方便的集成到系统中提以提供高效的检索能力,Lucene核心功能分为建索和检索两部分.而 ...
- 算法python实现_Relief算法python实现
文章目录 一.算法流程图 二.代码步骤 1.第一步:定义类和init方法 2.第二步:数据处理 3.第三步:通过计算距离,找出猜错近邻和猜对近邻 4.第四步:计算特征权重 5.第五步:根据权重过滤式选 ...
- 数据结构及算法 | Java数据结构——回溯算法之子集树
1.介绍一下子集树,什么是子集树? 当所给问题是从n个元素的集合S中找出满足某些条件或者性质的子集时,解空间是子集树: 比如典型的0-1背包问题-----and-----轮船装载问题: 解空间 就是指 ...
- l bfgs算法java代码_L-BFGS算法介绍
本文由作者林洋港授权网易云社区发布. 一. L-BFGS是什么 L-BFGS是解无约束非线性规划问题最常用的方法,具有收敛速度快.内存开销少等优点,在机器学习各类算法中常有它的身影.简单的说,L-BF ...
- 通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)
遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费我们宝贵的时间. 第二个办法用开源组织htmlparser的包 ...
最新文章
- 云计算时代,你真的懂 Docker 吗?
- 如何用TensorFlow在安卓设备上实现深度学习推断
- python编程能力等级测试_56岁的潘石屹参加全国青少年编程能力等级测试,你还在问编程是什么?...
- 关于[入行几年后,你的未来应该在哪里]的思考
- 「Self-driving: Perception」感知总览
- 5G概念被热炒,运营商吃相不要太难看
- freemarker 自己常用方法
- 团队如何开会,开会准则
- xp桌面图标阴影解决方案
- U3D手游《苍穹变》性能优化经验谈
- 钉钉机器人关键词应答_Gmail 邮件推送到钉钉群机器人(详细)教程|国内接收 Gmail 邮件...
- 【3】WEB安全学习----HTTP协议
- sql盲注 各种方法拿到 管理员账户和密码
- 【VUE项目实战】64、CND优化ElementUI以及首页内容定制
- 输入一行字符,统计其中字母、数字和其他符号的个数。例如,输入:As123 g1b,9 输出:字母个数:4 数字字符个数:5 其他字符个数:2
- 3种查看网站流量的方式
- jsqlparser 简介、中文文档、中英对照文档 下载
- PS教程 教你制作古老的石头
- IDEA修改字体大小 导航栏字体 编辑器字体
- ios10.2重新安装cydia(包含恢复数据库)
热门文章
- 最优化作业第6章——无约束多维非线性规划方法
- 学习笔记(27):Python网络编程并发编程-GIL与多线程
- 学习笔记(19):Python网络编程并发编程-互斥锁
- linux一行多个命令行,如何在一行中运行多个Linux命令
- java 入门 博客园_javaweb入门
- 实验七:Xen环境下cirrOS的安装配置
- 解决mac升级后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误
- UML入门之类图教程
- 简单的反射 把datatable 转换成list对象
- 浅析SQL Server 2005中的主动式通知机制