当前位置:   article > 正文

美赛 5:评价类模型、插值与拟合模型(十大模型篇)_美赛中用于评价的模型有哪些

美赛中用于评价的模型有哪些

目录

一、评价类模型

1.AHP(层次分析法)

2.TOPSIS法(优劣解距离方法)

二、插值与拟合模型

1.插值算法

2.拟合算法(cftool工具箱)


一、评价类模型

1.AHP(层次分析法)

        最基础的评价类模型,通过打分解决评价类问题(两两比较,推算权重)。

 

 Matlab代码:

  1. disp('请输入判断矩阵A')
  2. A=input('A=');
  3. [n,n] = size(A);
  4. % 方法1:算术平均法求权重
  5. Sum_A = sum(A);
  6. SUM_A = repmat(Sum_A,n,1);
  7. Stand_A = A ./ SUM_A;
  8. disp('算术平均法求权重的结果为:');
  9. disp(sum(Stand_A,2)./n)
  10. % 方法2:几何平均法求权重
  11. Prduct_A = prod(A,2);
  12. Prduct_n_A = Prduct_A .^ (1/n);
  13. disp('几何平均法求权重的结果为:');
  14. disp(Prduct_n_A ./ sum(Prduct_n_A))
  15. % 方法3:特征值法求权重
  16. [V,D] = eig(A);
  17. Max_eig = max(max(D));
  18. [r,c]=find(D == Max_eig , 1);
  19. disp('特征值法求权重的结果为:');
  20. disp( V(:,c) ./ sum(V(:,c)) )
  21. % 计算一致性比例CR
  22. CI = (Max_eig - n) / (n-1);
  23. RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];
  24. CR=CI/RI(n);
  25. disp('一致性指标CI=');disp(CI);
  26. disp('一致性比例CR=');disp(CR);
  27. if CR<0.10
  28. disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
  29. else
  30. disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
  31. end

 


2.TOPSIS法(优劣解距离方法)

        一种常用的综合评价方法,能充分利用原始数据的信息,反映各评价方案之间的差距。

改进:带权重的Topsis法(AHP or 熵权法)

Matlab代码:

  1. load data_water_quality.mat
  2. % 指标正向化
  3. [n,m] = size(X);
  4. disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标'])
  5. Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']);
  6. if Judge == 1
  7. Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4]
  8. disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')
  9. Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); %[2,1,3]
  10. for i = 1 : size(Position,2)
  11. X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));
  12. end
  13. disp('正向化后的矩阵 X = ')
  14. disp(X)
  15. end
  16. % 矩阵标准化
  17. Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
  18. disp('标准化矩阵 Z = ')
  19. disp(Z)
  20. % 是否需要增加权重
  21. disp("请输入是否需要增加权重向量,需要输入1,不需要输入0")
  22. Judge = input('请输入是否需要增加权重: ');
  23. if Judge == 1
  24. Judge = input('使用熵权法确定权重请输入1,否则输入0: ');
  25. if Judge == 1
  26. if sum(sum(Z<0)) >0
  27. disp('原来标准化得到的Z矩阵中存在负数,所以需要对X重新标准化')
  28. for i = 1:n
  29. for j = 1:m
  30. Z(i,j) = [X(i,j) - min(X(:,j))] / [max(X(:,j)) - min(X(:,j))];
  31. end
  32. end
  33. disp('X重新进行标准化得到的标准化矩阵Z为: ')
  34. disp(Z)
  35. end
  36. weight = Entropy_Method(Z);
  37. disp('熵权法确定的权重为:')
  38. disp(weight)
  39. else
  40. disp(['如果你有3个指标,你就需要输入3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输入[0.25,0.25,0.5]']);
  41. weight = input(['你需要输入' num2str(m) '个权数。' '请以行向量的形式输入这' num2str(m) '个权重: ']);
  42. OK = 0;
  43. while OK == 0
  44. if abs(sum(weight) -1)<0.000001 && size(weight,1) == 1 && size(weight,2) == m
  45. OK =1;
  46. else
  47. weight = input('你输入的有误,请重新输入权重行向量: ');
  48. end
  49. end
  50. end
  51. else
  52. weight = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
  53. end
  54. % 计算与最大值的距离和最小值的距离,并算出得分
  55. D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;
  56. D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;
  57. S = D_N ./ (D_P+D_N);
  58. disp('最后的得分为:')
  59. stand_S = S / sum(S)
  60. [sorted_S,index] = sort(stand_S ,'descend')


二、插值与拟合模型

1.插值算法

        数学建模中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。

分段三次埃尔米特插值 & 三次样条插值

Matlab代码:

  1. % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图
  2. % plot函数用法:
  3. % plot(x1,y1,x2,y2)
  4. % 线方式: - 实线 :点线 -. 虚点线 - - 波折线
  5. % 点方式: . 圆点 +加号 * 星号 x x形 o 小圆
  6. % 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青
  1. x = -pi:pi;
  2. y = sin(x);
  3. new_x = -pi:0.1:pi;
  4. % 分段三次埃尔米特插值
  5. p1 = pchip(x,y,new_x);
  6. % 三次样条插值
  7. p2 = spline(x,y,new_x);
  8. plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
  9. legend('样本点','分段三次埃尔米特插值','三次样条插值','Location','SouthEast')

总结:三次样条插值生成的曲线更加光滑。在实际建模中,由于我们不知道数据的生成过程,因此两种插值方法都可以使用。

一个Excel 数据插值实例

 

Matlab代码:

  1. %% 插值预测中间周的水体评价指标
  2. load Z.mat
  3. x=Z(1,:);
  4. [n,m]=size(Z);
  5. % 注意Matlab的数组中不能保存字符串,如果要生成字符串数组,就需要使用元胞数组,用大括号{}定义和引用
  6. ylab={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'};
  7. disp(['共有' num2str(n-1) '个指标要进行插值。'])
  8. P=zeros(11,15);
  9. for i=2:n
  10. y=Z(i,:);
  11. new_x=1:15;
  12. p1=pchip(x,y,new_x);
  13. subplot(4,3,i-1);
  14. plot(x,y,'ro',new_x,p1,'-');
  15. axis([0 15,-inf,inf])
  16. % xlabel('星期')
  17. ylabel(ylab{i})
  18. P(i-1,:)=p1;
  19. end
  20. legend('原始数据','三次埃尔米特插值数据','Location','SouthEast')
  21. %把P的第一行加上周数
  22. P = [1:15; P]

 


2.拟合算法(cftool工具箱)

        与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。

 

Matlab代码:

  1. load data1
  2. plot(x,y,'o')
  3. xlabel('x的值')
  4. ylabel('y的值')
  5. n = size(x,1);
  6. k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
  7. b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x))
  8. % 继续在之前的图形上来画图形
  9. hold on
  10. % 显示网格线
  11. grid on
  12. f=@(x) k*x+b;
  13. fplot(f,[2.5,7]);
  14. legend('样本数据','拟合函数','location','SouthEast')
  15. % y的拟合值
  16. y_hat = k*x+b;
  17. % 回归平方和
  18. SSR = sum((y_hat-mean(y)).^2)
  19. % 误差平方和
  20. SSE = sum((y_hat-y).^2)
  21. % 总体平方和
  22. SST = sum((y-mean(y)).^2)
  23. % 拟合优度
  24. R_2 = SSR / SST

 

强大的曲线拟合工具箱:cftool

 注意调整 Fit Options 参数的起始点!

(导出图像可以在渲染设置中调整为高分辨率)

Matlab代码:

  1. x = rand(30,1) * 10;
  2. y = 3 * exp(0.5*x) -5 + normrnd(0,1,30,1);
  3. % cftool


内容原作者:数学建模清风

学习用途,仅作参考。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/703411
推荐阅读
相关标签
  

闽ICP备14008679号