2012年 数模美赛 C题 犯罪克星
一、问题重述
银河犯罪建模中心(ICM)正在调查一个犯罪阴谋。调查人员已经识别出一些阴谋成员,但希望在逮捕之前确定其他成员和领导人。所有嫌疑人和可能的同谋者都受雇于同一家公司,并在一个大的综合办公室里工作。该公司正在开发和销售计算机软件,服务于银行和信用卡公司。ICM从公司82名员工中获得了一些信息,认为这将帮助他们找到最有可能的未知同谋者和领导人。
二、模型假设
- 信息传播假设:公司中的所有员工都知晓该消息,因此一些消息的传播者并没有卷入阴谋。
- 非阴谋者存在:事实上,可以确定有一些人没有卷入阴谋。
- 信息均衡假设:在案件情况未给定时,推理同类对象的假设应具有相同的权重。
- 二值分类假设:假设变量与证据变量均是二值分类变量,即每个变量只有“是”和“否”两种状态。
三、模型建立
1.数据标准化与信息熵计算模型
1.1 数据标准化
数据标准化是数据预处理的重要步骤,目的是消除不同指标之间的量纲影响,使得数据可以进行比较和计算。标准化处理的公式如下:
其中,Xij 为第 i 个指标下第 j 个项目的评价值,Xmin 为第 i 项指标的最小值,Xmax 为第 �i 项指标的最大值。若所用指标的值越大越好,则使用上述公式;若指标的值越小越好,则使用:
通过这种方式,所有指标值都被转换到了 [0, 1] 的范围内,为后续的信息熵计算提供了统一的基础。
1.2 信息熵计算
信息熵是衡量信息集中程度的指标,它表示在一个随机变量中,各个取值出现的概率之和为1的情况下,信息量的最大程度。信息熵越小,说明信息越集中,反之则说明信息越分散。
对于每个指标,计算其信息熵的步骤如下:
a. 计算指标值的比重(先验概率)
其中,pij 为第 i 个指标下第 j 个项目的指标值的比重,m 为待评项目的数量。
b. 计算信息熵
其中,H(Xi) 为第 i 个指标的信息熵,k 为常数,通常取1/log2m,pij 为第 i 个指标下第 j 个项目的指标值的比重。信息熵的计算公式来源于香农信息熵的定义,它反映了随机变量不确定性的大小。
1.3 数学公式推导
信息熵的推导可以从最短平均编码长度的概念出发。假设有一个随机变量 X,其可能的状态为 x1,x2,...,xn,对应的概率为 p1,p2,...,pn。根据信息论,状态 xi 的编码长度li 可以表示为 li=−log2pi。因此,平均编码长度 L 为:
这就是信息熵的定义。信息熵的物理意义是:对于一个随机变量 X,其各个状态出现的概率不同,我们要对其进行编码,所求得的最短平均编码长度便为信息熵。
2.Bayes网络模型
2.1 贝叶斯网络的基本原理
贝叶斯网络的核心是贝叶斯定理,它允许我们利用已知的“正向概率”求解“逆向概率”。在贝叶斯网络中,每个节点表示一个随机变量,可以是可观测变量或隐藏变量。节点之间的有向边表示变量之间的条件依赖关系。如果存在从节点A到节点B的边,则表示B在条件上依赖于A。
2.2 贝叶斯网络的结构
贝叶斯网络通过DAG来表示,其结构遵循以下规则:
- 无环性:图中不存在任何从一个节点出发又回到该节点的路径。
- 局部马尔可夫性:每个节点在给定其父节点的条件下,与其非后代节点条件独立。
2.3 贝叶斯网络的推理过程
贝叶斯网络不仅用于建模复杂系统,还用于推理和决策。推理过程主要包括以下步骤:
- 证据更新:根据观测到的数据更新各节点的概率分布。
- 边缘化:计算某些感兴趣变量的边缘概率分布。
- 最大后验估计(MAP):找到使后验概率最大的变量取值组合。
2.4 贝叶斯网络的构建
贝叶斯网络的构建包括两个主要部分:无向环的构建和条件概率表集合的构建。具体步骤如下:
a. 创建矩阵:无向环在MATLAB中用矩阵构建。
b. 节点编号:按拓扑逻辑结构给各个节点编号。
c. 节点间相关性赋值:有关系的节点之间赋值为1。
d. 定义节点类型和大小:不同的节点定义为不同的类型,大小是该节点的可能性的种类,例如对于下雨,定义它有两种可能,下雨和不下雨,那么其大小为2。
e. 条件概率表(CPT):每个节点都有一个条件概率表,描述该节点在其父节点给定情况下的概率分布。
2.5 信息熵在贝叶斯网络中的应用
信息熵是衡量信息集中程度的指标,它表示在一个随机变量中,各个取值出现的概率之和为1的情况下,信息量的最大程度。信息熵越小,说明信息越集中,反之则说明信息越分散。在贝叶斯网络中,信息熵用于度量属性间的条件依赖关系。
a. 联合熵函数:基于对似然函数定义了联合熵函数与贝叶斯网络拓扑结构中联合概率分布的映射关系。
b. 类条件熵和局部条件熵函数:提出了类条件熵和局部条件熵函数来识别拓扑结构中属性间的因果关系。
c. 信息熵计算公式:对于一个离散随机变量X,其值域为val(X)={x1,x2,⋯,xm},该随机变量的信息熵可表示为:
ε(X)=−∑x∈val(X)P(x)logP(x)
其中 P(x) 表示X 取值为 x 的概率。
d. 犯罪假设的信息熵:对于一个犯罪假设 H,在收集到证据 e 时,其信息熵的计算公式为:
ε(H∣e)=−∑h∈val(H)P(h∣e)logP(h∣e)
其中 P(h∣e) 表示在给定证据 e 时犯罪假设 H 取值为 h 的后验概率。
通过上述步骤,我们可以构建一个贝叶斯网络模型,并利用信息熵来识别属性间的因果关系,从而进行有效的推理和决策。
3.加权信息熵方法
3.1 基本原理
加权信息熵方法的核心思想是利用信息熵来衡量数据的离散程度,从而确定各指标的权重。信息熵越大,表示数据的离散程度越高,提供的信息量越少;信息熵越小,表示数据的离散程度越低,提供的信息量越多。因此,信息熵可以用来评估各指标的重要性。
3.2 计算步骤
a. 数据标准化: 首先对原始数据进行无量纲处理,使其具有可比性。对于正向指标和负向指标,分别采用不同的处理方法:
- 正向指标:Yij=maxXi−minXiXij−minXi
- 负向指标:Yij=maxXi−minXimaxXi−Xij。
b. 计算指标的比重阵: 对于标准化后的数据,计算每个指标的比重 pij=∑i=1nYijYij。
c. 计算各指标的信息熵: 利用信息熵的定义,计算每个指标的信息熵 ��Ej: ��=−1ln(�)∑�=1����ln(���)Ej=−ln(n)1∑i=1npijln(pij) 其中 �n 为样本量,即数据中的行数。
d. 确定各指标权重: 根据信息熵计算各指标的权重 Wi=k−∑j=1kEj1−Ei 其中 �k 为指标的总数,�=1,2,...,�i=1,2,...,k。
3.3 应用场景
加权信息熵方法广泛应用于多指标综合评价、决策分析等领域。它特别适用于那些需要客观确定指标权重的场景,如环境评价、经济效益分析等。
4.决策支持模型
4.1 定义与组成
决策支持系统(DSS)是一种利用计算机和信息技术来辅助决策制定和问题解决的系统。它通过收集、整理和分析大量的数据和信息,为决策者提供全面的决策支持和决策分析工具。DSS系统通常由以下几个组成部分构成:
- 数据仓库:DSS系统通过收集和整合来自不同数据源的数据,构建一个统一的数据仓库。这个数据仓库包含了各种类型的数据,包括结构化数据(如数据库中的数据)和非结构化数据(如文档、图像等)。
- 数据分析和挖掘工具:DSS系统提供各种数据分析和挖掘工具,帮助决策者从数据中提取有价值的信息和知识。这些工具包括统计分析、数据可视化、机器学习等,可以帮助决策者理解数据的趋势、关联性和规律。
- 模型库:DSS系统可以使用各种模型和算法来解决决策问题。这些模型和算法可以包括线性规划、回归分析、决策树、神经网络和深度学习等。
- 用户界面:DSS需要一个用户界面来与用户进行交互。用户界面可以包括图形用户界面、命令行界面和自然语言界面等。
- 推理部分:由知识库、知识库管理系统和推理机组成,用于逻辑判断和决策推理。
- 人机交互部分:是DSS的人机交互界面,用以接收和检验用户请求,调用系统内部功能软件为决策服务,使模型运行、数据调用和知识推理达到有机地统一,有效地解决决策问题。
4.2 功能
决策支持系统的主要功能包括:
- 管理并随时提供与决策问题有关的组织内部信息,如订单要求、库存状况、生产能力和财务报表等。
- 收集、管理并提供与决策问题有关的组织外部信息,如政策法规、经济统计、市场行情、同行动态与科技进展等。
- 收集、管理并提供各项决策方案执行情况的反馈信息,如订单或合同执行进程、物料供应计划落实情况、生产计划完成情况等。
- 存储和管理与决策问题有关的各种数学模型,如定价模型、库存控制模型与生产调度模型等。
- 存储并提供常用的数学方法及算法,如回归分析方法、线性规划、最短路径算法等。
4.3 构建过程
构建决策支持模型的过程通常包括以下步骤:
- 需求分析:根据用户的需求,确定DSS的目标、范围和功能。
- 数据收集:收集相关的数据和信息,包括内部数据和外部数据。
- 数据处理:对数据进行清洗、转换和整合,以便于分析和挖掘。
- 模型构建:根据决策问题的特点,选择和构建合适的决策支持模型。
- 结果解释:对模型的输出结果进行解释和推导,以帮助用户做出决策。
- 系统评估:评估DSS的效果和性能,并进行优化和改进
四、模型求解
1.数据标准化与信息熵计算模型
import numpy as np
import pandas as pd
import math
# 自定义对数函数,处理对数为0的情况
def mylog(p):
if p == 0:
return 0
else:
return math.log(p)
# 数据标准化处理
def normalize_data(data):
# 正向指标标准化
for key in data:
if label[key] == 1: # 正向指标
data[key] = (data[key] - data[key].min()) / (data[key].max() - data[key].min())
# 负向指标标准化
elif label[key] == 2: # 负向指标
data[key] = (data[key].max() - data[key]) / (data[key].max() - data[key].min())
return data
# 计算信息熵
def calculate_entropy(data):
m = len(data)
r1 = -1/np.log(m) * np.sum(data * np.vectorize(mylog)(data))
r2 = 1 - r1
return r1, r2
# 计算权重
def calculate_weights(data, entropy_values):
weights = (1 - entropy_values) / np.sum(1 - entropy_values)
return weights
# 示例数据
data = {
'A': [9, 8, 6, 5],
'B': [0, 3, 7, 9],
'C': [0, 0.9, 0.2, 1]
}
label = {'A': 1, 'B': 1, 'C': 1} # 1 表示正向指标
# 标准化数据
normalized_data = normalize_data(pd.DataFrame(data))
# 计算每个指标的信息熵和效用值
entropy_values = normalized_data.apply(calculate_entropy, axis=0, result_type='expand').T
entropy_values.columns = ['信息熵', '效用值']
# 计算权重
weights = calculate_weights(normalized_data, entropy_values['效用值'])
# 输出结果
print("标准化数据:")
print(normalized_data)
print("\n信息熵和效用值:")
print(entropy_values)
print("\n权重:")
print(weights)
2.Bayes网络模型
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
# 定义贝叶斯网络的结构
model = BayesianModel([
('Burglary', 'Alarm'),
('Earthquake', 'Alarm'),
('Alarm', 'John calls'),
('Alarm', 'Mary calls')
])
# 定义条件概率分布
cpd_burglary = TabularCPD(variable='Burglary', variable_card=2, values=[[0.001], [0.999]])
cpd_earthquake = TabularCPD(variable='Earthquake', variable_card=2, values=[[0.002], [0.998]])
cpd_alarm = TabularCPD(variable='Alarm', variable_card=2,
values=[[0.95, 0.05, 0.94, 0.06, 0.29, 0.71, 0.001, 0.999]],
evidence=['Burglary', 'Earthquake'], evidence_card=[2, 2])
cpd_john_calls = TabularCPD(variable='John calls', variable_card=2,
values=[[0.9, 0.1, 0.05, 0.95]],
evidence=['Alarm'], evidence_card=[2])
cpd_mary_calls = TabularCPD(variable='Mary calls', variable_card=2,
values=[[0.7, 0.3, 0.01, 0.99]],
evidence=['Alarm'], evidence_card=[2])
# 将条件概率分布添加到模型中
model.add_cpds(cpd_burglary, cpd_earthquake, cpd_alarm, cpd_john_calls, cpd_mary_calls)
# 检查模型是否正确
assert model.check_model()
# 进行概率推断
inference = VariableElimination(model)
result = inference.query(variables=['Burglary'], evidence={'John calls': 1, 'Mary calls': 1})
# 打印结果
print(result)
3.加权信息熵方法
import numpy as np
import pandas as pd
import math
# 自定义对数函数,处理对数为0的情况
def mylog(p):
if p == 0:
return 0
else:
return np.log(p)
# 数据标准化处理
def normalize_data(data):
# 正向指标标准化
for key in data:
if label[key] == 1: # 正向指标
data[key] = (data[key] - data[key].min()) / (data[key].max() - data[key].min())
# 负向指标标准化
elif label[key] == 2: # 负向指标
data[key] = (data[key].max() - data[key]) / (data[key].max() - data[key].min())
return data
# 计算信息熵
def calculate_entropy(data):
m = len(data)
r1 = -1/np.log(m) * np.sum(data * np.vectorize(mylog)(data))
r2 = 1 - r1
return r1, r2
# 计算权重
def calculate_weights(data, entropy_values):
weights = (1 - entropy_values) / np.sum(1 - entropy_values)
return weights
# 示例数据
data = {
'A': [9, 8, 6, 5],
'B': [0, 3, 7, 9],
'C': [0, 0.9, 0.2, 1]
}
label = {'A': 1, 'B': 1, 'C': 1} # 1 表示正向指标
# 标准化数据
normalized_data = normalize_data(pd.DataFrame(data))
# 计算每个指标的信息熵和效用值
entropy_values = normalized_data.apply(calculate_entropy, axis=0, result_type='expand').T
entropy_values.columns = ['信息熵', '效用值']
# 计算权重
weights = calculate_weights(normalized_data, entropy_values['效用值'])
# 输出结果
print("标准化数据:")
print(normalized_data)
print("\n信息熵和效用值:")
print(entropy_values)
print("\n权重:")
print(weights)
4.决策支持模型
import requests
from bs4 import BeautifulSoup
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 数据收集
def get_html(url):
response = requests.get(url)
return response.text
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
data = []
for tr in soup.find_all('tr'):
row = []
for td in tr.find_all('td'):
row.append(td.text.strip())
data.append(row)
return data
url = 'https://www.example.com/data'
html = get_html(url)
data = parse_html(html)
print("Collected Data:")
print(data)
# 数据处理
def clean_data(data):
df = pd.DataFrame(data)
df = df.dropna()
df = df.replace('', None)
return df
def transform_data(df):
df = df.astype({'column1': 'int', 'column2': 'float'})
df['column3'] = df['column3'].map(lambda x: x.upper())
return df
df = clean_data(data)
df = transform_data(df)
print("Processed Data:")
print(df)
# 数据分析与决策支持
def support_decision(df):
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
return acc
acc = support_decision(df)
print("Accuracy of the Decision Support Model:", acc)
五、结论
模型验证:通过分析420个犯罪案例,验证了基于加权信息熵的计算方法是有效的。模型能够提供有效的侦查建议,并在调查阶段为证据收集和推理提供决策支持。
实际应用:模型不仅能够分析可用的案件信息,还能生成有效的侦查建议和推理结论。需要注意的是,该模型并不完全取代犯罪调查领域专业人士的作用,而是为后续调查者在调查初期的决策提供科学支持。
原文地址:https://blog.csdn.net/qq_63129682/article/details/144225921
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!