数学建模系列-模糊综合评价FCE

目录

1 模型的含义

2 隶属函数的确定

2.1 模糊统计法(数模比赛很少用,要发放问卷)

2.2 借助已有的客观尺度(需要有合适的指标并有数据)

 2.3 指派法

3 模型建立与求解

3.1 建立综合评价的因素集

3.2 建立综合评价的评价集

3.3 确定各因素的权重

3.4 确定各因素的权重进行单元素模糊评价,获得评价矩阵

 3.5 建立综合评价模型

3.6 确定系统总得分


今天要讲解的是比赛常用到的评价模型——模糊综合评价法。

1 模型的含义

        模糊综合评价法根据模糊数学的隶属度理论将定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决

        缺点:计算复杂,对指标权重矢量的确定主观性较强;当指标集U较大,即指标集个数凡较大时,在权矢量和为1的条件约束下,相对隶属度权系数往往偏小,权矢量与模糊矩阵R不匹配,结果会出现超模糊现象,分辨率很差,无法区分谁的隶属度更高,甚至造成评判失败,此时可用分层模糊评估法加以改进。

        在生活中,由很多概念无法用准确的集合去划分,例如年轻与年老。

        模糊数学尝试将模糊的概念量化,方便进行处理计算。

1 隶属度:

        隶属度表示元素与模糊集合之间的关系,即元素属于模糊集合的程度。隶属度的范围在0到1之间,其值越大,就代表元素越属于这个集合。

2 隶属函数:

        隶属函数就是给定一个模糊集合,之后再通过某些方法,给出我们需要研究的元素相对于该模糊集合的隶属度。那么我们怎么确定隶属函数呢?

2 隶属函数的确定

2.1 模糊统计法(数模比赛很少用,要发放问卷)

        简单的讲就是找个专家或者来个问卷调查,看一下专家给出的评断或者调查统计结果显示比如给一个东西质量打分,优秀占多少,良好占多少,差又占多少。

        原理:找多个人去对同个模糊概念进行描述,用隶属频率去定义隶属度 。

2.2 借助已有的客观尺度(需要有合适的指标并有数据)

        对于某些模糊集合,我们可以用已经有的指标去作为元素的隶属度。例如判断小康家庭的恩格尔系数。

 2.3 指派法

        (根据问题的性质直接套⽤某些分布作为⾪属函数,主观性较强)

        在确定模糊集合的所属分类后,给它指派一个隶属函数,得到元素的隶属度。

1、因素集(评价指标集)如:(德育、智育、文体)

2、评语集(评价的结果)如:(优、良、中等)

3、权重集(指标的权重)如:(0.3、0.6、0.1)

3 模型建立与求解

3.1 建立综合评价的因素集

        因素集是以影响评价对象的各种因素为元素所组成的一个普通集合,通常用U表示,U={U1,U2,…Un},其中元素Vi代表影响评价对象的第i个因素。这些因素,通常都具有不同程度的模糊性。

        对员工的表现,需要从多个方面进行综合评判,如科研成果的革新程度、安全性能、经济效益、推广前景等。所有这些因素构成了评价指标体系集合,即因素集,记为:U={革新程度U1,安全性能U2,经济效益U3,推广前景U4,成熟型U5}。

3.2 建立综合评价的评价集

        评价集是评价者对评价对象可能做出的各种结果所组成的集合,通常用V表示,V={V1,V2,…Vm},其中元素Vj代表第j种评价结果,可以根据实际情况的需要,用不同的等级、评语或数字来表示。

        对科研成果等级的评价有很好、较好、一般、不好等。由各种不同决断构成的集合称为评语集,记为:V={很好V1,较好V2,一般V3,不好V4}。

3.3 确定各因素的权重

        评价工作中,各因素的重要程度有所不同,为此,给各因素一个权重a,各元素的权重a组成模糊集合,用A表示。

        在没有数据时,我们可以用层次分析法确定权重;在有数据时,我们可以通过熵权法确定权重。在案例中,我们确定各因素的权重为:A = {0.25,0.2,0.25,0.3}

3.4 确定各因素的权重进行单元素模糊评价,获得评价矩阵

        若因素集中元素对评价集的元素的隶属度为r,则对第i个元素单因素评价的结果可以用模糊集合表示为:

         以 m 个单因素评价集 R为行组成矩阵R_n*m称为模糊综合评价矩阵。

        得到以下评价矩阵:

 3.5 建立综合评价模型

        确定单因素评判矩阵R和因素权向量A之后,通过模糊变化将U上的模糊向量A变为V上的模糊向量B。

3.6 确定系统总得分

         综合评价模型确定后,确定系统得分F为:

         其中F为系统总得分,S 为V 中相应因素的级分。在本例中,我们设置优秀、良好、一般、较差、很差的得分分别为100、75、50、25、0,则我们得到S = {100,75,50,25,0},则该员工最后的系统总得分为71.5。

<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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽水啤酒花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值