2019数学建模比赛总结

随记

2019.9.24
很幸运,能和我们本校研二师兄李小龙、研三师兄宋磊磊一起组队参加这次数学建模比赛,
真的非常的幸运能和他们一起组队建模,不仅学到了很多东西,
更多的是他们的那种永不放弃的精神真的给我很大的触动,
经历了第一次通宵,不是在玩手机,而是在学习工作。
在这里记录一下这3天半的收获。

3天半的建模过程

从19号上午8点下载题目,我们初步定了C题,C题题目虽然简单,但是论文思路无从下手,经过中午的讨论,我们果断放弃C题,选择了A题。A题是机器学习方面的题目,虽然比较难,但是师兄觉得可以做。所以我们于19号晚最终确定了C题,简单分析了一下题目和所给的数据,就回去休息了。
  第二天20号,我们开始仔细分析题目要求,分析所给数据的特征。下午师兄就开始讨论如何使用Tensorflow机器学习框架实现题目的要求,由于我只是对机器学习大概了解,还没有动手构建模型的编码能力,基本处于划水状态,经过题目思路的讨论,确定了工作分配。晚上师兄们就开始使用Tensorflow构建模型,我来翻阅资料提取特征,A题必须先上传模型,有跑分,才有资格评选论文。所以师兄的压力特别大,中途由于部署模型的困难,结果过于拟合的困难,几乎快要奔溃,但是师兄没有放弃,一直调试到夜里3点终于部署成功。
  第三天21号,早上出打榜结果,我们排名靠前。但是还有好多队伍还没有提交,这不是最后的结果。虽然我们的模型部署成功,但是比较简单,还没有调优,我们只是使用了3个特征,准确的来说只有一个距离特征,所以训练出来的模型的效果不是很好,但是由于时间紧迫,我们决定先写论文,最后再优化。下午我们讨论了论文的整体思路,我先定了大概格式和目录,师兄开始写关键的主体内容,我来把之前数据的分析结果可视化(说来惭愧,整个建模就做了这一点点贡献),写论文的整个过程,真的非常痛苦,一直改到3点,大师兄实在太累了,我和二师兄开始修改,改到4点我也坚持不住了,就只有二师兄一个人在改了,到5点半我睡醒了,发现是大师兄已经醒了在改论文,二师兄休息了。
  就这样到了6点,太阳出来了,我们的论文终于修改好了。但是这个时候我们更新打榜排名,我们发现我们的排名下降了好多。这个时候我们快放弃了,心里想,算了回去睡觉了,拿不到名次就算了吧,至少努力过了。但是二师兄,坚持利用好最后的5个小时开始调模型,我也帮不了什么忙,帮大师兄二师兄加油打气,最后一直到12点,又提交了几次模型,结果不是很好,但是我们互相鼓励,相信结果不会太差,就这样3天半的建模比赛结束了。

最终的论文摘要

为了在部署5G网络时合理地选择覆盖域,需要借助无线传播模型对目标通信覆盖区的无线电波传播特性进行预测,以便更好地选择基站地址来满足用户的通信需求。传统的模型如Cost 231-Hata、Okumura等,通过经验数据来获取固定的拟合公式,其有一定局限性。近年来,大数据驱动的AI机器学习技术的突破,在语言、图像处理等领域获得了成功的运用。针对新环境无线信号的预测问题,本文提出了基于神经网络的无线传播模型。为了进行有效的预测,首先参照传统模型、经验数据以及对实际问题的理解,设计了14个特征。此外,在设计神经网络时使用了对称的编码解码结构,能够更好地拟合数据。最后针对弱覆盖信号区域的分类问题,在训练时对弱覆盖信号数据进行加权,增加神经网络对弱覆盖信号数据的学习偏好,从而解决弱覆盖信号区域分类的问题。
  针对问题一,要求参照Cost 231-Hata和给出的样例数据设计合适的特征。在设计特征时,本文从实际问题出发,考虑到5G基站发射机较以往的发射机发射频率更高的问题,调整Cost 231-Hata部分参数,以达到适应5G网络的特性。此外根据样例数据以及现实生活中信号传输的特性设计了7种简单特征,如水平距离、天线水平角夹角等。然后结合Cost 231-Hata和7种简单特征组合成7种复杂特征,总计14种特征。
  针对问题二,要求对问题一设计的特征从是否发散、与目标的相关性等方面判断特征是否合适,从而为机器学习模型选择有效的特征。为此,本文选择了方差来判断特征的离散程度。另外选择了皮尔逊系数和互信息来判断特征的相关性。随后将判断的结果量化、排序并展示在表中。
  针对问题三,要求使用参赛队伍自身设计的特征集和赛题提供的训练数据集,设计合适的AI模型来预测RSRP。为此,本文根据问题的特点设计了神经网络模型。在设计网络时使用了对称的编码解码结构,将16维的特征逐层编码到1024维,再逐渐解码至1维,以增强网络的表达能力。此外,对于要求弱覆盖识别率PCRR达到20%以上的问题,使用了弱覆盖信号数据加权以及减少强覆盖信号训练数据的数量,来增强神将网络对弱覆盖信号数据的学习偏好。最后本文对PCRR度量进行了修改,使其作为损失函数来优化网络。

建模中我的工作

在整个建模团队合作中,我主要做的工作就是对已有数据的整理刷选,以及画图。

  1. 对第一个小区数据使用Cost 231-Hata和最终结果进行对比
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.set_printoptions(suppress=True)
train_data = pd.read_csv('train_108401.csv')
col_name = train_data.columns.tolist()

def hata_feature(CX, CY, X, Y, CAltitude, CHeight, Altitude, Frequency, Power): 
    dis = np.sqrt((CX - X) ** 2 + (CY - Y) ** 2) / 1000
    hb = CAltitude + CHeight - Altitude
    cm = 3
    pl = 46.3 + 83.9 * np.log(Frequency) - 13.82 * np.log(hb) - 0 + (44.9 - 6.55 * np.log(hb)) * np.log(dis) + cm
    RSRP = Power - pl
    return RSRP

RSRP = np.array(train_data[col_name[17]].tolist())
CX = np.array(train_data[col_name[1]].tolist())
CY = np.array(train_data[col_name[2]].tolist())
X = np.array(train_data[col_name[12]].tolist())
Y = np.array(train_data[col_name[13]].tolist())
CHeight = np.array(train_data[col_name[3]].tolist())
CAltitude = np.array(train_data[col_name[9]].tolist())
Altitude = np.array(train_data[col_name[14]].tolist())
Frequency = np.array(train_data[col_name[6]].tolist())
Power = np.array(train_data[col_name[8]].tolist())
rsrp = hata_feature(CX, CY, X, Y, CAltitude, CHeight, Altitude, Frequency, Power)

for i in range(len(rsrp)):
    print(rsrp[i], RSRP[i])
  1. 比较特征是否发散,判断对最终预测结果的影响
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline

np.set_printoptions(suppress=True)
train_data = pd.read_csv('train_108401.csv')
col_name = train_data.columns.tolist()

def lost_feature(CX, CY, X, Y, CAltitude, CHeight, Altitude, Frequency): 
    dis = np.sqrt((CX - X) ** 2 + (CY - Y) ** 2)
    hb = (CAltitude + CHeight - Altitude)
    d = np.sqrt(dis ** 2 + hb ** 2) / 1000
    lost = 42.6 + 26 * np.log(d) + 20* np.log(Frequency)
    # RSRP = Power - pl
    return lost

RSRP = np.array(train_data[col_name[17]].tolist())
CX = np.array(train_data[col_name[1]].tolist())
CY = np.array(train_data[col_name[2]].tolist())
X = np.array(train_data[col_name[12]].tolist())
Y = np.array(train_data[col_name[13]].tolist())
BH = np.array(train_data[col_name[15]].tolist())
dis = np.sqrt((CX - X) ** 2 + (CY - Y) ** 2)
CHeight = np.array(train_data[col_name[3]].tolist())
CAltitude = np.array(train_data[col_name[9]].tolist())
Altitude = np.array(train_data[col_name[14]].tolist())

Frequency = np.array(train_data[col_name[6]].tolist())
Power = np.array(train_data[col_name[8]].tolist())
lost = lost_feature(CX, CY, X, Y, CAltitude, CHeight, Altitude, Frequency)


# lost是否发散
n=1024
X=lost
Y=RSRP
T=np.arctan2(RSRP,lost)			#设置颜色
lost_var = np.var(lost)
print(lost_var)
plt.scatter(X,Y,s=5,c=T,alpha=1)	# s:表示大小,alpha:表示透明度
plt.show()


# Frequency是否发散
n=1024
X=Frequency
Y=RSRP
T=np.arctan2(RSRP,Frequency)			#设置颜色
Frequency_var = np.var(Frequency)
print(Frequency_var)
plt.scatter(X,Y,s=5,c=T,alpha=1)	# s:表示大小,alpha:表示透明度
plt.show()


# Building Height
X=BH
Y=RSRP
T=np.arctan2(RSRP,BH)			#设置颜色
BH_var = np.var(BH)
print(BH_var)
plt.scatter(X,Y,s=5,c=T,alpha=1)	# s:表示大小,alpha:表示透明度
plt.show()

所得图片如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3. 对地形的编号的影响程度字典存储,对value进行排序

terrain_table = {1:1 , 2:2 , 3:3 , 7:4 , 8:5 ,
			9:6 , 4:7 , 5:8 , 6:9 , 19:10,
			17:11 , 18:12 , 10:13 , 11:14 , 12:15,
			20:16 , 14:17 , 13:18 , 15:19 , 16:20}

def terrain_feature(Terrain):
	res =[] 
	for i in range(len(Terrain)):
		res.append(terrain_table[Terrain[i]])
	return res

np.set_printoptions(suppress=True)
train_data = pd.read_csv('train_108401.csv')
col_name = train_data.columns.tolist()
Terrain = np.array(train_data[col_name[16]].tolist())
pl = terrain_feature(Terrain)

for i in range(len(pl)):
    print(pl[i])
  1. 对4000个小区的Cell Altitude柱状图统计
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# %matplotlib inline

fig = plt.figure(figsize=(16, 8))
ax = fig.add_subplot(1, 1, 1)

# 501.83275 550 472
a = [494, 507, 507]    #此处省略数组
ax.hist(a, bins=200, range=(472, 550), density=True, color='blue', alpha=0.7)
plt.show()

在这里插入图片描述
5. 对训练集中的4000个文件夹下的所有文件RSRP数据进行统计,发现数据集的不平衡性

count = 0
sum = 0
rootdir = 'train_set'
list = os.listdir(rootdir) #列出文件夹下所有的目录与文件
# print(len(list))
for i in range(0,len(list)):
       path = os.path.join(rootdir,list[i])
       # print(path)
       if os.path.isfile(path):
       	train_data = pd.read_csv(path)
       	col_name = train_data.columns.tolist()
       	RSRP = np.array(train_data[col_name[17]].tolist())
       	# print(len(RSRP))
       	for i in range(len(RSRP)):
       		sum = sum+1
       		if RSRP[i]< -103:
       			count = count+1
print(sum)
print(count)

#运行结果如下
# 12011833
# 1702341

  1. 根据(x,y)坐标,画出RSRP分布图
    在这里插入图片描述
  2. RSRF数据分布图
#Total_distribution
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

labels = ['RSRP<=-103','RSRP>-103']
sizes = [12011833,1702341]
explode = (0,0.1)
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
# plt.title("Total_distribution")
plt.show()

在这里插入图片描述

建模中的收获

  1. 在很多地方ubuntu还是有很多缺陷的,准备寒假买一个256固态装一下双系统。
  2. 会使用word和excel也是一种能力,特别是execl对数据的筛选统计能力有时候比python还要方便,有必要系统的学一下world和execl的使用。
  3. 模型调参 就是一种玄学,虽然是玄学,但是也要理解模型。准备明天开始看西瓜书,开始正式接触机器学习。
  4. 不管是后端开发,还是数据开发,还是数据分析,对你的思维逻辑的要求都比较高,还是要坚持刷leetcode。
  5. 看到了人类的极限,其实你是可以100个小时专心做一件事,中间只休息10个小时。也许现在还年轻,就觉得身体不重要,活的精彩才总要。
热防护服是高温环境工作人群的重要保障,本文通过建立数学模型对多层热防护织物内部传热规律进行研究,建立防护服装内部的热传递模型,从而解决外界环境温度一定时,防护服各层随时间变化的温度分布问题和各层织物材料的最优厚度问题。 假人处于恒高温环境中,不考虑防护服织物的边缘热量损失,且人体和防护服的空气间隔很小,忽略空气的自然对流,只考虑热传导;故可以把织物视为导热多层平面,且属于非稳态导热过程。建立“高温环境-防护服-假人体表”系统;由傅里叶定律描述导热速率,将温度的变化转是能量传递的结果,将其看作电磁波的辐射和介质中对电磁波的传输问题。 防护服中的温度分布由时间和防护服与外界热源相对位置二者共同决定的二元函数,因为二元偏微分方程的解析解无法精确求出,所以对时间进行离散化分析,分析以一秒为单位时间的温度变化与位置的关系,从而对问题进行简化。 针对问题一,将各层的导热过程抽象简化处理转换为平板中非稳态导热过程,在平板厚度的四周绝热良好时,从传热的角度上将问题简化为一个一维传热问题;从假人皮肤外侧的温度变化入手,根据热量的流向和生热情况从第Ⅳ层、第III层、第Ⅱ层、第Ⅰ层反向递推出和外界环境温度的关系,引入能温转换系数,建立假人皮肤外侧温度变化和外界温度的等式关系,最后利用最小二乘法设计程序,求出每一阶段的温度分布平差之后的结果,从而得到温度分布。 针对问题二,考虑在一小时内该系统温度变化,用时间限制与温度阈值限制作为约束条件的规划问题,沿用离散化分析手段,由假人体表温度逆推防护服第Ⅱ层厚度的表达式,建立其与外界温度的关系,并寻求满足条件下的最优解。 针对问题三,考虑在给定半小时时间内该系统温度变化,添加更多的约束条件,对问题二中的求解模型进行进一步优化,利用lingo寻找第Ⅱ、Ⅳ层厚度的最优解,并沿用前问中离散化分析手段,由假人体表温度逆推防护服相关设计参数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值