内容
1 知识点回顾
2 最优权重思想
3 算法步骤
3.1 数据的预处理
3.2 向低维投影
3.3 构造投影的指标函数
3.4 对投影方向的优化
3.5 求解投影的评价值
4 Matlab实现
5 结果
1 知识点回顾
智能优化算法——模拟退火法(Python实现)
智能优化算法——模拟退火法(Python&Matla实现)
2 最优权重思想
采用一般评价方法确定指标权重时,往往根据指标数据的分布和大小来确定权重的计算结果。投影追踪法主要根据评价结果的方差和相互绝对误差调整权重,得到能反映原始数据的最佳投影(可以理解为重要性值),得到的评价值在这种方式比较有参考价值。
3算法步骤
3.1 数据的预处理
如果所有指标的单位统一,且数值都大于0小于1,那么就可省去归一化处理;
在建立评价模型之前,首先要对指标值进行正反分析。指标值越大,效益越好,为正指标;指标值越大,收益越差,为负指标。 (指标类型不同时归一化的方式不同)
3.2 向低维投影
选择多种角度观察指标数据,充分挖掘和反映数据特征的最佳投影向量。制作
为n维的单位向量,表示n个指标投影的方向向量,则第i个样本在一维空间上的线性投影为:
3.3 构造投影的指标函数
设数据的投影值为Zi,基于投影寻踪,本文通过构造投影的指标函数来求得信息在整体上的分布特征以及局部投影点的分布特征,一般的,信息在整体上分布应尽量散开,而局部投影点分布应尽量密集,最终用投影指标函数来表示其最大乘积。
其中Ba是投影值Zi的局部密度,投影值Zi的标准差为Sa,故Ba与Sa可表示为:
上式中,为Zi的均值,u是单位阶跃函数,其作用是当取值大于0时,值为1;取值小于0时,值为0。R是求求取局部密度的窗口口径,半径的选取必须含尽量多的投影点,否则滑动的平均偏差将过大。rij的距离公式为:
3.4 对投影方向的优化
本文采用模拟退火算法对目标函数进行优化,以获得能反映原始数据的最佳投影。
目标函数设置为:
模拟退火基本原理是将高温粒子缓慢自然冷却,最终在特定的温度下达到热平衡,且能达到最低能量状态E(i)。E(i)遵循以下规则。
1)若E(i)≥E(j),则接受该状态被下一状态转化
2)若E(i)<E(j),则该状态有一定概率被接受,概率为:
其中,K为波尔兹曼常数,T为粒子的温度。
基于此规则,目标函数通过模拟退火算法转化为:
3.5 求解投影的评价值
投影评价值:
4 Matlab实现
clear
clc
%% 导入数据,每列为指标,每行为样本数据,计算每个样本投影评价值
x=[0.81 0.00 0.37 0.00 0.15 0.00 0.97
0.14 0.49 0.00 1.00 1.00 0.59 0.97
0.57 0.43 0.11 0.97 0.00 0.73 0.83
1.00 0.40 0.69 0.50 0.88 1.00 0.60
0.73 0.26 1.00 0.00 0.88 1.00 0.63
0.00 0.74 0.29 0.32 0.45 1.00 0.00
0.84 0.46 0.26 0.71 0.97 0.64 0.50
0.11 1.00 0.37 0.06 0.39 0.50 0.73
0.27 0.09 0.49 0.29 0.94 0.86 0.40
0.70 0.26 0.69 0.38 0.18 0.45 1.00 ];
%% 矩阵维度计算,目的在于方便后面的计算
[a,b]=size(x);
%% 如果各指标数据的单位不同,则需归一化处理
%max1=max(x);
%min1=min(x);
%% 负向指标归一化,例子如下:
%x(:,1)=(0.98*max1(1)-x(:,1))/(0.98*max1(1)-0.02*min1(1));
%x(:,1)指的是x矩阵中的第一列
%% 正向指标归一化,例子如下:
%x(:,2)=(x(:,2)-0.02*min1(2))/(0.98max1(2)-0.02*min1(2));
%x(:,2)指的是x矩阵中的第二列
%此外也可直接将归一化的数据直接导入x矩阵中就不用以上加%的程序了
%% 这里的最大最小为什么要乘以个0.98和0.02呢,这里小编直接说结果把说下吧,
%如果不分别乘以0.98和0.02,那么最终的r矩阵可能会出现0,从而干扰结果
tic %简单地说,tic和toc是用来记录matlab命令执行的时间
%tic用来保存当前时间,而后使用toc来记录程序完成时间。
for k=1:a
%% 退火寻找最优投影方向
temperature=100;%初始温度
iter=100;%迭代次数
L=1;%用于记录迭代的次数
n=size(x,2);%指标个数
c=suiji(n);%随机生成初始值,在遗传算法中就相当于初始种群
p=c;
y=Target(x,c);
while temperature>0.01
for i=L:iter
c1=suiji(n);%这里为什么还要随机呢,目的在于避免算法陷入局部最优值这一缺陷
y1=Target(x,c1);%计算目标函数值
delta_e=y1-y;
if delta_e>0
y=y1;
p=c1;
else
if exp(delta_e/temperature)>rand()
y=y1;
p=c1;
end
end
end
L=L+1;
temperature=temperature*0.99;
end
w(k)=y;
e(k,:)=p;
end
toc
%% 求得各样本投影值 r
c=e(find(w==max(w)),:)%c记录的是每个指标的权重值,也就是通过对数据分析,赋予了指标一个参比性的一个值
%这里的find(w==max(w)是什么意思呢,是找到w矩阵中最后一个最大值的位置,目的也是为了寻找最优的结果
%e记录的是经L次迭代生成的一个参比性值的矩阵
for i=1:a
for j=1:b
r(i,j)=sum(x(i,j).*c(j));%每行每列的评价值
end
end
sum(r,2)%各样本评价值
function y=Target(x,a)
%% 计算目标函数值,见模型步骤3
[m,n]=size(x);
for i=1:m
s1=0;
for j=1:n
s1=s1+a(j)*x(i,j);
end
z(i)=s1;
end
Sz=std(z);%方差Sa
R=0.1*Sz;
s3=0;
for i=1:m
for j=1:m
r=abs(z(i)-z(j));
t=R-r;
if t>=0
u=1;
else
u=0;
end
s3=s3+t*u;
end
end
Dz=s3; %Ba
y=Sz*Dz; %maxG(a)=Sa.Ba
end
function a=suiji(n)
%% 初始化
for k=1:n
b(k)=rand();
end
temp=sum(b.^2);
a=sqrt((b.^2)./temp);
end
5 结果
版权声明:本文为博主是梦吧,是你吧!原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/weixin_46039719/article/details/123187156