<think>我们被要求编写一个附带绘制图像功能的、用于数学建模模糊综合评价的Python通用代码。
模糊综合评价通常包括以下步骤:
1. 确定因素集(评价指标)和评语集(评价等级)。
2. 构建权重向量(各因素的权重)。
3. 建立隶属度矩阵(每个因素对各个评语的隶属程度)。
4. 进行模糊合成运算(通常使用权重向量和隶属度矩阵的矩阵乘法,然后归一化)。
5. 根据最大隶属度原则或加权平均等方法确定评价结果。
此外,我们还需要绘制图像来展示评价结果,比如绘制隶属度条形图或雷达图。
我们将编写一个通用的函数,允许用户输入因素集、评语集、权重向量和隶属度矩阵(或隶属度函数),然后进行模糊合成,并绘制结果。
由于模糊综合评价中隶属度矩阵的构建通常需要根据具体问题设计,我们这里假设用户已经构建好了隶属度矩阵,或者我们提供一个简单的示例隶属度函数(例如三角形隶属函数)来生成隶属度矩阵。
为了简化,我们假设用户直接提供隶属度矩阵。
代码结构:
1. 定义模糊综合评价函数,输入:因素集、评语集、权重、隶属度矩阵。
2. 进行模糊合成(这里我们使用最常见的合成算子:加权平均型)。
3. 对合成结果进行归一化(因为合成结果可能不满足归一化条件)。
4. 绘制结果:可以绘制每个评语的隶属度条形图,也可以绘制各因素隶属度的雷达图(或称为蜘蛛图)等。
5. 返回评价结果(合成向量)以及最终的评价等级(按照最大隶属度原则)。
此外,我们还可以提供绘制因素权重分布图的功能。
我们使用matplotlib和numpy库。
注意:由于用户要求附带绘制图像功能,我们将至少绘制两个图:
- 权重分布条形图(可选)
- 最终评价结果(综合隶属度)的条形图
另外,我们还可以考虑绘制每个因素对各个评语的隶属度(需要多个条形图或堆叠条形图),但这可能会随着因素增多而变得复杂,所以作为可选,我们先绘制综合结果的条形图。
步骤:
1. 导入必要的库:numpy, matplotlib
2. 定义函数:fuzzy_comprehensive_evaluation(factors, comments, weights, membership_matrix, plot=True)
- factors: 因素集,列表,如['因素1','因素2',...]
- comments: 评语集,列表,如['差','中','好']
- weights: 权重向量,一维数组,需要归一化(或者确保和为1)
- membership_matrix: 二维数组,行对应因素,列对应评语,即第i行第j列表示第i个因素对第j个评语的隶属度。
注意:我们假设membership_matrix的行数等于因素个数,列数等于评语个数。
如果用户传入的weights未归一化,我们在函数内部进行归一化。
模糊合成:使用权重向量与隶属度矩阵的矩阵乘法(即加权平均)。
result = weights @ membership_matrix (注意:如果weights是行向量,membership_matrix是矩阵,则得到行向量)
然后,对结果进行归一化(除以总和),因为有时合成结果可能不归一。
最后,按照最大隶属度原则,选择最大隶属度对应的评语作为最终评价。
绘图:
- 绘制权重的条形图(可选,如果plot=True则绘制)
- 绘制综合隶属度的条形图
我们还可以绘制每个因素的隶属度分布(多个条形图或堆叠图),但考虑到通用性,我们先不绘制,因为因素可能很多。
代码实现:
</think>以下是一个附带绘制图像功能的数学建模模糊综合评价Python通用代码实现。该代码基于模糊数学理论,实现了完整的模糊综合评价流程,并包含可视化功能。
```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import seaborn as sns
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
class FuzzyComprehensiveEvaluation:
"""
模糊综合评价类
实现模糊综合评价算法的通用框架
"""
def __init__(self, factors, comments):
"""
初始化评价系统
:param factors: 评价因素列表,如 ['教学质量', '科研水平', '师资力量']
:param comments: 评价评语集,如 ['优', '良', '中', '差']
"""
self.factors = factors
self.comments = comments
self.weights = None
self.membership_matrix = None
def set_weights(self, weights):
"""
设置各因素权重
:param weights: 权重向量,需满足归一化条件
"""
if abs(sum(weights) - 1.0) > 1e-6:
raise ValueError("权重和必须为1")
if len(weights) != len(self.factors):
raise ValueError("权重数量需与因素数量一致")
self.weights = np.array(weights)
def set_membership_matrix(self, matrix):
"""
设置隶属度矩阵
:param matrix: 二维数组,行对应因素,列对应评语
"""
matrix = np.array(matrix)
if matrix.shape != (len(self.factors), len(self.comments)):
raise ValueError("隶属度矩阵维度不匹配")
if np.any(matrix < 0) or np.any(matrix > 1):
raise ValueError("隶属度必须在[0,1]范围内")
self.membership_matrix = matrix
def evaluate(self, operator='M(·,⊕)'):
"""
执行模糊综合评价
:param operator: 模糊合成算子类型
:return: 综合评价结果向量
"""
if self.weights is None or self.membership_matrix is None:
raise ValueError("必须先设置权重和隶属度矩阵")
# 使用不同的模糊合成算子
if operator == 'M(∧,∨)': # 主因素决定型
result = np.zeros(len(self.comments))
for j in range(len(self.comments)):
max_val = 0
for i in range(len(self.factors)):
val = min(self.weights[i], self.membership_matrix[i, j])
if val > max_val:
max_val = val
result[j] = max_val
elif operator == 'M(·,∨)': # 主因素突出型
result = np.zeros(len(self.comments))
for j in range(len(self.comments)):
max_val = 0
for i in range(len(self.factors)):
val = self.weights[i] * self.membership_matrix[i, j]
if val > max_val:
max_val = val
result[j] = max_val
else: # 加权平均型 M(·,⊕)
result = np.dot(self.weights, self.membership_matrix)
# 归一化处理
result /= result.sum()
return result
def plot_results(self, result_vector, title="模糊综合评价结果"):
"""
可视化评价结果
:param result_vector: 评价结果向量
:param title: 图表标题
"""
plt.figure(figsize=(12, 6))
# 条形图显示各评语隶属度
plt.subplot(121)
bars = plt.bar(self.comments, result_vector, color=sns.color_palette("viridis", len(self.comments)))
plt.title('评语隶属度分布')
plt.xlabel('评语等级')
plt.ylabel('隶属度')
plt.ylim(0, 1)
# 为条形图添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height:.3f}', ha='center', va='bottom')
# 雷达图展示多维评价
plt.subplot(122, polar=True)
angles = np.linspace(0, 2 * np.pi, len(self.factors), endpoint=False).tolist()
angles += angles[:1] # 闭合图形
# 创建雷达图
stats = result_vector.tolist() * 2 # 使最后一个点连接到第一个点
ax = plt.subplot(122, polar=True)
ax.fill(angles, stats, alpha=0.25)
ax.plot(angles, stats, marker='o')
# 设置角度标签
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
ax.set_thetagrids(np.degrees(angles[:-1]), self.comments * 2) # 设置标签位置
# 设置径向轴
ax.set_rlabel_position(0)
plt.yticks([0.2, 0.4, 0.6, 0.8], ["0.2", "0.4", "0.6", "0.8"], color="grey", size=7)
plt.ylim(0, 1)
plt.title('多维评价分析', pad=20)
plt.suptitle(title, fontsize=16)
plt.tight_layout()
plt.show()
def plot_membership_matrix(self):
"""可视化隶属度矩阵"""
if self.membership_matrix is None:
raise ValueError("隶属度矩阵未设置")
plt.figure(figsize=(10, 6))
sns.heatmap(self.membership_matrix,
annot=True,
fmt=".2f",
cmap="YlGnBu",
xticklabels=self.comments,
yticklabels=self.factors)
plt.title('因素-评语隶属度矩阵')
plt.xlabel('评语等级')
plt.ylabel('评价因素')
plt.show()
# ====================== 使用示例 ======================
if __name__ == "__main__":
# 1. 定义评价因素和评语集
factors = ['师资力量', '课程质量', '教学设施', '学术氛围', '就业前景']
comments = ['优', '良', '中', '差']
# 2. 创建评价对象
fce = FuzzyComprehensiveEvaluation(factors, comments)
# 3. 设置权重向量 (需归一化)
weights = [0.25, 0.20, 0.15, 0.20, 0.20]
fce.set_weights(weights)
# 4. 设置隶属度矩阵 (行:因素, 列:评语)
membership_matrix = [
[0.4, 0.3, 0.2, 0.1], # 师资力量
[0.3, 0.4, 0.2, 0.1], # 课程质量
[0.2, 0.3, 0.4, 0.1], # 教学设施
[0.3, 0.3, 0.3, 0.1], # 学术氛围
[0.5, 0.3, 0.1, 0.1] # 就业前景
]
fce.set_membership_matrix(membership_matrix)
# 5. 可视化隶属度矩阵
fce.plot_membership_matrix()
# 6. 使用不同算子进行评价并可视化结果
operators = ['M(·,⊕)', 'M(∧,∨)', 'M(·,∨)']
for op in operators:
result = fce.evaluate(operator=op)
print(f"\n使用算子 {op} 的综合评价结果:")
for comment, value in zip(comments, result):
print(f"{comment}: {value:.4f}")
# 可视化结果
fce.plot_results(result, title=f"模糊综合评价结果 ({op})")
```
### 代码说明
1. **算法核心**:
- 实现了三种模糊合成算子:加权平均型`M(·,⊕)`、主因素决定型`M(∧,∨)`和主因素突出型`M(·,∨)`
- 包含权重归一化验证和隶属度范围检查
- 结果向量自动归一化处理
2. **可视化功能**:
- `plot_results()`:生成双图展示结果
- 左侧条形图:清晰显示各评语等级的隶属度
- 右侧雷达图:直观展示多维评价分布
- `plot_membership_matrix()`:热力图展示因素-评语关系矩阵
3. **使用示例**:
- 高校教育质量评价案例(5因素4评语)
- 演示不同模糊算子的评价结果差异
- 包含完整的可视化演示
### 使用说明
1. 初始化评价系统:
```python
fce = FuzzyComprehensiveEvaluation(factors, comments)
```
2. 设置权重向量(需归一化):
```python
fce.set_weights([0.3, 0.2, 0.1, 0.4])
```
3. 设置隶属度矩阵:
```python
fce.set_membership_matrix([
[0.4, 0.3, 0.2, 0.1],
[0.3, 0.4, 0.2, 0.1],
...
])
```
4. 执行评价并可视化:
```python
result = fce.evaluate(operator='M(·,⊕)')
fce.plot_results(result)
```
### 输出示例
代码运行后会显示:
1. 隶属度矩阵热力图(颜色越深表示隶属度越高)
2. 综合评价结果双图(条形图+雷达图)
该通用代码适用于各类模糊综合评价场景,如教学质量评估、产品满意度评价、环境质量评估等[^1]。