0%

【数学建模笔记 14】数学建模的模糊数学模型

定义

模糊数学就是用数学方法研究与处理模糊现象的数学。

现实的数学模型可以分为三大类:

  • 确定性数学模型:模型背景具有确定性,对象之间具有必然关系;
  • 随机性数学模型:模型背景具有随机性和偶然性。
  • 模糊性模型:模型背景具有模糊性。

被讨论的对象全体称论域,用 等表示。

对于论域 的每个元素和某一子集 ,在经典数学中,要么 ,要么

在模糊数学中,称没有明确边界的集合为模糊集合,元素属于模糊集合的程度用隶属度表示,计算隶属度的函数称隶属函数。

论域 闭区间上的任意映射 都确定了 上的一个模糊集合, 称隶属函数,记 ,使得 的点称过渡点,最具模糊性。

指派法

指派法是一种主观方法,依据人们的实践经验确定隶属函数。一些常用分布如:

  • 矩阵型

  • 梯形型

  • k 次抛物型

  • 正态型

模糊矩阵

为从 ​ 的模糊关系,隶属函数为 ,对任意 ,有 为模糊矩阵。

## 模糊模型识别

最大隶属度原则

,对 ,若存在 ,使 则认为 相对隶属于

例子

考虑人的年龄问题,分年轻、中年、老年三类,对应三个模糊集 ,设论域 ,且对

若某人 35 岁,代入得 可见 35 岁属于中年。

择近原则

,若存在 使 则认为 ​ 最贴近,判定为一类。其中 表示 的贴进度。

贴近度

贴进度是对两个模糊集接近程度的度量。

  • 海明贴近度

,则 ​,则

  • 欧几里得贴近度

,则 ​,则

  • 黎曼贴近度

,则

例子

设集合 ​,​,​,确定 属于哪一类。

由欧几里得贴近度有 因此 属于 类。

模糊聚类

构造模糊矩阵

设全体为论域 ,对象 的特性由 个指标表示,记 ,得 如果需要,作标准化处理得 计算 的模糊相似系数,构造模糊相似矩阵 计算模糊相似系数的方法有:

  • 夹角余弦法

  • 相关系数法

  • 距离法 选取适当 使 ​,并选取适当距离公式

  • 最大最小法

  • 算术平均最小法

  • 几何平均最小法

构造模糊等价矩阵

构造得到的 一般只满足自反性和对称性,采用平方法求出 的传递闭包

对于矩阵 ​,计算 其中

迭代计算 ​​,

直到出现 ,即有

聚类

对于 ​​​ 的每个元素 ​​,取不同阈值 ​​ 时,若 ​,认为 ​ 属于一类,反之不属于一类,从而画出聚类图。

例子

有五个类

使用距离法求相似系数 得相似矩阵 平方法求传递闭包得 于是有:

  • ​​;
  • ​;
  • ​;
  • ​;
  • ​​。

模糊综合评价

  1. 确定指标集 和权重向量
  2. 建立评语集
  3. 建立评价向量,获得评价矩阵
  4. 合成模糊综合评价结果向量,得到结果向量

对于 算子,通常有以下 4 种:

Python 代码

模糊聚类

对模糊聚类中的例子求解并画聚类图,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @ author: Koorye
# @ date: 2021-7-29
# @ function: 模糊聚类

# %%

import numpy as np
import pandas as pd
from scipy.cluster.hierarchy import dendrogram, linkage

# %%


# 距离公式
def dist(x, y):
return np.sum(np.abs(x - y))

# 源数据
A = np.array([[5, 5, 3, 2],
[2, 3, 4, 5],
[5, 5, 2, 3],
[1, 5, 3, 1],
[2, 4, 5, 1]])

# 构造相似模糊矩阵
num = len(A)
R = np.zeros((num, num))
for i in range(len(A)):
for j in range(len(A)):
R[i, j] = 1 - .1 * dist(A[i, :], A[j, :])
print('R =\n',R)

# %%

# 平方法求传递闭包
def tr(R):
R2 = R.copy()
for row in range(len(R)):
for col in range(len(R)):
r_list = []
for i in range(len(R)):
r_list.append(np.min([R[row, i], R[i, col]]))
R2[row, col] = np.max(r_list)
return R2

R_old = R
R = tr(R)
while np.sum(np.abs(R-R_old)) > 1e-4:
R_old = R
R = tr(R)
print('t(R) =\n', R)

# %%

# 画聚类图
R2 = np.triu(1-R, 1)
R2 = R2[R2!=0]
Z = linkage(R2)
dendrogram(Z, labels=['I','II','III','IV','V'])

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
R =
[[1. 0.1 0.8 0.5 0.3]
[0.1 1. 0.1 0.2 0.4]
[0.8 0.1 1. 0.3 0.1]
[0.5 0.2 0.3 1. 0.6]
[0.3 0.4 0.1 0.6 1. ]]
t(R) =
[[1. 0.4 0.8 0.5 0.5]
[0.4 1. 0.4 0.4 0.4]
[0.8 0.4 1. 0.5 0.5]
[0.5 0.4 0.5 1. 0.6]
[0.5 0.4 0.5 0.6 1. ]]