zoukankan      html  css  js  c++  java
  • MATLAB优劣解距离法(topsis)综合评价+代码

    优劣解距离法

    TOPSIS是通过逼近理想解的程度来评估各个样本的优劣等级

    收集与整理

    假设有n个待评价样本,p项评价指标,形成原始指标数据矩阵:

    预处理数据

    使指标具有同趋势性。评价指标中有正向指标和负向指标之分,一般把负向指标转化为正向指标,转化的方法可采用倒数法(即1/X),多适用于绝对数指标;差值法(即1-X),多适用于相对数指标。转化后的数据矩阵仍记为X。
    数据无量纲化.。将原始数据归一化,以消除量纲向量数据归一化的方式:

    最终得到分析数据矩阵

    寻找最优值和最劣值

    找出各项指标的最优值和最劣值,建立最优值向量z+和最劣值z-向量

    计算离尺度

    计算理想解的接近度

    排序

    根据Ci的大小进行排序,Ci越大,表明评价对象越接近最优值。

    原理讲解引自:https://blog.csdn.net/qq_42374697/article/details/105901229 

    题目

    评价下表中20条河流的水质情况。(熵权法和优劣解距离法对比)
    注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。

    河流

    含氧量(ppm)

    PH值

    细菌总数(个/mL)

    植物性营养物量(ppm)

    A

    4.69

    6.59

    51

    11.94

    B

    2.03

    7.86

    19

    6.46

    C

    9.11

    6.31

    46

    8.91

    D

    8.61

    7.05

    46

    26.43

    E

    7.13

    6.5

    50

    23.57

    F

    2.39

    6.77

    38

    24.62

    G

    7.69

    6.79

    38

    6.01

    H

    9.3

    6.81

    27

    31.57

    I

    5.45

    7.62

    5

    18.46

    J

    6.19

    7.27

    17

    7.51

    K

    7.93

    7.53

    9

    6.52

    L

    4.4

    7.28

    17

    25.3

    M

    7.46

    8.24

    23

    14.42

    N

    2.01

    5.55

    47

    26.31

    O

    2.04

    6.4

    23

    17.91

    P

    7.73

    6.14

    52

    15.72

    Q

    6.35

    7.58

    25

    29.46

    R

    8.29

    8.41

    39

    12.02

    S

    3.54

    7.27

    54

    3.16

    T

    7.44

    6.26

    8

    28.41

    代码

    .mat数据:在MATLAB里面随便创建一个变量,将表格中的数据粘贴进变量中,再另存为.mat数据就行。

    main.m

    %% 数据读取
    clear,clc
    load rivers_data.mat
    %% 正向化处理
    [n,m] = size(datas_matrix);
    % 正向化处理的数据所在列
    Pos = [2,3,4];
    % 指标类型:1:极小型,2:中间型,3:区间型
    ch = [2,1,3];
    % 循环处理每一列
    for i = 1 : size(Pos,2)
        datas_matrix(:,Pos(i)) = Forward_processing(datas_matrix(:,Pos(i)),ch(i),Pos(i));
    end
    
    %% 权重
    %如果不需要加权重就默认权重都相同,即都为1/m
    weigh = ones(1,m) ./ m ;
    
    %% 归一化
    for i = 1:m
        tmp = datas_matrix(:,i)
        datas_S_matrix(:,i) = (tmp - min(tmp))/(max(tmp) - min(tmp));
    end
    
    %% 计算与最大值的距离和最小值的距离,并算出得分
    max_dis = sum([(datas_S_matrix - repmat(max(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
    min_dis = sum([(datas_S_matrix - repmat(min(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
    S = min_dis ./ (max_dis+min_dis); 
    results = S / sum(S);
    [sorted_results,index] = sort(results ,'descend');
    format short
    R = [index,sorted_results];
    xlswrite('results.xls',R);

    Forward_processing.m

    function [posit_x] = Forward_processing(x,type,~)
        if type == 1 %极小型
            %正向化
            posit_x = max(x) - x;
        elseif type == 2 %中间型
            best = 7;
            M = max(abs(x-best));
            posit_x = 1 - abs(x-best) / M;
        elseif type == 3 %区间型
            a = 10;
            b = 20;
            r_x = size(x,1);
            M = max([a-min(x),max(x)-b]);
            posit_x = zeros(r_x,1);
            for i = 1: r_x
                if x(i) < a
                    posit_x(i) = 1-(a-x(i))/M;
                elseif x(i) > b
                    posit_x(i) = 1-(x(i)-b)/M;
                else
                    posit_x(i) = 1;
                end
            end
        end
    end
    
  • 相关阅读:
    windows下搭建基于eclipse插件的GoLang开发环境
    vtk类之vtkImageReslice:基本算法,对体数据沿着轴进行切片
    vtk类之vtkTextureMapToSphere:纹理映射算法, 映射球体纹理
    wxpython 之 GDI 画刷Brush(三)
    c# 获取Rss数据
    C# 基础知识系列之面向对象基础
    SilverLight 得到文件绝对路径
    SilverLight C# 读取并修改App.config文件
    Silverlight 脱离浏览器
    C# 中New关键字的用法
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/13096966.html
Copyright © 2011-2022 走看看