罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

接触者追踪能否帮助结束COVID-19封锁?

自3月份这一流行病成为一个全球性问题以来,我们一直感到满意MATLAB用户如何积极地为COVID-19相关的研发做出贡献.今天的嘉宾博主,古原竹内在全球抗击COVID-19的斗争中,我们关注一个令人感兴趣的领域。

内容

接触者追踪

当局正在探索逐步解除封锁的策略,接触者追踪正在成为一个可能的全面解决方案。接触者追踪已有150多年的历史,但随着时间的推移,它在应对不同类型的疫情和技术的可用性方面不断发展。我们是否也能在技术方面做出贡献?让我们来看看。

约翰·斯诺

约翰·斯诺博士也许是第一个发明接触追踪方式的人。在1854年霍乱在伦敦爆发,他用数据反驳了主流的“瘴气”(或“坏空气”)理论,找出了真正的原因,帮助结束了疫情。我们可以认为他是数据科学和流行病学的早期先驱。

以下是斯诺博士自己用笔和纸收集的数据(来源:罗宾的博客),用geoscatter

泵= choleraKML2Tbl(“pumps.kml”);霍乱;霍乱;“cholera_deaths.kml”);图geoscatter (cholera.Lat、cholera.Lon cholera.Deaths * 10,“填充”)举行geoscatter (pumps.Lat pumps.Lon,“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon),“红色”“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon), 40000年,“红色”)文本(pumps.Lat (1), pumps.Lon (1),《宽街水泵》)标题(《约翰·斯诺的霍乱地图,1854年伦敦》)传说(“死亡”“泵”“死亡中心”“位置”“东南”

统计霍乱死亡人数,并将其绘制成地图。蓝点的大小表示该地点的死亡人数。死亡发生在某些路线上,而不是像你预期的那样,如果是由瘴气引起的,死亡会覆盖整个地区。斯诺博士在他的地图中心找到了宽街的水泵,这让他怀疑供水系统可能是疾病的源头。最终,他说服了当地卫生委员会拆除了水泵的把手,这样人们就不能从水泵里喝水了,这就是他帮助结束疫情的原因。观看这个有趣的YouTube视频宽街水泵欲知详情。

注:用圆圈来模拟疾病的传播更适合瘴气理论。也许这应该被建模为一个网络问题,但我保持简单。

COVID-19和接触者追踪

由于位置数据是接触者追踪的关键组成部分,尤其是在东亚,使用移动应用程序对抗COVID-19.这个YouTube视频讲述了如何做到这一点得益于MERS疫情的教训,韩国能够通过积极的检测和接触者追踪来放松限制.虽然由于隐私问题或过早放松限制,人们对使用技术进行接触追踪提出了批评,但我们最终将不得不找到一条出路,我们应该探索所有的选择。

在美国,德克萨斯大学奥斯汀分校的研究人员使用移动数据来了解社交距离的效果通过跟踪杂货店和药店等零售地点的访问量,并将这些与死亡率联系起来。苹果公司和谷歌公司还在开发基于蓝牙技术的更好的隐私保护技术.他们使用蓝牙LE,通常在10米范围内工作,在相互接触的设备之间交换加密的标识符。这些钥匙可以保存14天。如果此类设备的所有者受到感染,则会通知其他设备的所有者。这很有趣,但是有没有一种方法可以让我们更好地感受这些数据是如何工作的呢?

Gowalla数据集

由于隐私问题,移动数据集并不广泛使用,但我发现Gowalla签入数据集其中包含一个现已停止运行的移动应用服务的匿名用户活动。该服务允许用户签到某个位置。这在本质上更接近德克萨斯大学奥斯汀分校(University of Texas at Austin)研究人员使用的零售数据集,而不是Apple/谷歌方法,但我们仍然可以从中学到一些东西。

由于这只是一个例子,我们将只使用2010年9月纽约市的数据子集。为了这个例子,让我们假设数据代表了封锁放松后人们的行为,我们选取用户578作为指标病例,诊断日期为2010年9月24日。

纽约市= loadNYCgowallaData(“Gowalla_totalCheckins.txt”);联系人= 578;%索引格诊断日期=日期时间(“2010-09-24”“时区”“美国/ New_York”);孵化器周期=天(14);contactDuration =分钟(15);%,基于签入时间maxDegreesOfSeparation = 2;%包括二次接触者

我只是随意选择了其他参数,但它们应该根据医疗当局制定的一些完善的协议来确定。

移动= cell(maxDegreesOfSeparation + 1,1);ii = 1:maxDegreesOfSeparation + 1 moves{ii} = getmoves (nyc,contacts,diagnosisDate,incubationPeriod,ii-1);contacts = findContacts(nyc,moves{ii},contactDuration);结束移动= vertcat(移动{:});移动= sortrows(移动,“类型”“下”);动作。类型= renamecats(移动。类型,“Degree0”“指数”);

现在让我们用a来可视化数据geodensityplot,强调人们需要避免的领域。

图colormapgeodensityplot (moves.Lat moves.Lon,“FaceColor”“插值函数”“半径”, 500)alphamap(正常化((1:64)。^ 0.2,“范围”标题))((“纽约Gowalla签到数据集”“578用户+直接联系人+二次联系人”])

这个数据集相当有限,但它仍然足以让我们理解一些实际的技术挑战。

  • 考虑到曼哈顿的人口密度,联系人的数量并不是很大,因为Gowalla并没有被广泛使用。为了有效地追踪联系人,这款应用必须被广泛采用。要确保它能提供足够的保护,最低采用率是多少?
  • 我们应该回去几天进行接触者追踪?我用了14天,因为这是潜伏期的标准。这也是苹果和谷歌计划使用的。
  • 通常情况下,只追踪与指示病例(一级分离)直接接触的人,但我们也可以定位他们的接触者。当警报发出时,应该包括谁?
  • 人们在14天内四处走动,参观很多地方(这张地图只显示了他们入住的地方)。是因为他们是Gowalla的用户吗?我们应该在放松限制的同时限制人们的流动数量吗?
  • 我们如何定义“接触”?我利用签到时间的临近来保持简单。蓝牙LE通常在10米范围内工作。疾控中心的指南是6英尺或2米。10米是不是太多了?苹果似乎还计划使用RSSI水平来估计距离。

测量距离很难

在使用RSSI测量距离方面,MathWorks英国团队取得了成功建立并演示了基于rfid的人员跟踪系统在几年前的MATLAB博览会上下面是平面图,显示了检测附近RFID标签并将数据传输到中央服务器的基站(蓝点)、餐饮区域周围的固定RFID标签(绿点)以及各自演示区域的固定RFID标签(橙点)的位置。与会者还带着移动RFID标签四处走动。

当分析从事件中收集到的数据时,我们遇到了一个问题——“我们最初假设我们可以使用信号强度来估计距离。然而,在现实中,信号强度波动很大,你无法用这种方法做出自信的估计。”我们最终找到了解决这个问题的方法,但这非常困难。

我们对8个基站x 25个固定RFID标签进行了距离测量,并在活动期间从这些组合中收集了RSSI数据。这是RSSI与距离的关系图。红线表示我们希望看到的一条假想的向下倾斜的线。正如你所看到的,在任何给定的距离上,RSSI波动很大,以至于没有办法在RSSI和距离之间推导出明确的相关性。我不能分享数据,但你可以读到它是如何在这篇文章

%距离范围0-35米disX = 0:35;%线性模型与噪声只是为了简单RSSI = -1.6 * disX + 90 + randn(1,length(disX));根据实际数据绘制线性模型plotExpoData (disX RSSI);

GPS呢?

也许用GPS更容易确定距离?我捕获GPS数据使用MATLAB移动在我家附近的公园里。与其分享我的数据,不如鼓励你分享使用自己的GPS数据从MATLAB移动,因为它是非常简单的

为了得到距离,我们需要知道我们测量的是哪些点——没有必要得到从未真正接触过的人之间的距离,因为他们在不同的时间处于同一点。这很容易时间表数组和使用函数同步

负载jpond.mat同步=同步(jpond.A (:, 1:2), jpond.B (:, 1:2),“联盟”“线性”);

然后你可以使用距离而且deg2km函数从映射的工具箱.得到距离。

Deg =距离(synchronized .latitude_1, synchronized .longitude,synched.latitude_2 synched.longitude_2);gpsDist = deg2km(deg)*1000;%由千米换算成米[minDist,minIdx] = min(gpsDist);

在下面的图中,你可以看到两个用户以相反的方向绕着池塘走,他们接触的时间,以及他们之间的距离。有两个点他们走得很近,但后者是最近的。比RSSI简单多了,但这正是为什么我们对使用GPS数据有隐私方面的担忧。

T =平铺布局(“流”);Nexttile ([2 1]) geoplot(synchronized .latitude_1, synchronized .longitude,“。”)举行geoplot (synched.latitude_2 synched.longitude_2,“。”) geoplot (synched.latitude_1 (minIdx) synched.longitude_1 (minIdx),“唵”)文本(synched.latitude_1 (minIdx) synched.longitude_1 (minIdx),“最低”“HorizontalAlignment”“正确”)标题(“路线”)传说(“一个”“B”“位置”“最佳”) nexttile plot(synchronized . timestamp, synchronized .latitude_1)保持情节(synched.Timestamp synched.latitude_2)情节(synched.Timestamp (minIdx) synched.latitude_2 (minIdx),“莫”)文本(synched.Timestamp (minIdx) synched.latitude_2 (minIdx),“最低”“HorizontalAlignment”“正确”)标题(“纬度x时间”nexttile plot(synchronized . timestamp, gpsddist)保持情节(synched.Timestamp (minIdx) gpsDist (minIdx),“莫”)文本(synched.Timestamp (minIdx) gpsDist (minIdx) + 80,“最低”“HorizontalAlignment”“正确”)标题(A与B之间的距离) ylabel (“米”)标题(t[组成(“基于gps的距离跟踪,最小距离%。2 f米”minDist);组成(最小距离%s的时间datestr (synched.Timestamp (minIdx)))))

行动呼吁

通过这个简短的调查,我希望我强调了接触追踪与数据科学的关系,以及MATLAB用户可以在哪些方面做出贡献。你还有其他我没提到的机会吗?也许你已经在处理其中的一些问题了?分享你的想法在这里

本地函数

函数tbl = choleraKML2Tbl(文件名)fileID = fopen(文件名);C = textscan(fileID,“% s”);文件关闭(文件标识);str = join(string(C{1}'));坐标= extractBetween(str,“< >坐标”" < / >坐标”);坐标=分裂(坐标,",");坐标= str2double(坐标);TBL =表;如果匹配(文件名,“pumps.kml”)类型=“泵”elseif匹配(文件名,“cholera_deaths.kml”)类型=“死亡”结束资源描述。类型= repmat(字符串(类型),大小(坐标,1),1);资源描述。Lat =坐标(:,2);资源描述。Lon =坐标(:,1);values = extractBetween(str,“< >价值”" < /值> ");如果~isempty(values) values = str2double(values);资源描述。死亡=价值;其他的资源描述。死亡人数= 0(身高(tbl),1);结束结束
函数data = loadNYCgowallaData(gowallaDataFile)如果存在(“nyc.mat”“文件”)加载nyc.mat纽约Data = nyc;其他的gowallaDataFile = detectImportOptions“文件类型”“delimitedtext”“TextType”“字符串”);选择。变量名= {“用户”“CheckinTime”“纬度”“朗”“LocationId”};gowalla = readtable(gowallaDataFile,opts);nycLim = [40.697,-74.079;40.819,-73.880];Nyc = gowalla(gowalla。Lat >= nycLim(1,1) &gowalla。Lat <= nycLim(2,1) & gowalla。Lon >= nycLim(1,2) &gowalla。Lon <= nycLim(2,2),:);纽约。CheckinTime = datetime(纽约市。CheckinTime,“InputFormat”“uuuu-MM-dd 'HH: mm: ssZ”“时区”“UTC”);nyc.CheckinTime.TimeZone =“美国/ New_York”;Data = nyc;结束结束
函数moves = getmoves (tbl,users,endDate,lookBackPeriod,degree) moves = cell(length(users),1);startDate = endDate - lookBackPeriod;Ii = 1:长度(用户)移动{Ii} = tbl(tbl.)用户==用户(ii) &资源描述。CheckinTime >= startDate &资源描述。CheckinTime <= endDate,:);结束移动= vertcat(移动{:});动作。类型= repmat(“度”+学历、身高(移动),1);动作。类型= categorical(moves.Type);结束
函数contacts = findContacts(tbl,运动,持续时间)spots =运动(:,{“LocationId”“CheckinTime”});斑点= sortrows(斑点,“CheckinTime”);users =唯一的(moves . user);Contacts = cell(height(spots),1);ii = 1:高度(斑点)startTime =斑点。checkintime (ii) -持续时间;endTime = spots.CheckinTime(ii) + duration;联系人{ii} = tbl(tbl。LocationId == spot .LocationId(ii) &资源描述。CheckinTime > startTime &资源描述。CheckinTime < endTime,:);结束联系人= vertcat(联系人{:});联系人=唯一的(contacts. user);联系人(ismember(联系人,用户))= [];结束
函数plotExpoData(x,y) s = load(“expo.mat”);Expo = s.expo;图绘制(expo.Demos.Distance expo.Demos.RSSI,“。”)举行情节(expo.Catering.Distance expo.Catering.RSSI,“。”)情节(x, y,“莫”)举行包含(“距离”) ylabel (“RSSI”)标题(“基站vs.固定标签(演示+餐饮)”)传说(“演示站”“餐饮站”“我们想看的东西”)文本(5,10,“RSSI与8个碱基x 25个锚的距离”结束




发布与MATLAB®R2020a


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map