特征选择 ReliefF算法

article/2025/10/14 15:14:59

一、算法

      Relief算法最早由Kira提出. 基本内容:从训练集D中随机选择一个样本R, 然后从和R同类的样本中寻找k最近邻样本H,从和R不同类的样本中寻找k最近邻样本M, 最后按照公式更新特征权重.

    算法:

        1.置0所有特征权重

        2.For i=1 to m do

            2.1 随机选择一个样本

            2.2 从同类中找到R的k最近邻样本H,从不同类中找到R的k最近邻样本M.

            2.3 for i=1 to N do

                

             2.4 对W进行排序

 

二、Matlab实现

    主函数Main.m

%主函数
function main
clear;clc;
load A:\Data\data.txt%加载数据
D=data(:,2:size(data,2));%排除编号的一列
m=80; %抽样次数
k=8; %k近邻
N=20; %运行次数
for i=1:NW(i,:)=RelifF(D,m,k);
end
for i=1:N %将每次计算的权重进行绘图plot(1:size(W,2),W(i,:));%size(A,1)获取A矩阵行数,size(A,2)获取A矩阵列数hold on
end
for i=1:size(W,2) %计算N次中,每个属性的平均值result(1,i)=sum(W(:,i))/size(W,1);
end
xlabel('属性编号');
ylabel('特征权重');
title('ReliefF算法计算特征权重')
axis([1 10 0 0.3])
%-----绘制每一种属性变化趋势-----------%
name=char('块厚度','细胞大小均匀性','细胞形态均匀性','边缘粘附力','单上皮细胞尺寸','裸核','Bland染色质','正常核仁','核分裂');
name=cellstr(name);%cellstr(name)将字符串转化为元胞数组
for i=1:size(W,2)figureplot(1:size(W,1),W(:,i))xlabel('计算次数');ylabel('特征权重');title([char(name(i)) '(属性' num2str(i) ')的特征权重变化'])%title中[]来连接字符串,num2str(i)将数字i转化为 
end

该程序进行N次调用Reliff函数来获取W的行矩阵,该行矩阵是所有特征的权重

接着对得到的N次结果进行绘图

然后把N次结果取平均值作为最终的特征权重结果保存在result中

最后对之前的的统一绘图,变成单一绘图

 

Reliff.m

%Relief函数实现
%D为输入的训练集合,输入集合去掉身份信息;k为最近邻样本个数
function W=RelifF(D,m,k)
Rows=size(D,1); %样本个数
Cols=size(D,2); %特征个数
%将数据分成两类,加快计算速度
D1=zeros(0,Cols);%第一类,0行 []
D2=zeros(0,Cols);%第二类
for i=1:Rowsif D(i,Cols)==2 %良性D1(size(D1,1)+1,:)=D(i,:);%matlab变量弱类型可以动态修改elseif D(i,Cols)==4 %不是良性D2(size(D2,1)+1,:)=D(i,:);end
end %分好类填入D1和D2中
W=zeros(1,Cols-1);%初始化特征权重,置为0
for  i=1:m %选择循环操作%从D中随机选择一个样本R[R,Dh,Dm]=GetRandSamples(D,D1,D2,k);%更新特征权重for j=1:length(W)W(1,j)=W(1,j)-sum(Dh(:,j))/(k*m)+sum(Dm(:,j))/(k*m);%按照公式这里的sum就是上面公式中从1到k的求和,因为Dh和Dm是k行%sum不仅可以对矩阵求和,还能对矩阵元素满足条件的元素求和,比如sum(D(:,size(D,2)==2)%这样只对D的最后一列是2的累计加1end
end 

该程序首先分了两类D1和D2,然后将D中的对应类复制到D1和D2中

接着依据分好的类去得到样本和特征差Dh,Dm

按照公式进行更新W

 

GetRandSamples.m

%获取随机R 找出邻近样本
%D:训练集 D1:类别1数据集 D2:类别2数据集
%Dh 与R同类相邻样本距离; Dm:与R不同类的相邻样本距离
function [R,Dh,Dm]=GetRandSamples(D,D1,D2,k)
%先随机产生一个随机数,确定选定的样本R
r=ceil(1+(size(D,1)-1)*rand);
R=D(r,:);%将第r行选中赋值给R
d1=zeros(1,0);%置0,d1,d2是与R的距离,0列 []
d2=zeros(1,0);
%D1,D2已经分好类了
for i=1:size(D1,1) %计算R与D1的距离d1(1,i)=norm(R-D1(i,:)); %norm用来求两个向量之间的距离,即求R和D1中每行的距离放入对应d1行中
end
for j=1:size(D2,1) %计算R与D2的距离d2(1,j)=norm(R-D2(j,:));
end
[v1,L1]=sort(d1);%对d1,d2进行排序,这里v1是排行序的结果,L1是现在排好序的位置处的元素原本是在哪个位置上的,即建立了原来和现在元素索引的一种映射 
[v2,L2]=sort(d2);
if R(1,size(R,2))==2 %如果样本R=2是良性H=D1(L1(1,2:k+1),:); %L1中是与R最近距离的变化,赋给H,除去自身的,因为第一个是R,不能加入M=D2(L2(1,1:k),:);%
else%之前版本%H=D1(L1(1,1:k),:); %M=D2(L2(1,2:k+1),:);%同上面的if中的H%更改版本, 依据公式,这里H和M分别表示和R的同类与不同类的样本集。由于R的变化,所以这里H和M相比较之前的需要互换下位置M=D1(L1(1,1:k),:); H=D2(L2(1,2:k+1),:);%同上面的if中的H
end
%循环计算2个样本特征之间的特征距离
for i=1:size(H,1)for j=1:size(H,2)Dh(i,j)=abs(H(i,j)-R(1,j))/9; %公式进行求得diff值,因为A连续从1到10Dm(i,j)=abs(M(i,j)-R(1,j))/9;end
end%(R特征-Mk特征)/(max-min)

该程序首先初始化两个距离行向量,保存从R到D1和D2每行的距离.

接着对距离进行归一化(或者称按照公式)得到diff值,用于后面的W更新

 

三、运行结果

    

可见第一个和第六个特征影响很大,第九个影响很小.

 

参考:

    https://blog.csdn.net/ferrarild/article/details/18792613

数据来源:

    http://archive.ics.uci.edu/ml/


http://chatgpt.dhexx.cn/article/KmFFX7N9.shtml

相关文章

特征选择算法-Relief(转)

【转载】数据挖掘之—基于ReliefF和K-means算法的医学应用实例(转自: http://www.cnblogs.com/asxinyu/archive/2013/08/29/3289682.html) 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识。数…

机器学习特征选择—使用遗传算法进行特征选择

目录 0、前言 1、遗传算法概念 2、基于DEAP库的python遗传算法特征选择 3、我的遗传算法特征选择代码及一些代码函数解析 4、完整代码 5、可能会遇到的错误 0、前言 差不多有大半年没有写博客了,这段时间没有学习什么新的知识和总结;这篇博客内容也…

特征选择算法-Relief

转自:http://www.cnblogs.com/asxinyu/archive/2013/08/29/3289682.html 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识。数据挖掘 (DataMiriing),指的是从大型数据库或数据仓库中提取人们感…

特征选择常用算法

特征选择常用算法综述 特征选择的一般过程: 1.生成子集:搜索特征子集,为评价函数提供特征子集 2.评价函数:评价特征子集的好坏 3.停止准则:与评价函数相关,一般是阈值,评价函数达到一定标准…

常用的特征选择算法介绍

结合Scikit-learn介绍几种常用的特征选择方法 原文 http://dataunion.org/14072.html 主题 特征选择 scikit-learn 特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构&#xff…

特征选择(Feature Selection)

主要内容: 为什么要进行特征选择?什么是特征选择?怎么进行特征选择 特征选择: 在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型&…

特征选择常用算法综述

1 综述 (1) 什么是特征选择 特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) ,或属性选择( Attribute Selection ) ,是指从全部特征中选取一个特征子集,使构造出来的模型更好。 (2) 为什么要做特征选择 在机器学习的实际应用…

浅谈五种常用的特征选择方法

👆点击关注|设为星标|干货速递👆 在许多机器学习相关的书里,很难找到关于特征选择的内容,因为特征选择要解决的问题往往被视为机器学习的一个子模块,一般不会单独拿出来讨论。 但特征选择是一个…

Python-编码规范

学习内容:Python基础入门知识-代码编写规范 专栏作者:不渴望力量的哈士奇不渴望力量的哈士奇擅长Python全栈白宝书[更新中],⑤ - 数据库开发实战篇,网安之路,等方面的知识,不渴望力量的哈士奇关注云原生,算法,python,集成测试,去中心化,web安全,智能合约…

前端编码规范

最近整理了一份HTML/CSS/JS编码规范,供大家参考。 目录: 一、HTML编码规范 二、CSS编码规范 三、JS编码规范 一、HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签要写alt属性,如果没有就写一个空的。但是一般要写一个…

C语言编码规范

C语言编码规范 1、代码总体规则 2、代码规范之头文件 3、代码规范之函数 4、标识符命名与定义 5、代码规范之变量 6、宏、常量

【代码规范】常见编码规范

文章来源:公众号-智能化IT系统。 1.明确方法功能,精确(而不是近似)地实现方法设计。如果一个功能将在多处实现,即使只有两行代码,也应该编写方法实现。 说明: 虽然为仅用一两行就可完成的功能…

Python的编码规范(超详细)

目录 一、前言二、编写规范三、命名规范四、结语 一、前言 编码的规范性对代码的整体展现有着较大的影响。 先让我们看两张规范与不规范的代码截图来感受下。 先让我们看看不规范的吧。 看完有什么感觉吗?或许你会没有感觉,在让我们来看看我自认为很规…

标准的Java编码规范手册

编码规范体现出一个开发者的基本素质,良好的编码规范可以提高团队编码的效率,避免很多不必要的问题。今天分享一个标准的Java编码规范给大家,希望对于大家今后的开发工作带来帮助。 编码规范的意义 在项目开发维护中,编码…

Java编码规范总结(参考腾讯编码规范)

一、java文件组织 文件组织规则:由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序。一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个…

编码体系与规范

编码体系与规范 网页编码是指网页中字符的编码方式。目前国内常见的网页字符编码主要有utf-8、gbk、gb2312,其中 utf-8为国际化编码,在各国各地区的网站中都很常见,可以说是最通用的字符编码。此外,有些日本网页会使用EUC-JP、SH…

python编码规范

PE8基本规范: 建议修改在使用的 IDE 中修改 PEP8 的每行字数不超79字符规范,可修改为 Django 建议的 119 字符 一、python编码规范: (一)代码编码: 1、国际惯例,文件编码和 Python 编码格式全部为 utf-8 ,…

JAVA编码规范

命名风格 代码命名不能以下划线或者美元符号开头或者结尾代码命名不能以中文拼音或者中文拼音与英文混合方式类名使用UpperCamCamelCase风格,但DO、PO、DTO、VO、BO等除外方法名、参数名、变量名统一使用lowerCamelCase,必须遵守驼峰命名常量名全部大写…

【编码规范篇】| C#编码规范 代码规范总结,包括命名规范,代码规范 注释规范等

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity精品学习专栏 🌲 游戏制作专栏推荐:游戏制作分享 &…

编码的一些基本规范

1. 数据库表设计 Rule 1. 【强制】表名小写,多个word之间用英文下横线_分隔Rule 2. 【强制】表名普通表前缀t_;临时表tmp_;备份表bak_;视图v_;主键pk_;外键fk_;唯一索引uix_;普通索引idx_Rule 3. 【强制】关系表统一用relation结尾Rule 4. 【强制】表名和业务字段必…