(一段加载不出来所以分两段)
%D为输入的训练集合,输入集合去掉身份信息;k为最近邻样本个数
m=5; %抽样次数
k=2; %选取邻近样本个数,k小于分类结果最少的样本数
N=20; %运行次数
D = randi([2,8],30,7)
f = randi([0,1],30,1)
D = [D,f]
Rows=size(D,1); %样本个数
Cols=size(D,2); %特征个数
%将数据分成两类,加快计算速度
D1=zeros(0,Cols);%第一类,0行 []
D2=zeros(0,Cols);%第二类
for i=1:Rows
if D(i,Cols)==0 %0是其中一个类别的代表
D1(size(D1,1)+1,:)=D(i,:);%matlab变量弱类型可以动态修改
elseif D(i,Cols)==1 %0是另一个类别的代表
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);
%先产生一个随机数,确定选定的样本R
r = ceil(1 + (size(D,1)-1)*rand) ;
R=D(r,:); %将第r行选中,赋值给R
d1 = zeros(1,0) ;%先置0,d1是与R的距离,是不是同类在下面判断
d2 = zeros(1,0) ;%先置0,d2是与R的距离
%D1,D2是先传入的参数,在ReliefF函数中已经分类好了
for i=1:size(D1,1) %计算R与D1的距离
d1(1,i)=cov(R-D1(i,:)); %用协方差来量化两个向量之间的距离
end
for j=1:size(D2,1) %计算R与D2的距离
d2(1,j)=cov(R-D2(j,:));
end
[v1,L1] = sort(d1) ;%d1升序排序,v1为排序结果,L1为规则
[v2,L2] = sort(d2) ;%d2升序排序
if R(1,size(R,2))==2 %如果R样本=2,是良性
H = D1(L1(1,2:k+1),:) ; %L1中是与R最近的距离的编号,赋值给H。
M = D2(L2(1,1:k),:) ; %v2(1,1:k) ;
else
H = D1(L1(1,1:k),:);
M = D2(L2(1,2:k+1),:) ;
end
%循环计算每2个样本特征之间的特征距离:(特征1-特征2)/(max-min)
for i = 1:size(H,1)
for j =1 :size(H,2)
Dh(i,j) = abs(H(i,j)-R(1,j))/9 ; % 本文数据范围都是1-10,所以max-min=9为固定
Dm(i,j) = abs(M(i,j)-R(1,j))/9 ;
end
end
%更新特征权重
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的累计加1
end
end