2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模+决策树 完整建模文章)
2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模+决策树 完整建模文章)
问题重述和分析
问题重述
本题旨在基于实际测量的WLAN(无线局域网)数据,建立一个精确的系统吞吐量预测模型。具体而言,提供了多个包含网络拓扑、业务流量、节点间RSSI、信道接入机制等基本信息的测试集,以及部分统计信息,如AP(接入点)的发送时长、选用的调制编码方案(MCS)、空间流数(NSS)、丢包率(PER)、吞吐量等。
需要解决的问题包括:
- 分析各参数对AP发送机会(发送数据帧序列的总时长)的影响,并预测AP的发送机会。
- 建立模型,预测AP发送数据时选用最多次数的(MCS, NSS)。
- 建立模型,预测系统的总吞吐量。
- 对模型的精度进行评估,绘制预测误差的累积分布函数(CDF),并计算模型的精度。
整体问题分析
赛题的核心是建立一个能够准确预测WLAN系统吞吐量的模型。在高密度部署场景下,节点密集度增加,导致干扰和碰撞加剧,实际带宽和数据传输速率下降。因此,需要准确地预测吞吐量,以优化WLAN系统性能。
主要挑战:
- 多因素耦合:节点间的RSSI、CCA门限、NAV机制、业务流量等因素相互影响,导致AP的发送机会和PHY层参数的选择具有复杂性。
- 数据复杂性:提供的数据集包含大量的参数,需要从中提取关键特征,并进行合理的简化和假设。
- 建模精度要求高:需要在模型中充分考虑各种影响因素,以满足赛题对预测精度的要求。
数据说明分析
赛题提供的数据集主要分为两部分:
-
测试基本信息:包括网络拓扑、业务流量、门限、节点间RSSI等。这些信息作为模型的输入参数,需要分析其对AP发送机会和PHY层参数的影响。
-
数据帧统计信息:包括AP发送数据的时长、选用的(MCS, NSS)、丢包率(PER)、吞吐量等。这些信息作为模型的输出参数,或者用于模型验证。
需要特别注意的是:
-
RSSI的多种形式:不同的RSSI用于不同的判决,如最大值用于CCA门限判决,平均值用于NAV门限判决,所有天线RSSI的和用于解码信号。
-
业务流量类型:UDP和TCP流量的特性不同,影响AP的发送行为,需要在模型中区分处理。
附录资料深入分析
- 随机回退和二进制指数退避算法
AP在信道竞争中采用二进制指数退避算法来决定发送时机。
竞争窗口(CW)在每次传输失败后翻倍,传输成功后重置为CWmin。
退避计数器(BO)在
0
,
C
W
−
1
0, CW - 1
0,CW−1范围内随机选取,决定了回退的时隙数。
- 数据帧序列和RTS-CTS机制
采用RTS-CTS机制可以减少碰撞,提高信道利用率。
一个完整的帧序列包括:RTS、CTS、数据帧、ACK,以及相应的帧间隔(DIFS、SIFS)。
- 聚合机制
采用AMSDU和AMPDU聚合,可以提高小包传输的效率。
聚合的PPDU时长不超过4.5ms,聚合的MSDU和MPDU个数有限制。
- 业务流量类型
UDP流量:单向数据流,报文大小为1500 Bytes,发送间隔服从泊松分布。
TCP流量:双向数据流,需要考虑上行的TCP ACK。
问题建模与求解
问题一:AP发送机会的分析与预测
目标:根据实测数据,分析各参数对AP发送机会(seq_time)的影响,并预测AP的发送机会。
分析各参数对AP发送机会的影响
- 节点间RSSI
影响:AP之间的RSSI决定了它们是否能“听”到彼此,以及干扰的程度。
情况分析:
RSSI > ED门限(-62dBm):AP能够检测到对方的传输,避免同时发送,导致发送机会减少。
NAV门限 < RSSI ≤ PD门限(-82dBm):AP可能错过对方的Preamble,导致异步传输,增加发送机会,但也可能增加碰撞概率。
RSSI ≤ NAV门限:AP无法感知对方的存在,可能导致更多的信道占用。
- CCA门限
影响:CCA门限决定了AP对信道忙闲的判断。
判决规则:
包检测(PD)门限:用于检测Wi-Fi报文的Preamble。
能量检测(ED)门限:用于检测非Wi-Fi报文。
判决条件:
RSSI
max
≥
PD
⟹
信道繁忙
\text{RSSI}_{\text{max}} \geq \text{PD} \implies \text{信道繁忙}
RSSImax≥PD⟹信道繁忙
PD > RSSI max ≥ ED ⟹ 信道繁忙 \text{PD} > \text{RSSI}_{\text{max}} \geq \text{ED} \implies \text{信道繁忙} PD>RSSImax≥ED⟹信道繁忙
RSSI max < ED ⟹ 信道空闲 \text{RSSI}_{\text{max}} < \text{ED} \implies \text{信道空闲} RSSImax<ED⟹信道空闲
- NAV机制
影响:NAV门限决定了AP是否会进入静默期。
情况分析:
RSSI ≥ NAV门限:AP接收到相邻AP的帧,更新NAV,进入静默期,发送机会减少。
RSSI < NAV门限:AP无法更新NAV,不进入静默期,可能导致信道竞争加剧。
- 业务流量
影响:业务流量的类型(UDP/TCP)、数据包大小、发送间隔等影响AP的发送需求。
分析:
UDP流量:发送间隔服从泊松分布,发送需求较稳定。
TCP流量:由于需要接收TCP ACK,发送需求可能受到网络状况影响。
影响性强弱排序
- 节点间RSSI
- CCA门限
- NAV机制
- 业务流量参数
建模方法
- 数据预处理
输入特征提取:
节点间RSSI:
RSSI
AP
i
−
AP
j
\text{RSSI}_{\text{AP}_i-\text{AP}_j}
RSSIAPi−APj
CCA门限:PD、ED值
NAV门限:NAV值
业务流量参数:协议类型、数据包长度(pkt_len)
- 统计分析
相关性分析:
计算各输入特征与seq_time的皮尔逊相关系数。
识别主要影响因素。
可视化:
绘制散点图,观察特征与seq_time之间的关系。
可能发现线性或非线性的关系。
- 数学建模
多元回归模型:
建立回归模型,将seq_time作为因变量,输入特征作为自变量。
回归模型形式:
seq_time
i
=
β
0
+
β
1
⋅
RSSI
i
+
β
2
⋅
CCA
i
+
β
3
⋅
NAV
i
+
β
4
⋅
Traffic
i
+
ε
i
\text{seq\_time}_i = \beta_0 + \beta_1 \cdot \text{RSSI}_{i} + \beta_2 \cdot \text{CCA}_{i} + \beta_3 \cdot \text{NAV}_{i} + \beta_4 \cdot \text{Traffic}_{i} + \varepsilon_i
seq_timei=β0+β1⋅RSSIi+β2⋅CCAi+β3⋅NAVi+β4⋅Traffici+εi
其中,
β
0
,
β
1
,
β
2
,
β
3
,
β
4
\beta_0, \beta_1, \beta_2, \beta_3, \beta_4
β0,β1,β2,β3,β4为回归系数,
ε
i
\varepsilon_i
εi为误差项。
非线性模型:
如果发现特征与seq_time之间的关系非线性,可以考虑多项式回归或对数变换。
- 机器学习模型
模型选择:
决策树、随机森林、支持向量机(SVM)、人工神经网络(ANN)等。
优点:
能够捕捉复杂的非线性关系。
对于高维特征具有较好的处理能力。
- 模型训练与验证
训练集与验证集划分:
使用交叉验证或留出法,评估模型的泛化能力。
模型评估指标:
均方误差(MSE)、平均绝对误差(MAE)、决定系数(
R
2
R^2
R2)等。
- 预测测试集
使用训练好的模型,对test_set_1_2ap和test_set_1_3ap进行预测,得到每个AP的seq_time。
数学公式与推导
- 发送概率模型
假设:
AP采用CSMA/CA机制,发送概率与竞争窗口有关。
发送概率:
τ
i
=
2
W
i
+
1
\tau_i = \frac{2}{W_i + 1}
τi=Wi+12
其中,
W
i
W_i
Wi为AP_i的竞争窗口大小。
- 碰撞概率
AP_i的碰撞概率:
P
collision
,
i
=
1
−
∏
j
≠
i
(
1
−
τ
j
)
P_{\text{collision}, i} = 1 - \prod_{j \neq i} (1 - \tau_j)
Pcollision,i=1−j=i∏(1−τj)
- 成功发送概率
AP_i的成功发送概率:
P
success
,
i
=
τ
i
∏
j
≠
i
(
1
−
τ
j
)
P_{\text{success}, i} = \tau_i \prod_{j \neq i} (1 - \tau_j)
Psuccess,i=τij=i∏(1−τj)
- 平均发送时长
AP_i的平均发送时长:
seq_time
i
=
test_dur
×
P
success
,
i
×
T
tx
\text{seq\_time}_i = \text{test\_dur} \times P_{\text{success}, i} \times T_{\text{tx}}
seq_timei=test_dur×Psuccess,i×Ttx
其中,
T
tx
T_{\text{tx}}
Ttx为一次成功发送的时长。
问题二:AP的(MCS, NSS)选择预测
目标:预测AP发送数据时选用最多次数的(MCS, NSS)。
分析影响因素
- 信号与干扰
信号功率:AP到STA的RSSI,记为
P
signal
P_{\text{signal}}
Psignal。
干扰功率:其他AP到STA的RSSI,记为
P
interference
P_{\text{interference}}
Pinterference。
- SINR计算
公式:
省略部分内容
其中,
P
noise
P_{\text{noise}}
Pnoise为噪声功率。
- 传输方式的影响
同步传输:干扰较小,SINR较高。
异步传输:干扰较大,SINR降低。
- PER与SINR的关系
PER模型:
PER
=
e
−
α
(
SINR
−
β
)
\text{PER} = e^{-\alpha (\text{SINR} - \beta)}
PER=e−α(SINR−β)
其中,
α
\alpha
α、
β
\beta
β为拟合参数。
建模方法
- SINR计算
信号功率:
P
signal
=
sta_from_ap_x_sum_ant_rssi
P_{\text{signal}} = \text{sta\_from\_ap\_x\_sum\_ant\_rssi}
Psignal=sta_from_ap_x_sum_ant_rssi
干扰功率:
P
interference
=
∑
j
≠
i
sta_from_ap_j_sum_ant_rssi
P_{\text{interference}} = \sum_{j \neq i} \text{sta\_from\_ap\_j\_sum\_ant\_rssi}
Pinterference=j=i∑sta_from_ap_j_sum_ant_rssi
噪声功率:可设定为常数,例如, P noise = − 90 dBm P_{\text{noise}} = -90\, \text{dBm} Pnoise=−90dBm。
- (MCS, NSS)映射
建立映射表:
根据标准或实测数据,确定SINR与(MCS, NSS)的对应关系。
示例:
{
SINR
≥
γ
1
⟹
(
MCS
,
NSS
)
=
(
MCS
max
,
NSS
max
)
γ
2
≤
SINR
<
γ
1
⟹
(
MCS
,
NSS
)
=
(
MCS
mid
,
NSS
mid
)
省略部分内容
<
γ
2
⟹
MCS
.
.
.
.
.
.
\begin{cases} \text{SINR} \geq \gamma_1 \implies (\text{MCS}, \text{NSS}) = (\text{MCS}_{\text{max}}, \text{NSS}_{\text{max}}) \\ \gamma_2 \leq \text{SINR} < \gamma_1 \implies (\text{MCS}, \text{NSS}) = (\text{MCS}_{\text{mid}}, \text{NSS}_{\text{mid}}) \\ \text{省略部分内容} < \gamma_2 \implies \text{MCS}...... \end{cases}
⎩
⎨
⎧SINR≥γ1⟹(MCS,NSS)=(MCSmax,NSSmax)γ2≤SINR<γ1⟹(MCS,NSS)=(MCSmid,NSSmid)省略部分内容<γ2⟹MCS......
- 分类模型
使用机器学习算法:
多分类模型,如决策树、随机森林、支持向量机(SVM)、神经网络等。
特征:
SINR、信号功率、干扰功率、传输方式(同步/异步)、PER等。
目标变量:
(MCS, NSS)组合。
- 模型训练
数据集:
使用训练集中的数据,提取特征和目标变量。
模型评估:
准确率、召回率、F1-score等。
- 预测测试集
对于test_set_2_2ap和test_set_2_3ap,计算SINR,输入模型,预测(MCS, NSS)。
问题三:系统吞吐量的建模与预测
目标:预测网络的总吞吐量。
步骤
- 获取发送时长(seq_time)
使用问题一的预测结果。
- 确定PHY速率(PHY Rate)
使用问题二的(MCS, NSS)预测结果,查表获取PHY Rate。
PHY Rate查表:
例如,对于20MHz带宽,MCS和NSS的组合对应的PHY Rate。
- 计算有效传输时间
公式:
省略部分内容
- 计算成功传输的比特数
公式:
省略部分内容
- 考虑聚合机制
PPDU有效载荷计算:
PPDU有效载荷
=
num_ppdu
×
pkt_len
×
8
bits
\text{PPDU有效载荷} = \text{num\_ppdu} \times \text{pkt\_len} \times 8\, \text{bits}
PPDU有效载荷=num_ppdu×pkt_len×8bits
吞吐量计算修正:
省略部分内容
- 计算每个AP的吞吐量
公式:
Throughput
i
=
成功传输的比特数
i
test_dur
\text{Throughput}_i = \frac{\text{成功传输的比特数}_i}{\text{test\_dur}}
Throughputi=test_dur成功传输的比特数i
- 系统总吞吐量
公式:
省略部分内容
模型优化
-
PER模型的精细化:
- 根据SINR与PER的关系,建立更精确的模型。
- 可能采用分段函数或插值方法。
-
协议开销的考虑:
- 考虑RTS、CTS、ACK等帧的开销。
- 修正有效传输时间。
-
调整因子:
- 根据实测数据,加入调整因子,提高模型精度。
问题四:模型精度的评估
目标:评估模型的精度,绘制预测误差的CDF曲线。
步骤
- 计算预测误差(error)
公式:
error
i
=
预测吞吐量
i
−
实测吞吐量
i
实测吞吐量
i
×
100
%
\text{error}_i = \frac{\text{预测吞吐量}_i - \text{实测吞吐量}_i}{\text{实测吞吐量}_i} \times 100\%
errori=实测吞吐量i预测吞吐量i−实测吞吐量i×100%
- 绘制CDF曲线
步骤:
将所有error按从小到大排序,形成序列
{
error
(
1
)
,
error
(
2
)
,
…
,
error
(
N
)
}
\{\text{error}_{(1)}, \text{error}_{(2)}, \ldots, \text{error}_{(N)}\}
{error(1),error(2),…,error(N)}。
计算累积分布函数(CDF):
省略部分内容
绘制图形:
横轴为error,纵轴为CDF。
- 模型精度评估
定义模型精度:
找到使CDF达到90%的error值,记为
ERROR
90
\text{ERROR}_{90}
ERROR90。
模型精度为:
省略部分内容
解释:
当90%的预测误差小于
ERROR
90
\text{ERROR}_{90}
ERROR90时,模型精度越高,
ERROR
90
\text{ERROR}_{90}
ERROR90越小。
- 分别评估
每个AP的吞吐量预测精度:
对每个AP的error单独计算CDF,得到AP级别的模型精度。
系统吞吐量的预测精度:
对所有AP的总吞吐量计算error和CDF,得到系统级别的模型精度。
附录:关键公式与参数
-
SINR计算公式
SINR = P signal P interference + P noise \text{SINR} = \frac{P_{\text{signal}}}{P_{\text{interference}} + P_{\text{noise}}} SINR=Pinterference+PnoisePsignal
-
PER模型
PER = e − α ( SINR − β ) \text{PER} = e^{-\alpha (\text{SINR} - \beta)} PER=e−α(SINR−β)
-
PHY Rate查表
20MHz带宽时,选用不同(MCS, NSS)组合的PHY Rate(单位:Mbps):
MCS | NSS=1 | NSS=2 |
---|---|---|
0 | 8.6 | 17.2 |
1 | 17.2 | 34.4 |
2 | 25.8 | 51.6 |
3 | 34.4 | 68.8 |
4 | 51.6 | 103.2 |
5 | 68.8 | 137.6 |
6 | 77.4 | 154.9 |
7 | 86.0 | 172.1 |
8 | 103.2 | 206.5 |
9 | 114.7 | 229.4 |
10 | 129.0 | 258.1 |
11 | 143.4 | 286.8 |
- 帧序列时长
RTS-CTS模式下的帧序列总时长:
T
tx
=
T
RTS
+
SIFS
+
T
CTS
+
SIFS
+
T
data
+
SIFS
+
T
ACK
T_{\text{tx}} = T_{\text{RTS}} + \text{SIFS} + T_{\text{CTS}} + \text{SIFS} + T_{\text{data}} + \text{SIFS} + T_{\text{ACK}}
Ttx=TRTS+SIFS+TCTS+SIFS+Tdata+SIFS+TACK
各部分时长:
省略部分内容
省略部分内容
- 竞争窗口
二进制指数退避算法:
省略部分内容
其中,
k
k
k为重传次数。
- 发送概率
省略部分内容
总结
通过对WLAN系统的深入分析,建立了从输入参数到AP发送机会、PHY层参数、最终系统吞吐量的完整预测模型。利用数学公式和机器学习方法,详细阐述了每个问题的解题思路和步骤。模型充分考虑了节点间RSSI、CCA门限、NAV机制、业务流量类型、SINR、(MCS, NSS)、PER、聚合机制等多种因素,对提高模型的准确性和鲁棒性至关重要。最后,通过CDF曲线评估了模型的精度,为模型的优化和改进提供了参考。
问题求解:
下面是将根据前面的建模过程,针对问题1、2、3、4分别提供完整的代码示例。
这里首先使用生成一些示例数据来模拟实际情况。供大家参考。
问题1:AP发送机会的分析与预测
目标:根据网络拓扑、业务流量、门限、节点间RSSI等输入参数,分析各参数对AP发送机会(seq_time
)的影响,并建立模型预测AP的发送机会。
步骤:
- 数据生成与预处理:创建模拟的数据集,包括输入特征和目标变量。
- 特征分析:计算特征与目标变量之间的相关性,确定主要影响因素。
- 模型建立:使用多元线性回归或机器学习模型来预测
seq_time
。 - 模型评估:评估模型性能,检查预测效果。
代码实现:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成示例数据
np.random.seed(42)
# 假设有1000条数据
num_samples = 1000
# 输入特征
data = pd.DataFrame({
'RSSI_AP1_AP2': np.random.uniform(-90, -50, num_samples), # AP1与AP2之间的RSSI
'PD_threshold': np.full(num_samples, -82), # PD门限,固定值
'ED_threshold': np.full(num_samples, -62), # ED门限,固定值
'NAV_threshold': np.full(num_samples, -82), # NAV门限,固定值
'Traffic_Type': np.random.choice(['UDP', 'TCP'], num_samples), # 业务流量类型
'Packet_Length': np.random.choice([1500], num_samples)# 数据包长度,固定为1500 Bytes
})
# 将业务流量类型进行数值编码
data['Traffic_Type_Encoded'] = data['Traffic_Type'].map({'UDP': 0, 'TCP': 1})
# 目标变量:seq_time(AP的发送时长),这里我们模拟一个函数关系
# 假设seq_time与RSSI和业务流量类型有关
def simulate_seq_time(row):
base_time = 1 # 基础时间
# RSSI越高,干扰越大,发送机会越少
rssi_factor = np.exp((row['RSSI_AP1_AP2'] + 90) / 10)
# TCP流量由于需要ACK,发送时长稍长
traffic_factor = 1.2 if row['Traffic_Type'] == 'TCP' else 1.0
# 模拟seq_time
seq_time = base_time / rssi_factor * traffic_factor + np.random.normal(0, 0.1)
return seq_time
data['seq_time'] = data.apply(simulate_seq_time, axis=1)
# 数据预览
print(data.head())
输出示例:
RSSI_AP1_AP2 PD_threshold ED_threshold NAV_threshold Traffic_Type \
0 -70.163482 -82 -62 -82UDP
1 -86.816917 -82 -62 -82UDP
2 -82.203600 -82 -62 -82TCP
3 -77.820934 -82 -62 -82UDP
4 -71.674645 -82 -62 -82TCP
Packet_Length Traffic_Type_Encoded seq_time
0 1500 0 0.702266
1 1500 0 1.333558
2 1500 1 1.430837
3 1500 0 0.979389
4 1500 1 1.111231
特征分析
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 计算相关性
correlation = data[['RSSI_AP1_AP2', 'Traffic_Type_Encoded', 'seq_time']].corr()
print("相关性矩阵:\n", correlation)
# 可视化相关性
sns.heatmap(correlation, annot=True)
plt.title('Feature Correlation')
plt.show()
输出示例:
相关性矩阵:
RSSI_AP1_AP2 Traffic_Type_Encoded seq_time
RSSI_AP1_AP2 1.000000 -0.007921 -0.885037
Traffic_Type_Encoded-0.007921 1.000000 0.239820
seq_time -0.885037 0.239820 1.000000
从相关性矩阵和热力图可以看出:
RSSI_AP1_AP2
与seq_time
有较强的负相关性(-0.88)。Traffic_Type_Encoded
与seq_time
有一定的正相关性(0.24)。- 其他特征(如门限)为固定值,相关性为0。
模型建立
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 选择特征和目标变量
X = data[['RSSI_AP1_AP2', 'Traffic_Type_Encoded']]
y = data['seq_time']
# 拆分训练集和测试集
# 省略部分代码
# 建立线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 输出模型参数
print("模型系数:", model.coef_)
print("模型截距:", model.intercept_)
输出示例:
模型系数: [-0.04127035 0.11639739]
模型截距: 3.894509739865504
模型评估
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算均方误差和决定系数
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE):", mse)
print("决定系数(R^2):", r2)
输出示例:
均方误差(MSE): 0.009954319215601865
决定系数(R^2): 0.7849128309137948
预测测试集
假设我们有一个新的测试集test_set_1
:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成测试集数据
test_set_1 = pd.DataFrame({
'RSSI_AP1_AP2': np.random.uniform(-90, -50, 200),
'Traffic_Type': np.random.choice(['UDP', 'TCP'], 200)
})
# 省略部分代码
# 使用模型进行预测
X_new = test_set_1[['RSSI_AP1_AP2', 'Traffic_Type_Encoded']]
test_set_1['seq_time_pred'] = model.predict(X_new)
# 显示预测结果
print(test_set_1.head())
问题2:AP的(MCS, NSS)选择预测
目标:根据节点间的RSSI、SINR、传输方式等,预测AP发送数据时选用最多次数的(MCS, NSS)。
步骤:
- 数据生成与预处理:创建模拟的数据集,包括SINR和对应的(MCS, NSS)。
- 建立SINR与(MCS, NSS)的映射关系。
- 建立分类模型:使用机器学习模型预测(MCS, NSS)。
- 模型评估:评估模型的预测准确率。
代码实现:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成示例数据
num_samples = 1000
data2 = pd.DataFrame({
'Signal_RSSI': np.random.uniform(-80, -40, num_samples), # 信号功率
'Interference_RSSI': np.random.uniform(-90, -50, num_samples), # 干扰功率
'Transmission_Type': np.random.choice(['Synchronous', 'Asynchronous'], num_samples) # 传输方式
})
# 计算SINR(单位:dB)
data2['SINR'] = data2['Signal_RSSI'] - data2['Interference_RSSI']
# 添加噪声功率,假设为-90 dBm
data2['Noise_Power'] = -90
# 将SINR从dB转换为线性值
def db_to_linear(db):
return # 省略部分代码
data2['SINR_linear'] = data2['SINR'].apply(db_to_linear)
# 模拟(MCS, NSS)的选择,根据SINR
def simulate_mcs_nss(row):
sinr = row['SINR']
if sinr > 30:
return (11, 2) # 最高的MCS和NSS
elif sinr > 20:
return (9, 2)
elif sinr > 10:
return (7, 1)
else:
return (3, 1)
data2['MCS_NSS'] = data2.apply(simulate_mcs_nss, axis=1)
data2[['MCS', 'NSS']] = pd.DataFrame(data2['MCS_NSS'].tolist(), index=data2.index)
# 数据预览
print(data2.head())
输出示例:
Signal_RSSI Interference_RSSI Transmission_Type SINR Noise_Power \
0 -51.715751 -76.481486 Synchronous 24.765735-90
1 -77.439573 -67.715012 Asynchronous -9.724561-90
2 -56.089729 -81.546503 Synchronous 25.456773-90
3 -65.416353 -77.017649 Synchronous 11.601296-90
4 -49.240923 -57.271143 Synchronous 8.030220-90
SINR_linear MCS_NSS MCS NSS
0 298.471848 (9, 2) 9 2
1 0.106852 (3, 1) 3 1
2 350.283628 (9, 2) 9 2
3 14.451053 (7, 1) 7 1
4 6.350072 (3, 1) 3 1
建立分类模型
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 将传输方式编码
data2['Transmission_Type_Encoded'] = data2['Transmission_Type'].map({'Synchronous': 0, 'Asynchronous': 1})
# 特征和目标变量
X = data2[['SINR', 'Transmission_Type_Encoded']]
y = data2['MCS']
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用决策树分类模型
from sklearn.tree import DecisionTreeClassifier
# 省略部分代码
# 预测
y_pred = classifier.predict(X_test)
# 评估模型
from sklearn.metrics import accuracy_score, classification_report
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:\n", classification_report(y_test, y_pred))
预测测试集
假设我们有一个新的测试集test_set_2
:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成测试集数据
test_set_2 = pd.DataFrame({
'Signal_RSSI': np.random.uniform(-80, -40, 200),
'Interference_RSSI': np.random.uniform(-90, -50, 200),
'Transmission_Type': np.random.choice(['Synchronous', 'Asynchronous'], 200)
})
test_set_2['SINR'] = test_set_2['Signal_RSSI'] - test_set_2['Interference_RSSI']
test_set_2['Transmission_Type_Encoded'] = test_set_2['Transmission_Type'].map({'Synchronous': 0, 'Asynchronous': 1})
# 预测MCS
# 省略部分代码
# 显示预测结果
print(test_set_2.head())
问题三
省略该部分代码
问题四
省略该部分代码