用Python解决综合评价问题_模糊综合评价,决策树与灰色关联分析

news2024/11/15 17:25:52

一:模糊综合评价

模糊综合评价是一种有效的处理不确定性和模糊性的评价方法,特别是在人才评价等领域。它允许我们综合考虑多个评价指标,并给出一个综合的评价结果。以下是利用模糊综合评价对人才进行评价的步骤:

  1. 确定评价指标:首先,我们需要确定用于评价人才的各种指标,例如专业技能、团队合作能力、创新能力等。

  2. 建立评价集:评价集是对人才评价结果的集合,例如“优秀”、“良好”、“一般”、“较差”等。

  3. 确定权重:每个评价指标对人才评价的影响程度不同,因此需要为每个指标分配一个权重,表示其重要性。

  4. 构建模糊关系矩阵:通过专家打分或其他方法,对每个指标进行评价,构建一个模糊关系矩阵,表示评价指标与评价集之间的关系。

  5. 模糊合成:使用合适的合成方法(如最大-最小合成法),将模糊关系矩阵与权重相结合,得到一个综合评价结果。

  6. 结果分析:对综合评价结果进行分析,得出对人才的最终评价。

现在,我们可以通过一个示例来演示这个过程。假设我们有三个评价指标:专业技能、团队合作能力和创新能力,每个指标的权重分别为0.6、0.3 和 0.1。评价集为{ 优秀,良好,一般,较差 }。我们可以构建一个模糊关系矩阵,并计算出一个综合评价结果。

为了简化计算,我们可以假设模糊关系矩阵已经通过专家打分得到。接下来,我将使用Python来计算这个模糊综合评价。首先,我们需要定义权重和模糊关系矩阵。然后,我们将使用模糊合成方法来计算最终的评价结果。

import numpy as np

# 定义权重
weights = np.array([0.6, 0.3, 0.1])

# 每一行代表一个评价指标,每一列代表一个评价等级(优秀,良好,一般,较差)
fuzzy_relation_matrix = np.array([
    [0.7, 0.2, 0.1, 0],
    [0.6, 0.3, 0.1, 0],
    [0.2, 0.5, 0.3, 0]
])

# 计算综合评价结果
# 使用最大-最小合成法
def fuzzy_composite_evaluation(weights, fuzzy_relation_matrix):
    # 将权重扩展到与模糊关系矩阵相同的维度
    weighted_matrix = np.tile(weights, (fuzzy_relation_matrix.shape[1], 1)).T * fuzzy_relation_matrix
    # 计算每个评价等级的综合得分
    composite_scores = np.max(weighted_matrix, axis=0)
    return composite_scores

composite_scores = fuzzy_composite_evaluation(weights, fuzzy_relation_matrix)
composite_scores

通过计算,我们得到了每个评价等级的综合得分:优秀为0.42,良好为0.12,一般为0.06,较差为0。这意味着根据给定的权重和模糊关系矩阵,这位人才在“优秀”这一评价等级上的得分最高,因此可以认为这位人才的整体表现是优秀的。

以下是对这段代码中模糊综合评价所用数学原理的解释:

一、权重的作用

给定的权重 weights = np.array([0.6, 0.3, 0.1]),表示各个评价指标在综合评价中的重要程度。权重值越大,对应的评价指标对最终结果的影响就越大。

二、模糊关系矩阵

模糊关系矩阵 fuzzy_relation_matrix 每一行代表一个评价指标,每一列代表一个评价等级(优秀,良好,一般,较差)。矩阵中的元素表示某个评价指标对于特定评价等级的隶属度。例如,fuzzy_relation_matrix[0][0]=0.7 表示第一个评价指标对于 “优秀” 这个评价等级的隶属度为 0.7,即有70%的可能性认为该人才在专业技能方面是优秀的。具体来说:

  • 第一行代表“专业技能”这一评价指标在不同评价等级上的隶属度。
  • 第二行代表“团队合作能力”这一评价指标在不同评价等级上的隶属度。
  • 第三行代表“创新能力”这一评价指标在不同评价等级上的隶属度。

三、最大 - 最小合成法

1:扩展权重:将权重扩展到与模糊关系矩阵相同的维度,通过 np.tile(weights, (fuzzy_relation_matrix.shape[1], 1)).T 操作,将权重在列方向上进行重复,使其维度与模糊关系矩阵一致。然后与模糊关系矩阵相乘,得到 weighted_matrix。这个过程实际上是将每个评价指标的权重与对应的隶属度进行结合,得到加权后的隶属度。

2:计算综合得分composite_scores = np.max(weighted_matrix, axis=0),对加权后的矩阵在列方向上取最大值。这是基于最大 - 最小合成法的原理,即对于每个评价等级,取所有评价指标在该等级上的加权隶属度的最大值作为该等级的综合得分。这种方法体现了在模糊综合评价中,综合考虑各个评价指标的影响,以最具优势的情况来确定最终的评价结果。

总的来说,这段代码通过给定的权重和模糊关系矩阵,利用最大 - 最小合成法计算出每个评价等级的综合得分,从而实现对评价对象的模糊综合评价。这种方法适用于处理具有模糊性和不确定性的评价问题,能够更全面地反映评价对象的特点。

二:决策树

决策树是一种在机器学习和数据分析中广泛使用的模型,它通过学习样本数据的特征和决策规则,构建一个树状的决策流程,以此来预测新样本的类别或数值。在人才评价指标的应用中,决策树可以根据一系列预定义的评价指标,如工作经验、教育背景、技能水平等,来对人才进行分类或评分。

构建决策树模型通常包括以下几个步骤:

  1. 特征选择:选择最能代表人才特征的评价指标,这些指标应该是对人才评价最具预测力的。特征选择的方法包括信息增益、信息增益比和基尼指数等。

  2. 决策树生成:使用训练数据集来构建决策树。这个过程通常是一个递归过程,通过不断地选择最优的特征进行数据集的分割,直到满足停止条件,如达到最大树深、节点包含的样本数量低于阈值或信息增益小于某个值。

  3. 决策树剪枝:为了防止过拟合,决策树可能需要剪枝。剪枝过程包括预剪枝和后剪枝,预剪枝是在树生长过程中提前停止树的生长,后剪枝是在树完全生长后,从底向上评估是否合并决策节点。

  4. 模型评估:使用测试数据集对构建的决策树模型进行评估,常用的评估指标包括准确率、召回率、精确度和F1分数等。

在实际应用中,决策树算法如ID3、C4.5和CART等,可以处理分类和回归问题。ID3和C4.5主要用于分类问题,而CART可以同时处理分类和回归问题。这些算法在选择分裂节点时使用不同的准则,如ID3使用信息增益,C4.5使用信息增益比,CART使用基尼指数。

假设我们有一个人才评价数据集,包含了 10 个人才的评价指标和评价结果。评价指标包括:学历、工作经验、专业技能、沟通能力、团队合作能力、创新能力、领导力、责任心、工作态度和绩效表现。评价结果分为优秀、良好、一般和差四个等级。

我们可以将这个数据集表示为一个决策表,其中每一行表示一个人才,每一列表示一个评价指标或评价结果。决策表的形式如下:

人才编号学历工作经验专业技能沟通能力团队合作能力创新能力领导力责任心工作态度绩效表现评价结果
1硕士5 年优秀
2本科3 年良好
3本科2 年一般
4硕士4 年优秀
5本科3 年良好
6本科2 年一般
7硕士5 年优秀
8本科3 年良好
9本科2 年一般
10硕士4 年优秀

下面是一个利用决策树根据一些人才评价指标对人才进行评价的例子:

import pandas as pd
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
  • pandas 是一个数据分析库,用于处理和操作结构化数据。
  • SelectKBest 是 scikit-learn 库中的一个类,用于选择 K 个最佳特征。
  • chi2 是卡方检验,用于 SelectKBest 的得分函数,以评估特征与目标变量之间的关系。
  • DecisionTreeClassifier 是 scikit-learn 中的决策树分类器。
  • tree 模块用于导出决策树的规则。
# 假设的人才评价数据
data = {
    '人才编号': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '学历': ['硕士', '本科', '本科', '硕士', '本科', '本科', '硕士', '本科', '本科', '硕士'],
    '工作经验': [5, 3, 2, 4, 3, 2, 5, 3, 2, 4],
    '专业技能': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '沟通能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '团队合作能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '创新能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '领导力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '责任心': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '工作态度': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '绩效表现': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '评价结果': ['优秀', '良好', '一般', '优秀', '良好', '一般', '优秀', '良好', '一般', '优秀']
}

df = pd.DataFrame(data)

这里定义了一个名为 data 的字典,其中包含了假设的人才评价数据。这些数据被转换成了 pandas DataFrame 对象 df

# 数据预处理:将类别型数据进行数值编码
df['学历'] = df['学历'].map({'本科': 0, '硕士': 1})
df['专业技能'] = df['专业技能'].map({'低': 0, '中': 1, '高': 2})
df['沟通能力'] = df['沟通能力'].map({'低': 0, '中': 1, '高': 2})
df['团队合作能力'] = df['团队合作能力'].map({'低': 0, '中': 1, '高': 2})
df['创新能力'] = df['创新能力'].map({'低': 0, '中': 1, '高': 2})
df['领导力'] = df['领导力'].map({'低': 0, '中': 1, '高': 2})
df['责任心'] = df['责任心'].map({'低': 0, '中': 1, '高': 2})
df['工作态度'] = df['工作态度'].map({'低': 0, '中': 1, '高': 2})
df['绩效表现'] = df['绩效表现'].map({'低': 0, '中': 1, '高': 2})
df['评价结果'] = df['评价结果'].map({'一般': 0, '良好': 1, '优秀': 2})

数据预处理阶段,将类别型数据(如学历、专业技能等)转换为数值型数据,以便机器学习模型可以处理。这里使用了 pandas 的 map 函数,将原始的文本标签映射为数值。

X = df.iloc[:, :-1]  # 特征
y = df.iloc[:, -1]   # 标签
selector = SelectKBest(score_func=chi2, k='all')
selector.fit(X, y)
scores = selector.scores_
  • X 包含了除最后一列(评价结果)之外的所有列,即特征。
  • y 是最后一列,即目标变量(评价结果)。
  • SelectKBest 实例化时使用了卡方检验作为得分函数,并且设置为选择所有特征(k='all')。
  • fit 方法用于计算每个特征的得分。
  • scores_ 属性包含了每个特征的得分。
selected_features = X.columns[(-scores).argsort()[:3]]
print("选择的属性:", selected_features)

这里选择了得分最高的三个特征。argsort 方法返回了得分从小到大的索引,取负数后变成了从大到小,然后取前三个索引。

clf = DecisionTreeClassifier()
clf.fit(X[selected_features], y)
tree_rules = tree.export_text(clf, feature_names=selected_features.tolist())
print(tree_rules)
  • 实例化一个决策树分类器 clf
  • 使用选定的特征 X[selected_features] 和目标变量 y 来训练决策树。
  • 使用 export_text 方法导出决策树的规则,以文本形式展示。
# 人才评价示例
new_talent = {'学历': 1, '工作经验': 4, '专业技能': 2, '沟通能力': 2, '团队合作能力': 2,
              '创新能力': 2, '领导力': 2, '责任心': 2, '工作态度': 2, '绩效表现': 2}
new_talent_df = pd.DataFrame([new_talent])
new_talent_df = new_talent_df[selected_features]
prediction = clf.predict(new_talent_df)
print(f"根据决策树模型,新人才的评价结果为:{'一般' if prediction[0] == 0 else '良好' if prediction[0] == 1 else '优秀'}")
  • 创建一个新的 DataFrame 对象 new_talent_df,包含一个新人才的数据。
  • 使用决策树模型对新的数据进行预测。
  • 打印预测结果,将数值标签映射回原始的文本标签。

决策树的规则与预测结果如下:

三:灰色关联分析

灰色关联分析是一种多因素统计分析方法,它以各因素的样本数据为依据,用灰色关联度来描述因素间关系的强弱、大小和次序。下面是一个利用灰色关联分析根据一些人才评价指标对人才进行评价的示例。

假设我们要评价三位候选人(A、B、C)的综合素质,选取了以下五个评价指标:

  1. 教育背景(X1):学历水平,博士为 5 分,硕士为 4 分,本科为 3 分,大专为 2 分,高中及以下为 1 分。
  2. 工作经验(X2):工作年限,每满一年得 1 分。
  3. 专业技能(X3):通过相关专业技能考试的数量,每通过一项得 2 分。
  4. 创新能力(X4):过去三年发表的论文数量,每篇得 3 分。
  5. 团队协作能力(X5):由同事和上级进行评价,满分 10 分。

三位候选人的各项指标得分如下表所示:

候选人教育背景(X1)工作经验(X2)专业技能(X3)创新能力(X4)团队协作能力(X5)
A45638
B37427
C53846

接下来,我们使用灰色关联分析对这三位候选人进行评价。

步骤一:确定参考序列和比较序列

参考序列(X0)是理想的人才评价指标值,我们可以取各项指标的最大值作为参考序列:

X0 = [5, 7, 8, 4, 8]

比较序列(Xi)是三位候选人的各项指标得分:

X1 = [4, 5, 6, 3, 8]
X2 = [3, 7, 4, 2, 7]
X3 = [5, 3, 8, 4, 6]

步骤二:数据无量纲化处理

为了消除不同指标量纲的影响,我们对数据进行无量纲化处理。这里采用初值化方法,即将每个序列的第一个数据作为基准,其他数据除以该基准值。

无量纲化后的参考序列和比较序列如下:

X0' = [1, 1, 1, 1, 1]

X1' = [4/5, 5/5, 6/5, 3/5, 8/5] = [0.8, 1, 1.2, 0.6, 1.6]
X2' = [3/5, 7/5, 4/5, 2/5, 7/5] = [0.6, 1.4, 0.8, 0.4, 1.4]
X3' = [5/5, 3/5, 8/5, 4/5, 6/5] = [1, 0.6, 1.6, 0.8, 1.2]

步骤三:计算关联系数

对于候选人 A:

对于候选人 B:

对于候选人 C:

步骤四:计算关联度

步骤五:评价结果分析

根据关联度的大小对候选人进行评价,关联度越大,说明该候选人与理想人才的匹配程度越高。

从计算结果可以看出,候选人 A 和候选人 C 的关联度相同且大于候选人 B 的关联度。因此,候选人 A 和候选人 C 的综合素质相对较高,候选人 B 的综合素质相对较低。

以上过程用可以用以下代码表示:

import numpy as np

# 原始数据
data = np.array([[4, 5, 6, 3, 8], [3, 7, 4, 2, 7], [5, 3, 8, 4, 6]])

# 确定参考序列(取各项指标最大值)
ref_seq = np.max(data, axis=0)

# 数据无量纲化处理(初值化方法)
normalized_data = data / ref_seq

# 计算关联系数
def calculate_correlation_coefficient(ref_seq, compared_seq, rho=0.5):
    min_diff = np.min(np.abs(ref_seq - compared_seq))
    max_diff = np.max(np.abs(ref_seq - compared_seq))
    return (min_diff + rho * max_diff) / (np.abs(ref_seq - compared_seq) + rho * max_diff)

correlation_coefficients = []
for candidate in normalized_data:
    correlation_coefficients.append(calculate_correlation_coefficient(ref_seq, candidate))

# 计算关联度(关联系数的平均值)
correlation_degrees = [np.mean(candidate_correlation) for candidate_correlation in correlation_coefficients]

print("关联度:", correlation_degrees)

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进阶SpringBoot之异步任务、邮件任务和定时执行任务

SpringBooot 创建 Web 项目 异步任务: service 包下创建 AsyncService 类 Async 异步方法 Thread.sleep(3000) 停止三秒,捕获异常 package com.demo.task.service;import org.springframework.scheduling.annotation.Async; import org.springfram…

【MySQL】Windows下重启MySQL服务时,报错:服务名无效

1、问题描述 在终端中,停止、启动MySQL服务时报错:服务名无效 2、原因分析 1)权限不够 如果是权限不够,会提示:系统错误5,拒绝访问。 2)服务名错误 如果是服务名错误,会提示“…

第313题|解积分不等式题目的5种方法常用方法|武忠祥老师每日一题

解题思路:把多阶次积分和函数值联系起来,应该想到泰勒公式。 本题应该使用带有拉格朗日余项的泰勒公式: 方法一: 等式左右两边进行积分,右边第一项常数项不变,第二项(x-1/2)积完之…

macOS Sequoia 正式版(24A335)黑苹果/Mac/虚拟机系统镜像

“ 以下内容来自于黑果魏叔官网” 镜像特点 完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要,可以自行直接替换opencore分区文件为…

web安全测试入门

参考课程: 04-软件安全测试基础-网络协议基础-网络模型_哔哩哔哩_bilibili 1.软件安全测试概述 安全测试: 安全性测试指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程 导致软件出现安全问题的主要原因或根源是软件的安全漏洞 安全漏洞&#x…

网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作

目录 一、理论基础 1.1 网页交互模拟的重要性 1.2 网页交互的基本原理 二、常用工具介绍 2.1 Selenium 2.2 Puppeteer 2.3 Cypress 2.4 TestCafe 三、实战案例 3.1 模拟用户输入 3.2 模拟用户点击 3.3 模拟用户选择 3.4 模拟滚动操作 四、最佳实践与优化 4.1 代…

基于python+django+vue的学生管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

Python编码系列—Python原型模式:深克隆与高效复制的艺术

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

C++的IO流(文件部分在这里)

1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓…

嵌入式开发—CAN通信协议详解与应用(上)

文章目录 1.CAN简介CAN协议的诞生背景CAN协议的发展历程CAN协议的影响CAN通信的主要特点 2.CAN数据帧的帧格式CAN标准数据帧的帧格式CAN标准数据帧的帧格式结构图CAN扩展帧的帧格式CAN遥控帧的帧格式CAN错误帧的帧格式 3.CAN数据传输中的位填充位填充的概念位填充的作用位填充的…

今天中秋,中秋快乐,分析一个中秋月饼的项目

特色功能 使用obj模型,搭配tga文件,附加上颜色 normalMap 是让字和线条看起来更清楚和真实 高光贴图 凹凸贴图 ...... 源码 https://github.com/Lonely1201/lonely1201.github.io/tree/main/Juejin/mooncake 在线预览 https://lonely1201.githu…

将YYYY-MM-DD HH:mm:ss格式化为YYYY-MM-DD (星期一) 下午 ?点

分为凌晨、早上、中午、晚上 function formatDate(inputDate) {const date new Date(inputDate);date.setHours(date.getHours() - 1);const year date.getFullYear();const month date.getMonth() 1; // 月份从0开始const day date.getDate();let hours date.getHours(…

详解:Tensorflow、Pytorch、Keras

这是一个专门对Tensorflow、Pytorch、Keras三个主流DL框架的一个详解和对比分析 一、何为深度学习框架? 你可以理解为一个工具帮你构建一个深度学习网络,调用里面的各种方法就能自行构建任意层,diy你想要的DNN,而且任意指定学习…

用Qt 对接‌百度语音识别接口

一 、前期准备工作 1,搭建好开发环境; 2,注册百度云平台,获取语音相关东西, 短语音识别标准版_短语音识别-百度AI开放平台 (baidu.com) 3,涉及到的Qt 类有 QAudioFormat,QAudioDeviceInfo&a…

JDBC实现对单表数据增、删、改、查

文章目录 API介绍获取 Statement 对象Statement的API介绍使用步骤案例代码 JDBC实现对单表数据查询ResultSet的原理ResultSet获取数据的API使用JDBC查询数据库中的数据的步骤案例代码 API介绍 获取 Statement 对象 在java.sql.Connection接口中有如下方法获取到Statement对象…

线程池是啥有啥用,怎么用,如何自己实现一个

目录 一、线程池是啥,有啥用 二、线程池怎么用 1.构造方法 2.如何使用Java的线程池 三、简单实现一个线程池 假设我是一个(好看有才华) 的妹子,那么我就会有很多追求者,这些也叫备胎们,我们若把他…

71、哪吒开发板试用结合oak深度相机进行评测

基本思想:收到intel的开发板-小挪吒,正好手中也有oak相机,反正都是openvino一套玩意,进行评测一下,竟然默认是个window系统,哈哈

STL-vector练习题

118. 杨辉三角 思路: 杨辉三角有以下性质使我们要用到的: ● 每行数字左右对称,由 1 开始逐渐变大再变小,并最终回到 1。 ● 第 n 行(从 0 开始编号)的数字有 n1 项,前 n 行共有 2n(n1)个数。…

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

SSY20240916提高组T1题解__贪心+大模拟

题面 题面描述 fe和xt在玩一个游戏, 在 n m n\times m nm的网格图上进行. 定义 ( a , b ) , ( c , d ) (a,b)\;,\;(c,d) (a,b),(c,d)见距离为 ∣ a − c ∣ ∣ b − d ∣ |a-c||b-d| ∣a−c∣∣b−d∣ 现在游戏按照以下步骤进行: xt选择 k k k个格子fe选择一个格子(不能选…