赞
踩
铛铛!小秘籍来咯!
美赛进行时!小秘籍团队以实打实的解决方案征服挑战。深度利用复杂网络、时间序列、蒙特卡洛和决策树算法,我们无畏解析财产保险的未来,为社区建设提供犀利建议。小秘籍团队,专业就在实际行动,我们一直在掌握建模问题的精髓!"
抓紧小秘籍,我们出发吧~
随着极端天气事件的不断发生,对于财产所有者和保险公司而言,已经变成了一场危机。近年来,全球已经遭受了来自1000多次极端天气事件的超过1万亿美元的损失[1]。2022年,保险业对自然灾害的索赔增加了115%,相比30年平均水平[1]。随着洪水、飓风、气旋、干旱和森林火灾引起的严重天气相关事件的损失可能增加,保险覆盖的保费迅速上涨,由气候变化引发的预计将在2040年前增加30-60%[1]。
财产保险不仅变得更加昂贵,而且更难找到,因为保险公司正在改变承保政策的方式和地点。推动财产保险费用上升的与天气相关的事件在全球范围内看起来是不同的。此外,保险保护缺口在全球平均为57%,且不断增加[2]。这突显了该行业的困境 - 保险公司的盈利危机与财产所有者的支付能力危机。
COMAP的灾难保险建模者(ICM)关心财产保险行业的可持续性。随着气候变化增加极端天气和自然灾害的可能性,ICM想要确定如何最好地布局财产保险,以确保体系对未来索赔成本具有弹性,同时确保保险公司的长期健康。如果保险公司在过多情况下不愿承保政策,由于客户过少,它们将无法继续经营。相反,如果它们承保了过于风险的政策,可能会支付过多的索赔。保险公司应在什么条件下承保政策?何时应该决定冒险?财产所有者是否能够影响这个决定?开发一个模型,用于确定保险公司是否应该在极端天气事件不断增加的地区承保政策,并使用两个位于不同洲的地区进行演示,这两个地区都经历了极端天气事件。
展望未来,社区和房地产开发商需要思考如何以及在哪里建设和成长。随着保险格局的变化,必须制定未来的房地产决策,以确保房产更具弹性,并有意识地建设,包括为不断增长的社区和人口提供适当服务的可行性。您的保险模型如何适应评估在某些地点何时、如何以及是否建设?
也许有些社区的保险模型会建议不承保当前或未来的财产保险政策。这可能导致社区领导者面临关于具有文化、历史、经济或社区重要性的建筑物的困难决策。例如,北卡罗来纳州外滩的哈特拉斯灯塔就曾经被移动,以保护这座历史悠久的灯塔以及周围的旅游业[3]。作为社区领导者,您如何确定社区中应该保存和保护哪些建筑,因为它们具有文化、历史、经济或社区的重要性?为社区领导者制定一个保护模型,以确定他们应该采取的措施的程度。
选择一座位于极端天气事件频发地区的历史地标 - 但不是哈特拉斯灯塔。将您的保险和保护模型应用于评估这一地标的价值。根据您从保险和保护模型的结果中获得的见解,撰写一封一页的信给社区,建议他们制定一个关于他们珍视地标的未来计划、时间表和成本提案。
您的PDF解决方案总页数不得超过25页,其中包括:
• 一页摘要表,清楚描述您解决问题的方法以及在问题背景下的最重要结论。
• 目录。
• 您的完整解决方案。
• 一页社区信。
• AI使用报告(如果使用)。
总结问题如下:
保险业面临的挑战:
财产保险行业的可持续性问题:
COMAP的ICM关注的问题:
保险公司承保政策的问题:
社区面临的问题:
使用复杂网络分析来解决问题一的原因在于:
综合性和全局视角: 复杂网络分析能够提供全局视角,综合考虑各节点(保险公司、天气事件、索赔等)之间复杂的相互关系。这有助于理解整个系统的结构和动态,而不仅仅是独立考虑单个节点或关系。
关键节点的识别: 通过网络度量(如度中心性、介数中心性),我们可以识别关键节点,即对整个系统具有重要影响的节点。在这个问题中,关键节点可能是那些与多个保险公司、天气事件和索赔紧密连接的节点。
动态演化模拟: 复杂网络分析有助于建立动态网络模型,考虑系统随时间的演化。这对于预测未来可能的极端天气事件和保险索赔的影响至关重要,因为这些关系随时间可能发生变化。
系统韧性评估: 通过模拟不同扰动,复杂网络分析能够评估系统对外部压力的抵抗能力,即系统的韧性。这有助于保险公司更好地规划应对极端天气事件的策略。
可视化帮助理解: 复杂网络分析工具提供了强大的可视化手段,使复杂系统的结构和演变过程更加直观。这有助于决策者更好地理解模型的结果和推荐。
问题一:保险业面临的挑战 - 复杂网络分析
1. 节点定义:
2. 边定义:
3. 网络度量:
4. 网络演化:
5. 模拟扰动:
6. 网络可视化:
import networkx as nx
import matplotlib.pyplot as plt
# 创建有向图
G = nx.DiGraph()
# 添加节点及其属性
G.add_node("InsuranceCompany1", business_volume=100, risk_appetite=0.8)
G.add_node("InsuranceCompany2", business_volume=80, risk_appetite=0.6)
G.add_node("WeatherEvent1", intensity=0.7)
G.add_node("WeatherEvent2", intensity=0.9)
G.add_node("Claim1", amount=50000)
G.add_node("Claim2", amount=70000)
G.add_node("PolicyChange", impact="Positive")
# 添加边及其权重
G.add_edge("InsuranceCompany1", "WeatherEvent1", weight=0.6)
G.add_edge("InsuranceCompany1", "Claim1", weight=0.8)
G.add_edge("InsuranceCompany2", "WeatherEvent2", weight=0.7)
G.add_edge("InsuranceCompany2", "Claim2", weight=0.9)
G.add_edge("PolicyChange", "InsuranceCompany1", weight=0.5)
G.add_edge("PolicyChange", "InsuranceCompany2", weight=0.5)
# 可视化网络
#部分省略见完整版
nx.draw(G, pos, with_labels=True, node_size=700, node_color="skyblue", font_size=8, font_color="black", font_weight="bold", edge_color="gray", linewidths=1, arrowsize=10)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.title("Insurance Business Network")
plt.show()
# 计算节点度中心性
degree_centrality = nx.degree_centrality(G)
print("Degree Centrality:", degree_centrality)
# 计算节点介数中心性
betweenness_centrality = nx.betweenness_centrality(G)
print("Betweenness Centrality:", betweenness_centrality)
在上面的代码示例中,我们使用了networkx
库和matplotlib
库来可视化复杂网络。以下是关于可视化部分的详细说明:
创建有向图:
G = nx.DiGraph()
添加节点及其属性:
G.add_node("InsuranceCompany1", business_volume=100, risk_appetite=0.8)
添加边及其权重:
G.add_edge("InsuranceCompany1", "WeatherEvent1", weight=0.6)
可视化网络:
pos = nx.spring_layout(G)
labels = {node: f"{node}\n{G.nodes[node]}" for node in G.nodes}
edge_labels = {(src, dest): f"{G[src][dest]['weight']:.2f}" for src, dest in G.edges}
nx.draw(G, pos, with_labels=True, node_size=700, node_color="skyblue", font_size=8, font_color="black", font_weight="bold", edge_color="gray", linewidths=1, arrowsize=10)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.title("Insurance Business Network")
plt.show()
pos = nx.spring_layout(G)
: 使用Spring layout算法确定节点的位置。nx.draw(...)
: 使用matplotlib
库绘制图形,配置各种参数以调整图形的外观。nx.draw_networkx_edge_labels(...)
: 添加边的标签。财产保险行业的可持续性问题:
时间序列数据的趋势性: 财产保险费用通常具有明显的时间趋势。ARIMA模型是一种专门用于处理时间序列数据趋势的经典方法,能够捕捉数据中的长期依赖关系。
季节性调整: ARIMA模型不仅可以建模趋势,还能考虑季节性变化。对于财产保险费用,可能存在季节性波动,例如特定季节的自然灾害频率较高。ARIMA模型能够通过差分项来处理季节性。
模型的解释性: ARIMA模型提供了对时间序列数据中自回归项和移动平均项的解释。这有助于理解不同因素对财产保险费用的影响,使决策者更容易理解模型的运作原理。
模型的普适性: ARIMA模型在实际应用中已经被广泛验证,并且对于处理不同类型的时间序列数据都表现出色。在没有大量数据和领域专业知识的情况下,ARIMA是一个强有力的选择。
模型的可解释性: ARIMA模型的参数和结果易于解释,使得模型的输出更具可解释性。这对于向利益相关者(如保险公司管理层、政府监管机构)传达预测结果是至关重要的。
对财产保险费用的趋势进行建模的具体思路如下:
建模思路:
数据准备:
数据预处理:
模型选择:
模型拟合:
模型诊断:
模型评估:
未来预测:
ARIMA 模型公式:
ARIMA(p, d, q)模型由自回归项(AR)、差分项(d)和移动平均项(MA)组成。其数学表达式如下:
Y t = ϕ 1 Y t − 1 + ϕ 2 Y t − 2 + … + ϕ p Y t − p + ϵ t − θ 1 ϵ t − 1 − θ 2 ϵ t − 2 − … − θ q ϵ t − q Y_t = \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \ldots + \phi_p Y_{t-p} + \epsilon_t - \theta_1 \epsilon_{t-1} - \theta_2 \epsilon_{t-2} - \ldots - \theta_q \epsilon_{t-q} Yt=ϕ1Yt−1+ϕ2Yt−2+…+ϕpYt−p+ϵt−θ1ϵt−1−θ2ϵt−2−…−θqϵt−q
其中,
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
# 加载数据
data = pd.read_csv("your_data.csv")
data['日期'] = pd.to_datetime(data['日期'])
data.set_index('日期', inplace=True)
# 可视化数据
plt.plot(data)
plt.title('财产保险费用时间序列')
plt.show()
# 拆分数据集为训练集和测试集
train_size = int(len(data) * 0.8)
train, test = data[:train_size], data[train_size:]
# 定义ARIMA模型参数(需要根据实际问题调整)
p, d, q = 1, 1, 1
# 建立并拟合ARIMA模型
def fit_arima(train, p, d, q):
model = ARIMA(train, order=(p, d, q))
fit_model = model.fit()
return fit_model
# 省略部分见完整版
# 可视化预测结果
def plot_results(test, predictions):
plt.plot(test, label='实际值')
plt.plot(predictions, color='red', label='预测值')
plt.legend()
plt.title('ARIMA 模型预测')
plt.show()
# 主程序
if __name__ == "__main__":
# 建立并拟合ARIMA模型
model = fit_arima(train, p, d, q)
# 预测未来值
predictions = predict_arima(model, test)
# 评估模型
mse = evaluate_model(test, predictions)
print(f'Mean Squared Error: {mse}')
# 可视化预测结果
plot_results(test, predictions)
可以使用可视化方法来深入分析ARIMA模型的性能和预测结果。以下是一些可视化方法:
# 残差分析可视化
residuals = test - predictions
plt.figure(figsize=(10, 5))
plt.plot(residuals)
plt.title('残差图')
plt.xlabel('日期')
plt.ylabel('残差')
plt.show()
# ACF 和 PACF 可视化
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plt.figure(figsize=(12, 6))
plot_acf(residuals, lags=20, title='ACF 残差')
plt.show()
plt.figure(figsize=(12, 6))
plot_pacf(residuals, lags=20, title='PACF 残差')
plt.show()
# 预测结果和真实值对比图
plt.figure(figsize=(12, 6))
plt.plot(test.index, test, label='真实值', color='green')
plt.plot(test.index, predictions, label='预测值', color='red')
plt.title('预测结果与真实值对比')
plt.xlabel('日期')
plt.ylabel('财产保险费用')
plt.legend()
plt.show()
下面是使用蒙特卡洛模拟解决问题三的具体建模思路,展开每一步并整合公式:
建模步骤:
收集数据: 收集历史极端天气事件、自然灾害和相关财产保险索赔的数据。包括事件发生的时间、地点、影响范围和财产损失。
定义模拟变量:
建立概率分布:
生成随机样本:
模拟系统响应:
重复模拟:
分析结果:
示例代码:
下面是一个简化的Python示例代码,用于演示蒙特卡洛模拟过程:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 定义参数
num_simulations = 1000 # 模拟次数
event_probability = 0.05 # 极端天气事件发生概率
loss_mean = 500000 # 损失的平均值
loss_std = 100000 # 损失的标准差
# 蒙特卡洛模拟
np.random.seed(42) # 设置随机种子以确保可重复性
event_occurred = np.random.rand(num_simulations) < event_probability
losses = np.random.normal(loc=loss_mean, scale=loss_std, size=num_simulations)
losses[event_occurred] *= 2 # 极端天气事件发生时损失加倍
# 省略部分看完整版
# 绘制损失分布的直方图
sns.histplot(losses, bins=30, kde=True, color='skyblue', edgecolor='black')
plt.title('模拟财产保险损失分布')
plt.xlabel('损失金额')
plt.ylabel('频次')
# 在图中标记统计指标
plt.axvline(mean_loss, color='red', linestyle='dashed', linewidth=2, label=f'均值: {mean_loss:.2f}')
plt.axvline(quantile_95, color='green', linestyle='dashed', linewidth=2, label=f'95%分位数: {quantile_95:.2f}')
plt.legend()
plt.show()
在上述代码中,我们使用了matplotlib
和seaborn
库来进行可视化。主要使用了直方图(histogram)来展示财产保险损失的分布情况。以下是代码中与可视化相关的部分解释:
# 绘制损失分布的直方图
sns.histplot(losses, bins=30, kde=True, color='skyblue', edgecolor='black')
plt.title('模拟财产保险损失分布')
plt.xlabel('损失金额')
plt.ylabel('频次')
# 在图中标记统计指标
plt.axvline(mean_loss, color='red', linestyle='dashed', linewidth=2, label=f'均值: {mean_loss:.2f}')
plt.axvline(quantile_95, color='green', linestyle='dashed', linewidth=2, label=f'95%分位数: {quantile_95:.2f}')
plt.legend()
plt.show()
这段代码使用sns.histplot()
绘制了财产保险损失的直方图,bins=30
指定了直方图的箱子数量,kde=True
添加了核密度估计曲线,使分布更加平滑。颜色和边缘颜色分别设置为’skyblue’和’black’。接下来,通过plt.axvline()
在图中添加了两条垂直虚线,表示均值和95%分位数。最后,plt.legend()
用于显示图例。
解决问题四:保险公司承保政策的问题
决策树是解决问题四(保险公司承保政策问题)的一种合适选择的原因如下:
可解释性强: 决策树模型生成的规则非常直观和易于理解。这使得决策树模型成为解释性强的模型,对于保险公司和决策制定者来说,能够清晰地了解在不同条件下保险公司是否应该承保政策。
适用于分类问题: 问题四中涉及的决策是一个分类问题,即决定是否承保政策。决策树在处理分类问题时表现良好,能够根据输入特征进行分类。
处理复杂决策规则: 问题四中可能涉及到多个条件和因素,如气候类型、历史灾害频率和保险公司盈利状况等。决策树能够有效地处理这些复杂的决策规则,通过树状结构将问题划分为一系列简单的决策步骤。
非线性关系: 决策树对于非线性关系的建模能力较强。在实际情况中,决策问题往往涉及到非线性关系,而决策树能够灵活地捕捉和表示这些关系。
易于处理混合数据类型: 决策树可以处理混合类型的数据,包括数值型和分类型的特征。在问题四中,可能会涉及到不同类型的特征,决策树能够适应这种多样性。
建模思路:
1. 数据收集: 收集历史数据,包括不同地区的天气事件、自然灾害、保险承保决策、索赔情况等信息。
2. 定义特征: 假设特征包括:
3. 标记数据: 根据历史数据,标记每个样本的类别。设标签为 Y Y Y,表示是否承保政策。
4. 建立决策树模型: 使用决策树算法建立模型。模型将学习一个决策树,根据特征 C C C、 F F F、 P P P 来预测是否承保政策。
5. 模型训练: 使用训练数据集训练决策树模型。决策树的目标是最小化分类误差,即最好地预测是否承保政策。
6. 模型评估: 使用测试数据集评估模型的性能。通过准确率、精确度、召回率等指标来评估模型的表现。
7. 解释决策规则: 分析生成的决策树,理解在什么条件下保险公司应该承保政策。决策树的节点表示一个决策规则,例如:
8. 应用模型: 将训练好的模型应用于新的情境,以做出相应的承保决策。模型将根据输入的气候类型、历史灾害频率和保险公司盈利状况来预测是否应该承保政策。
决策树模型数学表示:
决策树模型可以表示为一系列的决策规则,形成树状结构。每个节点表示一个决策规则,每个叶子节点表示一个类别。决策规则可以表示为逻辑条件。以二叉树为例,决策树模型可以表示为:
如果
C
≤
阈值
1
且
F
≤
阈值
2
且
P
≤
阈值
3
,则
Y
=
0
(不承保政策)
如果
C
>
阈值
1
或
F
>
阈值
2
或
P
>
阈值
3
,则
Y
=
1
(承保政策)
# 导入必要的库
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import graphviz
from IPython.display import Image
from io import StringIO
# 假设已有数据集,其中包含特征和标签
# 特征包括 C, F, P,标签为 Y
# 加载数据集(示例数据,需要替换成实际数据)
data = pd.read_csv('insurance_data.csv')
# 数据预处理
# 如果有缺失值或需要进行其他预处理步骤,请在此添加
# 分离特征和标签
X = data[['C', 'F', 'P']]
y = data['Y']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 建立决策树模型
def build_decision_tree_model(X_train, y_train):
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
return model
# 预测并评估模型性能
def evaluate_model(model, X_test, y_test):
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f'准确率: {accuracy:.2f}')
print('分类报告:\n', report)
# 可视化决策树
def visualize_decision_tree(model, feature_names, class_names):
dot_data = StringIO()
export_graphviz(model, out_file=dot_data, filled=True, rounded=True, special_characters=True,
feature_names=feature_names, class_names=class_names)
graph = graphviz.Source(dot_data.getvalue())
return graph
# 主函数
def main():
# 建立模型
model = build_decision_tree_model(X_train, y_train)
# 省略部分见完整版
decision_tree_graph.render(filename='decision_tree', format='png', cleanup=True)
Image('decision_tree.png')
# 执行主函数
if __name__ == "__main__":
main()
在上述代码中,使用了graphviz
库来可视化决策树。决策树的可视化是通过export_graphviz
函数生成DOT格式的图形描述,然后通过graphviz.Source
将其渲染为可视化图形。
在可视化决策树的函数中,调用了visualize_decision_tree
函数,该函数返回一个graphviz.Source
对象。为了在Jupyter Notebook中显示图像,使用了Image
函数。
以下是有关可视化部分的详细说明:
# 可视化决策树
def visualize_decision_tree(model, feature_names, class_names):
dot_data = StringIO()
export_graphviz(model, out_file=dot_data, filled=True, rounded=True, special_characters=True,
feature_names=feature_names, class_names=class_names)
graph = graphviz.Source(dot_data.getvalue())
return graph
在主函数中,通过调用visualize_decision_tree
函数并保存渲染后的图像文件,最后使用Image
函数显示图像:
# 主函数
def main():
# ... (省略了建立模型和评估模型的步骤)
# 可视化决策树
feature_names = ['C', 'F', 'P']
class_names = ['Not Insured', 'Insured']
decision_tree_graph = visualize_decision_tree(model, feature_names, class_names)
# 保存渲染后的图像文件
decision_tree_graph.render(filename='decision_tree', format='png', cleanup=True)
# 在Jupyter Notebook中显示图像
Image('decision_tree.png')
# 执行主函数
if __name__ == "__main__":
main()
请确保已经安装了graphviz
库,并根据需要调整可视化代码中的文件路径和格式。
问题五涉及社区面临的问题,特别是在考虑未来建设和成长时如何适应保险模型。解决这个问题可以采用多标准决策分析(Multi-Criteria Decision Analysis, MCDA)算法。
算法选择:多标准决策分析(MCDA)
解释:
多标准决策分析是一种决策支持工具,旨在处理多个决策标准和利益相关者的不同观点。在社区建设方面,MCDA 可以帮助社区领导者权衡各种因素,包括保险模型建议、文化、历史、经济和社区的重要性。
建模思路:
确定决策标准: 确定影响社区建设决策的关键因素,例如保险模型建议、文化、历史、经济、社区重要性等。
量化标准: 对每个标准进行量化,以便能够在分析中进行比较。这可能涉及到标准的权重、评分等。
利害相关者参与: 确保社区领导者以及其他利害相关者能够参与决策标准的设定和权衡,以反映多样化的观点。
应用 MCDA 算法: 使用 MCDA 算法对决策标准进行综合评估。一种常见的 MCDA 方法是层次分析法(Analytic Hierarchy Process, AHP),它可以处理复杂的多标准决策问题。
制定最终决策: 根据 MCDA 的结果,制定社区建设的最终决策。这可能涉及到是否建设、何时建设以及是否承保财产保险政策等问题。
示例公式(AHP):
层次分析法通常包括构建判断矩阵、计算权重、一致性检验等步骤。以下是一个简化的示例:
判断矩阵
=
[
1
a
12
a
13
1
a
12
1
a
23
1
a
13
1
a
23
1
]
\text{判断矩阵} =
其中 a i j a_{ij} aij 表示标准 i i i 相对于标准 j j j 的重要性。通过矩阵运算,可以计算每个标准的权重。
原因:
MCDA 允许在复杂的决策问题中综合多个标准,考虑不同利益相关者的观点。在社区建设方面,这可以确保决策不仅仅基于保险模型,还考虑到文化、历史、经济和社区的多样性因素。这种方法更符合实际问题的综合性质,帮助社区领导者做出更全面的决策。
多标准决策分析 (MCDA) 具体实现方法:
确定决策标准:
量化标准:
利害相关者参与:
应用 MCDA 算法:
制定最终决策:
总结:
多标准决策分析通过结合各种因素的权衡,使决策者能够更全面地考虑社区建设问题。这种方法考虑了不同标准之间的相对重要性,帮助社区领导者在决策过程中更加客观地权衡各个方面。
import numpy as np
def create_criterion_matrix(n):
"""
创建判断矩阵
:param n: 标准数量
:return: 判断矩阵
"""
matrix = np.zeros((n, n))
for i in range(n):
for j in range(i, n):
if i == j:
matrix[i, j] = 1
else:
value = float(input(f"请输入标准{i + 1}相对于标准{j + 1}的比较值(1-9之间,1表示相等,9表示极端重要): "))
matrix[i, j] = value
matrix[j, i] = 1 / value
return matrix
def normalize_matrix(matrix):
"""
归一化判断矩阵
:param matrix: 判断矩阵
:return: 归一化后的矩阵
"""
return matrix / matrix.sum(axis=0)
def calculate_weights(normalized_matrix):
"""
计算权重向量
:param normalized_matrix: 归一化后的判断矩阵
:return: 权重向量
"""
return normalized_matrix.mean(axis=1)
def consistency_check(normalized_matrix, weights):
"""
一致性检验
:param normalized_matrix: 归一化后的判断矩阵
:param weights: 权重向量
"""
n = normalized_matrix.shape[0]
consistency_index = ((normalized_matrix.sum(axis=1) - n) / (n - 1)).mean()
# 通过查找预先计算的一致性比率表,计算一致性比率
consistency_ratio_table = {3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}
consistency_ratio = consistency_ratio_table[n]
# 判断是否通过一致性检验
consistency_check = consistency_index / consistency_ratio
if consistency_check < 0.1:
print("一致性检验通过,权重向量:", weights)
else:
print("一致性检验未通过,需要重新评估判断矩阵。")
# 示例使用
n_criteria = int(input("请输入标准数量:"))
criterion_matrix = create_criterion_matrix(n_criteria)
normalized_matrix = normalize_matrix(criterion_matrix)
weights = calculate_weights(normalized_matrix)
consistency_check(normalized_matrix, weights)
在AHP中,可视化通常涉及到展示判断矩阵、归一化矩阵、权重向量以及一致性检验的结果。下面给出在Python中使用Matplotlib库进行简单可视化的示例代码。
import numpy as np
import matplotlib.pyplot as plt
def plot_matrix(matrix, title):
"""
绘制矩阵的热力图
:param matrix: 要绘制的矩阵
:param title: 图表标题
"""
plt.imshow(matrix, cmap='viridis', interpolation='nearest')
plt.title(title)
plt.colorbar()
plt.show()
def plot_weights(weights):
"""
绘制权重向量的条形图
:param weights: 权重向量
"""
criteria = range(1, len(weights) + 1)
plt.bar(criteria, weights, color='blue', alpha=0.7)
plt.title('权重向量')
plt.xlabel('标准')
plt.ylabel('权重')
plt.show()
# 示例使用
plot_matrix(criterion_matrix, '判断矩阵')
plot_matrix(normalized_matrix, '归一化矩阵')
plot_weights(weights)
代码使用了Matplotlib库,通过热力图展示了判断矩阵和归一化矩阵,同时使用条形图展示了权重向量。
美赛跟紧小秘籍冲冲冲!!更多内容可以点击下方名片详细了解!
记得关注 数学建模小秘籍打开你的数学建模夺奖之旅!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。