- 掌握数据文件的标准化、模糊相似矩阵的建立方法、学会传递闭包矩阵的求解方法;
- 学会使用MATLAB软件(Python)进行模糊矩阵的编程运算和仿真,实现模糊聚类分析。
-
根据下面表格中的数据,用Matlab(或Python)编程进行数据标准化处理;
-
根据标准化处理后的数据,用Matlab(或Python)编程,建立模糊相似矩阵,并编程求出其传递闭包矩阵;
-
根据模糊等价矩阵,编程绘制动态聚类图;
-
根据原始数据,编程确定最佳分类结果。
no Y1 Y2 Y3 Y4 Y5 Y6 x1 21 63 19 40 1.567 106 x2 23 74 30 75 2.693 54 x3 119 179 86 118 6.897 9 x4 115 168 49 89 2.637 29 x5 79 146 46 92 2.356 24 x6 79 158 48 103 2.142 7 x7 65 114 58 99 2.679 7 x8 68 119 58 96 3.099 6 x9 109 166 59 95 2.868 6 x10 118 177 56 89 2.64 7
-
建立原始数据矩阵
依据题意,建立10×6的原始矩阵A,在matlab中表示如下图:
图1.1 原始数据矩阵 -
数据规格化
对原始矩阵应用极差正规化方法进行数据规格化,运用matlab编写fuzz函数,代码如下:
function n = fuzz(A) [hei, wid] = size(A); n = zeros(hei, wid); for i = 1: hei for j = 1: wid n(i, j) = (A(i, j) - min(A(:, j)))/(max(A(:, j)) - min(A(:,j))); end end end在命令行输入n = fuzz(A)调用该函数,得到数据矩阵n如下图。
图1.2 数据规格化
-
建立模糊相似矩阵
对数据矩阵应用最大最小法得到模糊相似矩阵,编写fuzzs函数,代码如下:
function m = fuzzs(n) [hei, wid] = size(n); m = zeros(hei, hei); for i = 1: hei for j = 1: hei maxnum = 0; minnum = 0; for k = 1: wid maxnum = maxnum + max(n(i, k), n(j, k)); minnum = minnum + min(n(i, k), n(j, k)); end m(i, j) = minnum/maxnum; end end end在命令行输入m = fuzzs(n)调用该函数,得到模糊相似矩阵m如下图。
图2.1 模糊相似矩阵 -
建立模糊等价矩阵
应用传递闭包方法将模糊相似矩阵转化为模糊等价矩阵,编写synt函数,代码如下:
function ab = synt(a) [hei, wid] = size(a); ab = zeros(hei, wid); flag = 0; while(flag == 0) m = size(a, 1); n = size(a, 2); for i = 1: m for j = 1 :n ab(i, j) = max(min([a(i, :);a(:, j)'])); end end if(ab == a) flag = 1; else a = ab; end end end输入m0 = synt(m)调用该函数,得到模糊等价矩阵m0如下图。
图2.2 模糊等价矩阵
-
훌-截矩阵
根据模糊等价矩阵,建立훌-截矩阵,按훌由大到小进行聚类,编写jjz4函数,代码如下:
function[D, k] = jjz4(b) L = unique(b)'; a = size(b); D = zeros(a); for m = length(L): -1 : 1 k = L(m); for i = 1: a for j = 1: a if b(i, j) >= k D(i, j) = 1; else D(i, j) = 0; end end end B = unique(D, 'rows'); [hei] = size(B); for j = 1: hei eval(['L', num2str(j) '= [];']) end for i = a: -1: 1 for j = 1: hei if D(i, :) == B(j, :) p = eval(['L', num2str(j);]); p = [['x', num2str(i), ' '] p]; eval(['L', num2str(j) '= p;']); end end end fprintf("当分类系数k=%5.4f时,", L(m)); fprintf("所得截距阵为:nn"); disp(D); fprintf("分类结果为:n"); for j = 1: hei fprintf("第%d类:", j); disp(eval(['L', num2str(j);])); end fprintf("n"); end end输入jjz4(m0)调用该函数,为了便于看到所有的结果,先将显示截距阵的一行代码注释掉,运行得到所有分类结果如下图。
图3.1 所有分类结果 选取훌 = 0.8791时函数得到的截距阵及分类结果图如下。
图3.2 훌=0.8791时截距阵 -
动态聚类图
根据分类结果绘制动态聚类图如下。
图3.3 动态聚类图
-
훌=0.8374
훌=0.8374时具有最佳分类结果,调用jjz4函数得到最佳分类的截距阵及分类结果如下图。图4.1 最佳分类的截距阵及分类结果 由图可知一共分为了6类,其中x7,x8一类,x5,x6一类,x4,x9,x10一类,x1,x2,x3单独成一类。



