精华内容
下载资源
问答
  • 行业分类-机械工程-种带有循环自净功能的组合空气处理机组.zip
  • 被褥热阻作为睡眠热舒适性方程个重要变量,会受被子结构、材料、空气渗透率和被子组合层序等主观因素影响,同时也会受到睡眠环境的风速、空气湿度、空气层间隙等客观因素的影响.本文通过分析被子覆盖层序、...
  • 社交媒体、交通流量、气象、地理等多种大数据如何组合起来解决交通拥堵、环境恶化、能耗增加等城市问题? 微软亚洲研究院“城市计算”领域负责...在这计算我们还发现个有趣的现象,就是真正的高端房子有没有地铁...

    https://mp.weixin.qq.com/s?__biz=MjM5MTQzNzU2NA==&mid=2651649170&idx=1&sn=f6437a3a2de4df6e5b5e0de516d8c5ab&chksm=bd4dd3018a3a5a17220d76489ec1e9cc4d61cec7a4aebf3bc1e405a675a6d5fb17e6b997b275&mpshare=1&scene=1&srcid=0331LV9ryUsyyH14LRImsdqq&pass_ticket=2NEKTuHsI9C5PXqoagjawgqTter5xDBwzr4I8HOY%2BcO4j1706riba14MuB%2BVHavK#rd

     

    城市中人工智能如何发挥作用?社交媒体、交通流量、气象、地理等多种大数据如何组合起来解决交通拥堵、环境恶化、能耗增加等城市问题?

     

    微软亚洲研究院“城市计算”领域负责人郑宇博士近期在清华大数据讲座上分享了题为“大数据驱动城市计算”的讲座,本文整理了相关演讲内容和视频。

     

    2013年郑宇被《MIT科技评论评》评为全球杰出青年创新者,并作为现代创新者代表登上了《时代》周刊,2016年被评为美国计算机学会杰出科学家(ACM Distinguished Scientist)。郑宇主持研发的Urban Air首次利用大数据来监测和预报细粒度空气质量,该服务覆盖了中国的300多个城市,并被中国环境保护部采用。2016年,他主持了城市大数据平台的设计和实施,并成功在中国大数据示范基地贵阳市部署。

    ——”

     

    报告视频时长60分钟,建议在WiFi环境下观看。

    暂时无法观看视频的读者,我们将演讲内容配合PPT整理如下,可先睹为快。

     


     

     

    演讲正文:

     

    今天与大家分享我们在城市计算领域的进展,并围绕城市中人工智能如何发挥作用、大数据如何解决难题展开讨论。

     

    现代化的生活带来了交通拥堵、环境恶化、能耗增加等问题。要解决这些问题,以前因为城市的复杂设置而几乎不可能。现在由于各种传感器技术的成熟以及云计算单位的成熟,我们有了社交媒体、交通流量、气象、地理等多种大数据。通过组合这些数据,我们就能发现问题,并进一步解决。基于这样的机遇,我们在2008年提出了城市计算的愿景。它包括以下四个层面。

     

     

    城市计算的四个层面的愿景

     

     

    从最下面的城市数据的感知和获取到城市数据的管理,到城市数据的分析和挖掘再到服务和提供。这四个层面连成一个环路,不断地、自动地在不干扰人生活的情况下,用大数据解决城市的大挑战。今天,我带着大家把每个层面简单梳理一下。

     

    首先,城市数据的感知基本上可以分为两大方法:一类以人为中心的感知,一类是以传感器为中心的感知。以传感器为中心的感知可以进一步细分为固定感知和移动感知。不管哪一种方法,部署传感器以后,人都不参与数据的收集,数据会自动传到后台。而以人为中心的感知则是每个人作为一个传感器去感知他周边的信息,然后汇聚在一起,来整体解决一些问题。

     

    这里面分成被动方法和主动方法。被动是指我们在不知情的情况下被收集的数据。比如打电话的记录可以用来改善蜂窝网的通信质量,上下车的刷卡记录可以改进城市规划。主动式参与感知是指我们清楚什么样的数据,在何时、何地、以何目的而贡献的。我们可以有选择的参加或退出,有时还有激励机制。

     

    在城市感知环节我们还会遇到来自四个方面的挑战。

    第一,我们拿到的数据往往只是一个采样。

     

    某些属性在这个采样上的分布跟它在整体数据上的分布有很大差异。比如我们可以拿到一些出租车的GPS轨迹,但不能估计出整个城市里面所有的车流量。不能因为采样里的出租车跟私家车的比例是一比五,就用出租车乘以五得出城市里私家车数量,因为在某些路段上有很多出租车却没有什么私家车,反过来同理。我们的采样很多时候存在偏差,怎样在有偏差的数据里面把真实的信息反应出来,这是一个难点。

    第二,我们往往只有有限的传感器采集有限的数据。

     

    比如在北京我们只有35个空气质量检测站点,无法根据这35个站点的数据把整个城市的信息估计出来,这就是稀疏数据的问题。

    第三,我们有数据缺失的问题。通信故障或者传感器故障都会导致数据缺失。

     

    第四,我们需要用有限的资源获取更多的数据。

     

    这个问题的难点第一在于很难从众多候选集中选出我们需要的数据。举个例子,假设我们要在北京布几个充电桩,在哪些路口布充电桩可以使服务的人数最大化?第二在于好或不好很难判定。比如说现在北京要布四个新的空气质量检测站点。布这个站点之前你并不知道这个地方空气质量如何,所以你无法判断对整个城市空气质量检测效果是好还是坏。这四个方面构成了城市计算在感知层面的挑战。

     

    大数据和人工智能优化救护车抢救系统

     

    下面看一下我们用大数据和人工智能的方法优化的救护车抢救系统。我们联络急救中心,急救中心派出救护车,将病人送到医院,再返回救护车站。因为医疗救护系统跟医院不是一个体系,也因为我们要求任何一个用户的急救电话都能在规定时间内响应,所以救护车站点要分布在不同地方,也不能都在医院里面。

     

    上面这个是天津市以前的救护车站布局图,每个三角形表示一个救护车站点。以前选站点基本就是根据一些人口数量或者道路房屋密度决定的。但是人的急救需求的影响因素是复杂的。现在我们可以根据真实的120求救信号数据和救护车抢救病人的GPS轨迹等数据对站点进行重新布局来优化平均抢救时间,就可以救更多的病人。另外车辆如何在各个站点之间动态调度,使得系统运力最大化是我们第二步解决的问题。就是要找到一个使得很多人到此的汇聚时间最优化的点。不仅选址救护车站是这个问题,所有以速度优先级最高的应用都可以考虑这个选址模型。

     

    城市数据管理

     

     

    看完城市感知以后我们看一下城市数据管理。数据管理要注意三个因素。第一,我们是时空数据而非一般的文本。第二,我们要用增强型的云平台管理。第三,我们要设计合理的索引算法和查询算法。城市中所有数据根据数据结构可分为两种:点数据与网络结构数据。另外根据每种数据关联的时空属性可以分成三类。因此共六种数据,我给大家一一解释一下。

     

    点数据中,一旦建成后任何属性都不会变动的是空间和时间都静态的点数据。位置不变,但是每个小时的读数不断变化的是空间不变但是时间属性在不停变化的数据。在摩拜单车里面,不同时间有不同的人在不同地方发出请求,这就是一个时空多变的数据。网络结构中,路网就是一个静态的网络结构。把路网叠加了交通流量信息以后就变成空间不变时间变化的数据。最复杂的是轨迹数据,时间和空间都在变,并且点和点之间有连续的关系。

     

    定义好这六种数据结构模型以后,我们就可以针对特定的模型设计特定的算法,提高系统的利用率。

     

    讲完数据以后讲平台。

     

    一方面,城市数据涉及到异构、多模、多源这三个领域。多源是说这个数据来自于不同领域。异构是指数据有的是结构化的有的是非结构化的。多模是说它有文本视频和语音。另一方面,我们是给整个城市提供服务,对整个城域做推断、预测,这个运算量非常大,而且要求实时。所以数据和我们的应用之间有个GAP,就需要一个平台来桥接推这个GAP(间隙)。

     

    很遗憾现在任何一家公司的云计算平台都不能很好地支持我们的时空大数据。一是因为时空数据的结构与一般数据不一样。比如一个轨迹在车开的过程中长度不停增加,而两个点的顺序是不能任意交换的。

     

    二是我们查询时空数据的方式也不一样。在文本查询中会根据给出的关键词进行检索。但是在时空数据查询里面,通常是查询一个空间范围加时间范围,这种查询方法在我们的云计算平台里面都不能很好地直接支持。

     

    三是我们真正做城市计算的时候绝对不是只用一种数据。需要把多种数据做融合。这就提出了做混合式索引的需求来支持上面的分析和挖掘。

    讲完这个以后,大家可以理解为什么智慧城市、云计算很难落地。其实云计算平台并不是我们说的城市大数据平台,它不能很好地支持这些因素。基于这样的挑战,我们在贵阳市设计和落地了第一个真正的城市大数据平台。它首先定义了六种数据模型,然后利用了已有的微软的云计算平台的存储资源。接着我们做了一层中间件,针对不同的数据结构设计了时空索引算法,并针对不同数据设计了混合式索引算法。然后把时空索引集成到hadoop、Spark和Storm等分布式计算环境中。

     

    这里面不光有分布式计算环境,也有时空索引算法,两者的结合把数据的访问和管理存储变得非常高效。最后向上层的机器学习和人工智能算法提供API,使得我们的机器学习算法能够快速访问下面的一些数据。想象一下,如果没有这一层的话很多机器学习算法根本不能上线,根本不能做大规模的访问和应用。

     

    给大家讲一个真实的例子。

     

    在贵阳市我们根据大规模的出租车GPS轨迹来为充电桩做选址设计。假设我们希望在某个范围之内建五个充电桩,我们应该放在哪五个路口使得覆盖的不重复的出租车的GPS轨迹数量最大化。以前这样一个复杂度非常高的计算量需要花5个小时到一天左右。现在很快可以算出来。追求高效是因为我们知道真正做充电桩选址的时候绝对不是覆盖的人群最大化就可以了,还要看这个地方是不是别的条件都满足。如果这个地方不合理的话,便由专家将其删掉,或者进行补充。然后我们的算法回去再算,就变成了一个迭代式的交互挖掘。

     

    现在机器学习已经变成了人机学习,通过这样的途径可以把专家的知识、行业知识跟数据科学结合在一起。而要交互的话就不能太慢,不然没有人愿意跟这样的系统进行交互。通过刚才讲的那种把分布式计算环境跟索引方法结合在一起的平台,可以使算法完成时间从几个小时变成几秒钟,这就是平台强大的力量。

     

    这也是一个通用的选址模型。比如你们在城市里面经常看到很多大广告牌立在马路旁边,它们应该放在什么位置使得覆盖的群体最大化、广告效益最好,是同样的问题。银行选址,银行的自动取款机也是这一类的问题。这些问题都涉及到行业知识和数据科学的交互,涉及到人工智能里面Maximum k-coverage的问题,也需要通过交互可视分析的方法来完成。

     

     

    数据分析和挖掘

     

     

    讲完了数据管理层面,我们看一下数据分析和挖掘,这也是今天的重点。我们在城市数据分析层面会遇到四个方面的挑战

     

    第一个方面,我们以前很多做机器学习的人,他们提出算法的时候往往都是在video、graphic、text中,现在要把这些算法adapt到时空数据上来。如何将它转换过来是一个难点。

     

    第二个方面,在于多元数据的融合。以前做数据挖掘的时候,往往只是挖掘单一数据。现在我们发现做一个应用需要把多个数据的知识融合在一起。这是一个新的难点,我认为也是大数据里面,相对来说比那个“大”更加有意思更加难的问题。

     

    第三个方面,我们以前做database和machine learning的人是两拨人,相互之间的交集比较少。但是只有将data base 以及machine learning的方法有机地融合在一起,做得又快又好才能把系统落地。

     

    第四个难点,以前做挖掘的时候往往是一个单向过程,就是简单静态挖掘。现在变成了交互可视挖掘,英文叫做interactive visual data analytics,就是交互可视分析。刚才所讲就是一个例子,把人带进去交互可视,人机交互,把人的智能也融合进去。

     

    上面是逻辑的框架,再回到实际平台。

     

    我们定义了平台的下半部分,中间是一个分布式系统加上我们的时空索引方法,再往上还有中间数据分析的层面。这里面分成三个子层面。第一个是大家熟知的最简单的一些机器学习算法,包括线性回归这些最普通的方法。再往上我们构造了一些专门针对时空数据的机器学习算法。再往上我们还设计了时空数据融合的方法,尤其是后面会重点讲到的多元数据融合方法。

     

    多元数据融合的方法按照已有的工作可以分成三大类。第一类是阶段性的方法,先用一种数据再用一种数据。第二个是基于特征拼接的方法。我们所熟知的深度学习方法,还有传统的特征串联加上一些正则化方法,都是属于这里面的分支。相对于第二个方法来说,第三类是基于语义信息融合的方法。这里面包括了多视角、基于概率学模型的方法、基于相似度的方法、以及迁移学习的方法。在这一方法里面我们要搞清楚每一纬特征是什么含义,以及特征和特征之间的关联关系、它们的语义信息。在做特征融合的时候则不必。另外这方法是根据人的思维方式设计的类人思考的方法。所以说是基于语义信息的方法。

     

    先讲一个房价的例子来说明这种方法。

     

    这里面我不去预测房屋的价格,而去预测高价值的房子,也就是涨的时候涨得更快,跌得时候跌得更少。同样一个环境里面我们摒弃自然因素和政策因素,房屋的涨幅除以它的基数就是涨幅比,然后按照涨幅比排序。根据这个值做一个量化把北京的房子分成五等。

     

    可以看到有时候一类房和五类房隔得很近。所以房屋的价值是由什么决定的?

     

    李嘉诚说过,房屋的价值第一看地段,第二看地段,第三还看地段。

     

    这个地段其实可以用数据量化。第一个地段就是周边的各类设施水平,这个可以通过POI和路网数据得到。但同样是学区,好学区和坏学区对房子价值拉动有明显区别。

     

    所以还要看第二个数据:popularity。这里面我们又参考了好几个数据。比如社交媒体上对这个地方的点评,以及人们出行的规律等。人们的出行规律一般是不能说谎的,这往往反映了地域的价值。第三个地段,就是你所在的商圈。比如你在望京的话,对你的房子有拉动作用,但并不是望京所有的房子都好,还要看前面两个因素。所以第一个地段、第二个地段、第三个地段可以用六到七种数据量化。

     

    我们可以从每一种数据里面都抽取特征,再进行计算。对于这些特征,以前的方法是简单拼成一个向量然后做一些回归。比如说最简单的方法是做线性回归,欧米伽是系数,X是向量,后面是误差。这种方法不是很有效,因为特征之间不是完全独立的。

     

    因此我们又加了两个约束。

     

    第一个约束是加上pair-wised constrain,把它变成一个Learing to rank的问题,即排序学习。我们不光希望每个房子单独预测要准,还希望两个房子之间的顺序不要搞错,这在机器学习里面叫排序学习。这边简单用两个房屋的涨幅比做差,再通过一个Sigmoid函数变换到(0,1)之间的数值。如果A真的排在B前面的话,那么A本身应该涨得比B多,那么它减出来的值是正的,函数的话是这样值通过Sigmoid函数作用后,输出值比较大,而且越大越接近于1,相当于对正确排序的一个加分。反之,如果A排在B的前面,但B的单点预测值却大于了A,那么A-B的预测结果就是负值,通过Sigmoid函数变换后,就会产生一个小值,而且越小越趋近于零。相当于对错误排序的一个惩罚。

     

    第二个约束,我们对欧米伽有约束。我们刚才说很多欧米伽可能是冗余的,就是这个特征可能是不发挥作用的,我们希望这些冗余的特征权重特别小,所以对欧米伽加上约束,是希望它的欧米伽分布符合均值为零且方差非常小的高斯分布,这样大部分欧米伽在零的附近,我们也允许个别的欧米伽以比较小的概率取得比较大的权重。在这一计算中我们还发现一个有趣的现象,就是真正的高端房子有没有地铁不在乎,但是希望交通很便利开车上下班。这个东西怎么验证呢?我们用2013和2014年的数据做学习来训练模型,然后我们预测2014年房屋涨幅排序,等到2014年结束以后我们就可以知道这个结果对不对。

    接下来介绍第二个方法,涉及到深度学习。

     

    听到深度学习的话题后以后很多媒体都来找我们,因为这个项目也是深度学习在时空数据上第一个真正在顶尖国际会议上发表的工作。我们把城市分成均匀的网格,可以预测每个格子所对应的区域中未来会有多少人进和出。可以想象这是一个非常通用的模型。它包括预测区域内出租车的进出;包括预测有多少人需求摩拜单车;包括预测未来有多少人在这个区域里面会点餐;包括预测到未来多少人要送快递。这个模型做完以后可以满足很多应用。最开始做这个工作是因为上海的踩踏事件。事后第一时间我发了微博,说这个安全问题可以由大数据和人工智能的方法做一些分析和预测,做到提前分流,甚至能做到在人们的起点就告诉他你不要去了。

     

    我发了微博以后,网上的舆论分成两派,一部分说很好这个确实是可以做的,也有一部分认为我都知道晚上肯定很多人会去了,根本不需要你预测。同样政府肯定是知道有很多人去的,所以它会加派警力。但是政府不知道“多”的程度,也无法知道人群的数量达到峰值的具体时间。而要知道什么时候是高峰点,每个单位时间进出是多少

    才能做决策。所以这些是政府真正需要的。

     

     

    北京市地铁站也有这个需求,它希望做到对人流的预知和把握。这个不仅关系到列车调度,也关系到人民的生命安全。这个模型在贵阳市已经实施了。贵阳市划分成一公里乘一公里的格子,我们去预测每个格子里面未来会有多少出租车进和出。这里面绿色的是预测的,黑色的是过去的值,蓝色的是昨天同一时刻对应的值。人流预测是非常困难的事情,因为这个区域过去一个小时多少人进出,周边有多少人进出,还有很远地方的人的进出都会影响到这个区域未来有多少人进出。这跨领域的研究是很缺失的。另外,天气和事件也是影响因素。

    这里强调一点,我们做的是时空数据,它跟视频、图象、语音是不同的。这也导致传统的深度学习模型不能直接拿来用。首先,时空数据有空间属性,包括两方面,一个叫空间的距离,一个叫空间的层次。所谓空间距离,根据地理学第一定律很容易理解。另外空间有层次。比如一个城市包括几个区,几个区包括几个街道,每个层次都有特别的语义信息。不像象素里面,虽然有四个象素合并成一个象素,但在四个象素合并成一个象素的时候并没有明确的语义信息。

     

    第二个,时间属性。有三个方面的不一样。第一,时间有平滑性,就是这个小时的交通量跟上个小时的比较接近。

     

    第二,时空数据有周期性,交通流量、人群流量都会有周期。这种周期性在视频、语音和文本里面都没有。比如说今天早上八点钟的交通流量可能跟昨天早上八点钟的交通流量很像,但跟今天中午12点钟的交通流量就很不像,隔得远的反而像,这打破了第一点的约束,导致很多算法不能应用。

     

    第三,趋势性。周期绝对不是固定的。随着天亮的时间越来越早,大家出门的时间也越来越早,因此早高峰来临的时间越来越早。早高峰来得时间会有一个趋势性的上扬的过程,这个趋势、周期是很特别的,所以空间加时间这些因素导致了时空数据跟普通的文本、视频不同。我们把城市分成均匀的网格,然后把过去和实时收到的车子GPS轨迹信息投影到网格里面,去计算每个格子里面多少人进出,将其转化成一个矩阵,矩阵中每个单位是一个二元组,进和出,相当于每个象素有RGB一样,它就变成了一个二维的热力图,越红的地方人越多。如果我们有很多不同时间的数据就构成了这样一个像视频流的strain,并且加上事件和天气信息。这是数据的输入。

     

     

    数据的应用

     

     

    数据的应用,则是首先把相邻几个小时的数据放到一个深度卷积神经网络里面,来模拟相邻时间的时序的平滑性。然后把几天内一时刻对应的数据输入到一个相同结构的深度卷积神经网络里面,来模拟周期性。再把更大时间范围内同一时间点对应的数据做一个输入,来模拟趋势性。然后这三个数据先做一个融合,融合的时候引入权重系数,因为三个因素的输出结果并不是在每个地方都一样。比如有的地方周期性特别强,像这种主干道。有的地方周期性不是那么强,它的时间临近性就比较重要。

     

    其次需要考虑外部的因素,比如气象事件。把这些数据融合以后,我们去反馈学习下一帧的数据,所以我们要预测下一帧这个时刻的状况。它是一个整体预测,不是分开预测。因为格子和格子之间一定有相关性,我们是同时一下预测出来每个区域有多少人进出。另外是抓住了时空的属性。时间临近性、周期性、趋势性都被抓住了,然后在内部通过深度卷积网络抓取空间性。卷积网络通过一次卷积可以把一个区域的值卷积到一个点上面,描述近距离的空间的局部相关性。经过多次卷积以后可以把越来越远的地方卷积到一起,描述距离较远的空间的相关性。当深度卷积网络比较深的时候它的训练效果就变得很差。

     

    为了解决这一问题,我们引入深度残差神经网络,整个架构称为时空残差网络。这个比较新的模型相对于以前LSTM的模型,不需要进行连续的数据输入,只需要抽取关键帧。这样的结构大大优化了网络结构,只需要用几十帧就达到原先的模型里几百帧、几千帧的效果,甚至更好。这种深度时空残差网络,在人口流动的预测上有很大的应用前景。

     

     

    下面看一下空气问题。现在环境问题非常严重,这与每个人都相关。政府建了很多的空气质量监测站点在城市里面。然而因为成本问题,子站不能无限量放置。并且城市大范围内空气质量非常不均匀。

    这是一个真实数据的回放,每一个图标表示一个真实的站点。上面的数字是AQI污染指数,可以看到同一时刻不同地方的空气质量读数差别非常大,有时候只差一两个街区读数可以差几百。因为空气污染指数是由很多复杂因素决定的,包括地面交通流量、周边是不是有厂矿、周边的扩散条件等。这些因素在城市里面都是非线性、非均匀变化的,所以整个城市的空气质量不可能是均匀的。也就是说,如果这个地方没有建空气站点,测出污染指数,因为污染指数不可能通过周边几个站点做一个线性差,它是非线性的,所以差别会变得很大。

     

    所以我们用大数据的方法来做实时细粒度空气质量分析。实时是每个小时做一次,细粒度是一公里乘一公里范围这么细的状况。用了两部分大数据,一部分是已有站点的实时和历史空气质量读数,另外一部分分为五个数据源,包括气象比如风速、风向、湿度,以及车的平均速度、速度方差,人的移动性,单位时间多少人进出,区域的POI的数目,有多少酒吧、多少餐饮、多少厂矿以及房屋的密度,以及道路结构有多少高速路多少红绿灯路口等。然后采用机器学习算法来建立一个地方空气质量跟这个地方周边对应的这些数据的关系。

     

    在模型建好以后便以这个模型推断其他地方的空气质量。即便这个地方没有建

    站点,因为这些数据在城市里已经全部有了,不需要额外建任何传感器。

     

    这是一个真实的系统,现在已经部署在环保部内部系统供300多个城市使用。我们可以看到把京津冀、长三角、珠三角、东北、华东分成片区大范围地、细粒度的推断。之所以要做大范围,因为有时候光看北京是看不出问题来的。这种情况需要知道每次空气质量从好到坏的过程中区域的先后顺序,所以国家要求做到细粒度,甚至希望结果做得更细到500米。通过这个例子可以看出,大数据落地要跟行业结合。

     

    这里面每个白圈是政府已有的站点,该区域的空气质量是已知的,蓝色圈是要预测的地方的空气质量是多少,是未知的。平行四边形表示时间点。首先一个地方的空气质量有时序相关性,用纵向的箭头表示,也就是说如果这个小时空气质量不好会影响到下个小时空气质量。第二,不同地方的空气质量有空间相关性,用红色箭头表示,因为污染物会传播飘散。一个好的空气质量模型一定能够同时对一个地方的空气质量的时序相关性以及不同地方的空气质量的空间相关性进行建模。

     

    这里有一个空间分类器和时间分类器。空间分类器可以通过周边的值来计算中心值,而时序预测则根据它自己的读数预测它未来的数值。因为污染物的来源有三:一是外部进入,二是本地排放,三是外部进入的污染物和本地排放在一定的环境因素下面发生了二次化学污染。这三个因素相当于上面提到的空间相关性、时序相关性以及它们两个时空分类器的一个迭代学习的过程。

     

    从污染物成因的角度讲,因为有空间传播和本地排放,所以既要有行业知识也要有数据科学知识,完美结合以后才能定制一个模型让两方面的人都认可。污染物有物理传播过程也有化学过程,原来的方法单一的物理过程或者单一的化学过程都不能解决问题。现在通过数据分析的方法同时考虑到物理过程和化学过程以及它们之间的交互,所以能够把这个问题解决得很好。这个工作在2013年发表论文以后,2015年在环保部落地。

     

     

    2015年以后我们又做了新的预测未来的工作。按照环保部里的要求是三步走,第一是搞清现状,第二是预测未来。所谓预测未来是知道每个站点未来48小时在不同时间区间里面的预测。这是一个空间细粒度加时间细粒度的预测。不同于预测明天北京有雾霾或者没有雾霾,这个很容易做。第一,雾霾是种天气状况,而不是一个空气质量。只是因为雾霾导致了空气污染物不利于扩散,所以才会出现空气质量变差。当然空气质量还取决于很多别的因素。所以我们做的空气质量预测比雾霾预测要难。

     

    第二个是粒度要细。不是说大范围的整个北京明天大概多少,而是说到某一个站点怎么样。细到这个粒度在空间和时间上都非常难做。

     

    另外,在空气污染物中有一个拐点,就是当出现极端天气状况的时候,空气污染指数可能会从500瞬间变成50。这个拐点是一个小样本事件,因而预测非常困难。而拐点会直接影响到国家的决策。比如APEC期间为保证空气质量,要以北京为圆心关闭一个圈里面所有的工厂,造成的损失可能上百亿。若知道明天是拐点,就可以避免损失。我们要做的一是能够做空气质量预测,第二能够做时空细粒度的预测,第三能够做拐点的预测。现在全国300多个城市都已经用上我们的工作成果,跟环保部的二期已经签完,现在已经部署。

     

    最后一个工作,跟我们的交通、环境、规划、人员都有关系。是对整个城市里面每条路上的速度、流量、油耗以及尾气排放进行实时计算。排放包括PM2.6、PM10、二氧化氮、二氧化硫,一部分GPS轨迹做输入,这边用的是贵阳市的出租车做输入,再加上POI路网还有天气,所以还是一个多元数据融合的问题。

     

    下面展示一个真实的系统(见上图)。这个是在贵阳市落地的真实的全国交通流量图。关于流量可以通过一个问题去理解:交通流量比较大的时候速度是快还是慢?如果一个地方都堵死了,单位时间内每辆车都过不去,那流量是趋近与零的。流量大一定是速度快密度也不小的时候才能形成交通流量大。交通管控以及算油耗、算排放等很多事情都是基于流量来做的,规划也是基于流量做的。所以贵阳市落地了中国第一个交通流量图。

     

    根据流量图后面可以算实时,每个路段上面车的PM2.5排放量是多少。有了这个数据以后再把车的排量量跟空气质量监测站点的读数结合在一起就可以更加准确地分析出车的尾气排放到底在空气中PM2.5的占比是多少。这个系统在贵阳商用化了。所以说大数据是能够做到既推动社会的进步,学术价值也能够被认可,最后还能获得收入,是三赢的。

     

    最后跟大家分享一个观念。什么是数据科学家?很多公司招聘数据科学家其实都不是招真正的数据科学家,而是数据分析师。数据分析师是什么概念?他有明确的任务,数据明确、任务明确、结果也明确,他会用一些工具去跑一些报表,然后提交结果。

     

     

    数据科学家完全不一样。一个很简单的例子,银行发信用卡,我们有用户提交的表格,上面有各种信息,我们拿个人的信用记录去训练一个模型然后做分配器,决定是否发信用卡。这就是数据分析师。

     

    最近北京市建副中心在通州,政府需要知道北京的政府搬到通州以后对北京整个的经济、环境、交通有什么影响。没有具体问题也没有具体数据,这就是数据科学家应该解决的问题。而这还是比较好的情况,多半的时候我们跟政府谈政府不知道要干什么,所以数据科学家要自己找题目。所以最高境界的数据科学家甚至要自己想好。先做出模型,政府觉得好就会实施。

     

    所以,数据科学家首先要懂得行业问题,比如说他要知道雾霾跟什么因素相关,从别人的方法里面怎么吸取经验来定义模式设计特征,也从别人的方法中吸取教训,还要知道怎么去跟行业的人沟通。要知己知彼百战不殆。

     

    第二,在你知道这个行业问题之后,你要知道用什么数据解决这个问题,要懂得数据背后的隐含信息。比如说路面上出租车的GPS轨迹不光反映了路面的交通流量信息和速度,它也反映了人们的出行规律,人们的出行规律进一步反映了这个地方的经济环境和社会功能。只有经过这样的关联和联想才能把领域A的数据拿来解决领域B的问题。你会发现在大数据时代我们真的不再缺数据了,缺的是我们的思维不够开放。只有你的思维够开放、对这个问题理解够深刻以后才能把别的数据背后的知识拿过来做融合,这个很关键。

     

    第三,你要对各种模型都很清楚,要懂得把它们组合在一起。还要对云计算平台有一定的了解。好的数据科学家是站在云平台上面看问题、想数据、关联模型,把这些模型有机组合起来部署到云平台上面,产生鲜活的知识,解决行业问题,这个才是大数据。

     

    要做到这三点才是大数据科学家。很多时候项目推动不了不是人数不够,而是因为缺乏中间灵魂的头脑。培养这样的人其实是非常困难的。以我个人的经验至少七到十年才能培养出这样一个可以解决很多问题的真正的数据科学家来。所以我鼓励大家,你至少读一个五年PHD加两年的实战经验,基本上可以来做这样的事情。

     

     

     

    总结

     

    今天我们在数据科学院还是要讲讲大数据。大数据在我看来是一种从数据的采集、管理、分析、挖掘到可视化这种端到端的服务,解决行业的一种能力。它需要平台的支撑,也需要各种算法,包括数据管理和挖掘分析算法、机器学习算法,还有行业知识,跟行业结合。最后我相信,人工智能在我们的城市领域在我们的时空大数据领域还大有作为,谢谢大家。

    展开全文
  • 老师课上讲的聚合、组合、依赖很懵逼,那只有查查资料。 下面我就根据下面这个图来讲解一下UML类图。 类图 首先,看动物那个矩形框,他就表示为个类(Class)。类图分为三层: 第层显示类的名称 如果是...

    下面我就根据下面这个图来讲解一下UML类图。

    这里写图片描述


    类图

    首先,看动物那个矩形框,他就表示为一个类(Class)。类图分为三层:

    • 第一层显示类的名称
      • 如果是抽象类,就用斜体表示
    • 第二层显示类的特性,通常是字段和属性。
    • 第三层是类的操作,通常是方法和行为。
      • +表示为public
      • -表示为private
      • #表示为protected

    接口图

    典型代表是:

    • 左下角的飞翔接口图
      • 与类图的区别主要是顶端有<<interface>>
      • 第一行表示为接口名称
      • 第二行表示为接口方法
    • 正下方的唐老鸭方框右上方类似于棒棒糖的东西
      • 这种表示方法称为棒棒糖表示法
      • 圆圈旁为接口名称。
      • 接口方法在实现类中出现。

    类与类、类与接口之间的关系

    1、继承关系

    鸟继承动物,大雁、鸭、企鹅继承鸟。

    继承关系空心三角形+实线来表示。

    箭头指向父类。

    public abstract class 动物{
    
    }
    public classextends 动物{}
    public class 大雁 extends 鸟{}
    public classextends 鸟{}
    public class 企鹅 extends 鸟{}

    2、实现接口

    大雁会飞翔,所以大雁这个类实现了飞翔这个接口。

    实现接口空心三角形+虚线来表示。

    箭头指向接口。

    interface 飞翔{
        void 飞();
    }
    public class 大雁 implements 飞翔{
    
    }

    3、聚合和组合关系

    这两种关系有这本质上的区别:

    • 聚合

      • 很多大雁聚在一起变成雁群,也可以说雁群里有雁,所以是整体和个体之间的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期。即雁群可以不存在了,但是孤雁仍然存在。

      • 空心的菱形+实线箭头表示

      • public class 雁群{
        private 大雁[] 大雁数组名
        }
    • 组合

      • 一只鸟由两个翅膀组合而成,它体现的是contains-a关系,这种关系比聚合更强,也称为强聚合。他同样体现的是整体与部分间的关系,但此时整体和部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如这只鸟死了,自然这两个翅膀也不存在了。

      • 实心的菱形+实线箭头表示

      • public class 鸟{
        private 翅膀 wing;
        public 鸟(){
            wing = new 翅膀();
        }
        }
      • -

    这两种关系对比着就很好理解。


    4、关联

    企鹅和气候有关联,企鹅需要“知道”气候的变化,需要“了解”气候规律,关联是最常见的关系,当一个类“知道”另一个类时,可以用关联

    表示形式:实线箭头

    代码表示:

    public class 企鹅{
        private Climate 气候;
    }

    5、依赖

    凡是动物,生存都需要水和空气,这种必须的需求,我们称之为依赖关系。

    表示形式:虚线箭头

    代码表示:

    public abstract class 动物{
        public 生存(Water 水,Oxygen 空气);
    } 

    最后谈谈它们的作用

    UML类图在实际开发中非常常见,一般项目经理或产品经理根据实际业务来确定开发中需要的类以及类的结构。

    (以UML类图的形式表现出来),可能有人会说为什么搞这么麻烦,

    因为确定好类图不是一个简单的工作,他需要考虑很多事情,当然也会用到很多设计模式。

    只有这样,程序员开发出来的程序才有更好的健壮性易扩展性

    展开全文
  • 本篇文章对UML的6大关系(关联、依赖、聚合、组合、泛化、实现)做出了详细的讲解,利用图文并行的方式使我们更能深刻的理解。 大话设计模式上的个图,我用EA画出来的:   UML的6大关系相关英文及音标: ...

    本篇文章对UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)做出了详细的讲解,利用图文并行的方式使我们更能深刻的理解。

    大话设计模式上的一个图,我用EA画出来的:
     大话设计模式类图

    UML中的6大关系相关英文及音标:

     依赖关系

     

    dependency

     

    [di'pendənsi]
     关联关系

     

    association

     

     [ə,səuʃi'eiʃən]
     聚合关系

     

    aggregation

     

     [ˌægrɪˈgeɪʃən]
     组合关系 composition  [,kɔmpə'ziʃən]
     实现

     

    realization

     

     [,ri:əlɪ'zeɪʃən]
     泛化

     

    generalization

     

     [,dʒenərəlɪ'zeɪʃən]

     

     

    UML中的6大关系简单解释:

    1. 关联:连接模型元素及链接实例,用一条实线来表示;
    2. 依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;
    3. 聚合:表示整体与部分的关系,用一条实线加空心菱形来表示;
    4. 组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;
    5. 泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示;
    6. 实现:表示类与接口的关系,用一条虚线加空心箭头来表示;

    注意:泛化关系和实现关系又统称为一般关系;
    总之:一般关系表现为继承或实现(is a),关联关系、聚合关系、合成/组合关系表现为成员变量(has a),依赖关系表现为函数中的参数(use a);

    转自:http://www.cnblogs.com/ForEverKissing/archive/2007/12/13/993818.html

    UML中的6大关系详细说明:

    1、关联关系:
      含义:类与类之间的连结,关联关系使一个类知道另外一个类的属性和方法;通常含有“知道”,“了解”的含义
    体现:在C#中,关联关系是通过成员变量来实现的;
    方向:双向或单向;
    图示:实线 + 箭头;箭头指向被关联的类;
    举例:“渔民”需要知道“天气”情况才能够出海
       //公司关联雇员
    public class Company
    {
        private Employee employee;
        public Employee GetEmployee()
        {
            return employee;
        }
        public void SetEmployee(Employee employee)
        {
            this.employee = employee;
        }
        //公司运作    
        public void Run()
        {
            employee.StartWorking();
        }

    }

    //A关联B
    class A
    {
        B b = new B();
    }
    class B
    {
    }

    2、依赖关系:
      含义:是类与类之间的连接,表示一个类依赖于另外一个类的定义;依赖关系仅仅描述了类与类之间的一种使用与被使用的关系;
    体现:在C#中体现为局部变量、方法/函数的参数或者是对静态方法的调用;
    方向:单向;
    图示:虚线 + 箭头;
    举例:人依赖于水和空气;汽车依赖汽油
        //人划船,人依赖于船
    public class Person
    {
        //划船
        public void Oarage(Boat boat)
        {
            boat.Oarage();
        }


    //A依赖于B
    class A
    {
        public void Function(B b)
        { }
    }
    class B
    {
    }

     

    3、聚合关系:
      含义:是关联关系的一种,是一种强关联关系;聚合关系是整体和个体/部分之间的关系;关联关系的两个类处于同一个层次上,而聚合关系的两个类处于不同的层次上,一个是整体,一个是个体/部分;在聚合关系中,代表个体/部分的对象有可能会被多个代表整体的对象所共享;
    体现:C++中,聚合关系通过将被聚合者的(数组)指针作为内部成员来实现的;
    方向:单向;
    图示:空心菱形 + 实线 + 箭头;箭头指向被聚合的类,也就是说,箭头指向个体/部分;
    举例:鸭群与鸭子具有聚合关系;汽车由引擎、轮胎以及其它零件组成,因为汽车坏掉了,没有坏掉的引擎,轮胎和其他零件还可以继续使用。

    4、组合关系:
      含义:它也是关联关系的一种,但它是比聚合关系更强的关系.组合关系要求聚合关系中代表整体的对象要负责代表个体/部分的对象的整个生命周期;组合关系不能共享;在组合关系中,如果代表整体的对象被销毁或破坏,那么代表个体/部分的对象也一定会被销毁或破坏,而聚在合关系中,代表个体/部分的对象则有可能被多个代表整体的对象所共享,而不一定会随着某个代表整体的对象被销毁或破坏而被销毁或破坏;
    体现:在C#中,组合关系是通过成员变量来实现的;
    方向:单向;
    图示:实心菱形 + 实线 + 箭头;箭头指向代表个体/部分的对象,也就是被组合的类的对象;
    举例:一个人由头、四肢、等各种器官组成,因为人与这些器官具有相同的生命周期,人死了,这些器官也挂了;

    5、泛化关系:
      含义:它表示一个更泛化的元素和一个更具体的元素之间的关系;也就是通常所说的类的继承关系;
    体现:在C#中,泛化关系通过类的继承来实现的;
    方向:单向;子类继承父类;
    图示:空心箭头 + 实线;箭头指向父类;
    举例:动物下面可以分为哺乳动物,脊椎动物,爬行动物等

    6、实现关系:
      含义:它指定了两个实体之间的一份合同;即:一个实体定义一份合同,另外一个实体则保证履行该合同;
    体现:在C#中,实现关系通过类实现接口来实现的,即:一个类实现某个接口;
    方向:单向;子类实现接口;
    图示:空心箭头 + 虚线;箭头指接口向接口;
    举例:唐老鸭(对象)会说话(接口),因为一般鸭子不会说话,所以不会将说话这个方法给一般的鸭子带上;超人(对象)会飞(接口)


    转载地址:http://www.yongfa365.com/Item/UML-Association-Dependency-Aggregation-Composition-Realization-Generalization.html

    展开全文
  • AQI分析与预测 AQI全称是Air Quality Index,指空气质量指数,用来衡量空气清洁或者污染的程度,值越小,表示空气质量越好。 本文的分析目标是: ...怎样预测个城市的空气质量? 导包并读取数据: import num

    AQI分析与预测

    AQI全称是Air Quality Index,指空气质量指数,用来衡量空气清洁或者污染的程度,值越小,表示空气质量越好。

    本文的分析目标是:

    一、描述性统计

    • 那些城市的空气质量较好/较差?
    • 空气质量在地理位置分布上,是否具有一定的规律?

    二、推断统计

    • 临海城市的空气质量是否优于内陆城市?

    三、相关系数分析

    • 空气质量主要受哪些因素的影响?

    四、区间估计

    • 全国城市空气质量普遍处于哪种水平?

    五、统计建模

    • 怎样预测一个城市的空气质量?

    导包并读取数据:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    sns.set(style="darkgrid")
    plt.rcParams["font.family"] = "SimHei"
    plt.rcParams["axes.unicode_minus"] = False
    
    data = pd.read_csv("data/data.csv")
    print(data.shape)
    data.head()
    

    数据集描述:

    • City:城市名

    • AQI:空气质量指数

    • Precipitation:降雨量

    • GDP:人均生产总值

    • Tempearture:温度

    • Longitude/Latitude:经/纬度

    • Altitude:海拔高度

    • PopulationDensity:人口密度

    • Coastal:是否沿海

    • GreenCoverageRate:绿化覆盖率

    • Incineration(10,000ton):焚烧量(w吨)

    数据清洗

    检查缺失值:

    data.isnull().sum(axis=0)
    

    查看含缺失值列数据的分布:

    #print(data["Precipitation"].skew())#偏度  
    sns.distplot(data["Precipitation"].dropna())#要删除NA值才能做分布密度图
    plt.title("分布密度图")
    
    0.27360760671177387
    

    数值型变量,数据呈现右偏分布,所以使用中位数填充。

    对缺失值进行中位数填充

    data.fillna({"Precipitation":data["Precipitation"].median()},inplace=True)
    

    检查异常值的三种方法

    1. data.describe() 查看数据的描述:分位数、均值与标准差
    2. 基于正太分布 ±三个标准差涵盖99.7%的数据
    3. 箱线图(四分位距IQR=Q3-Q1,上下边界:Q3/Q1 ±1.5IQR)

    查看数据集的偏度:

    data.skew()
    
    AQI                        1.198754
    Precipitation              0.273608
    GDP                        3.761428
    Temperature               -0.597343
    Longitude                 -1.407505
    Latitude                   0.253563
    Altitude                   3.067242
    PopulationDensity          3.125853
    GreenCoverageRate         -0.381786
    Incineration(10,000ton)    4.342614
    dtype: float64
    

    可以看到GDP和人口密度等都出现了严重的右偏分布,意味着存在很多极大的异常值。

    下面我们查看以下GDP的异常值:

    mean, std = data.GDP.mean(), data.GDP.std()
    lower, upper = mean - 3 * std, mean + 3 * std
    
    print("均值:", mean)
    print("标准差:", std)
    print("下限:", lower)
    print("上限:", upper)
    data.loc[(data.GDP < lower) | (data.GDP > upper), "GDP"]
    
    均值: 2390.901815384616
    标准差: 3254.876921271434
    下限: -7373.728948429687
    上限: 12155.532579198918
    16     22968.60
    63     18100.41
    202    24964.99
    207    17502.99
    215    14504.07
    230    16538.19
    256    17900.00
    314    15719.72
    Name: GDP, dtype: float64
    

    可以通过以下代码查看每个数值列异常值的个数:

    def func(s):
        mean, std = s.mean(), s.std()
        lower, upper = mean - 3 * std, mean + 3 * std
        a, b = (s < lower).sum(), (s > upper).sum()
        return pd.Series((a, b, a+b), index=("极小异常值", "极大异常值", "总和"))
    
    data.select_dtypes(include='number').agg(func).T
    

    箱线图

    我们可以直接通过箱线图来查看数据集整体的异常情况:

    plt.figure(figsize=(16, 7))
    plt.xticks(rotation=45)
    sns.boxplot(data=data)
    

    image-20210404030819265

    也可以单独查看某个列的异常情况:

    sns.boxplot(data=data["GDP"])
    

    异常值处理

    处理方式有:

    • 删除异常数据
    • 视为缺失值处理
    • 对数转换
    • 使用边界值替换
    • 分箱离散化

    对数转换

    由于右偏分布在取对数后,往往呈现正态分布,所以我们可以对右偏分布进行取对数转换。

    例如,GDP变量呈现严重的右偏分布,我们可以进行取对数转换:

    fig, ax = plt.subplots(1, 2)
    fig.set_size_inches(15, 5)
    sns.distplot(data["GDP"], ax=ax[0])
    sns.distplot(np.log(data["GDP"]), ax=ax[1])
    

    用边界值替换

    查看处理前的数据:

    data.select_dtypes("number").agg(["max", "min"])
    

    image-20210403190338467

    用边界值替换处理:

    data_c = data.copy()
    for column in data.columns:
        s = data_c[column]
        if pd.api.types.is_numeric_dtype(s):
            quantile = np.quantile(s, [0.25, 0.75])
            IQR = quantile[1]-quantile[0]
            lower = quantile[0] - 1.5 * IQR
            upper = quantile[1] + 1.5 * IQR
            s.clip(lower, upper, inplace=True)
    data_c.describe()
    

    再查看:

    data_c.describe()
    

    结果:

    image-20210403190141161

    再次查看箱线图:

    plt.figure(figsize=(16, 7))
    plt.xticks(rotation=45)
    sns.boxplot(data=data_c)
    

    重复值处理

    # 发现重复值。
    print(data.duplicated().sum())
    # 查看哪些记录出现了重复值。
    data[data.duplicated(keep=False)]
    

    结果:

    2
    

    重复值对数据分析通常没有什么用,直接删除即可:

    data.drop_duplicates(inplace=True)
    print(data.duplicated().sum())#去重后检查
    

    结果:

    0
    

    分析

    空气质量最好/差的5个城市

    最好的5个城市

    t = data[["City", "AQI"]]
    t.nsmallest(5, "AQI")
    

    可以发现:空气质量最好的5个城市为 韶关、南平、梅州、基隆、三明

    最差的8个城市

    t.nlargest(5, "AQI")
    

    可以发现:空气质量最差的5个城市为 北京、朝阳、保定、锦州、东营

    空气质量等级分布

    对于AQI,可以对空气质量进行等级划分,划分标准为:

    分级如函数:

    import math
    
    levels = ["一级", "二级", "三级", "四级", "五级", "六级"]
    
    
    def value_to_level(AQI):
        i = math.ceil(AQI/50)-1
        if i == 5:
            i = 4
        elif i > 5:
            i = 5
        return levels[i]
    
    
    level = data["AQI"].apply(value_to_level)
    display(level.value_counts())
    sns.countplot(x=level, order=levels)
    

    结果:

    空气质量指数分布

    sns.scatterplot(x="Longitude", y="Latitude", hue="AQI", palette=plt.cm.RdYlGn_r, data=data)
    plt.title("空气质量指数分布图", size=16)
    plt.show()
    

    结果:

    从上图大致的地理位置来看,西部城市普遍好于东部城市,南部城市普遍好于北部城市。

    临海与内陆城市空气质量分布

    首先看下临海城市与内陆城市的数量:

    data["Coastal"].value_counts()
    
    否    243
    是     80
    Name: Coastal, dtype: int64
    

    分类散点图:

    sns.stripplot(x="Coastal", y="AQI", data=data)
    

    分簇散点图:

    sns.swarmplot(x="Coastal", y="AQI", data=data)
    

    小提琴图:

    sns.violinplot(x="Coastal", y="AQI", data=data)
    

    更直观的是将分簇散点图和小提琴图叠加起来看:

    sns.violinplot(x="Coastal", y="AQI", data=data, inner=None)
    sns.swarmplot(x="Coastal", y="AQI", color="r", data=data)
    

    均值

    display(data.groupby("Coastal")["AQI"].mean())
    sns.barplot(x="Coastal", y="AQI", data=data)#只能看均值数据
    

    结果:

    Coastal
    否    79.045267
    是    64.062500
    Name: AQI, dtype: float64
    

    注:柱形图上方的竖线表示置信区间。

    还可以查看箱线图:

    sns.boxplot(x="Coastal", y="AQI", data=data)
    

    而小提琴图除了展示箱线图的信息外,还能呈现分布的密度。

    就样本数据的分布图而言,我们可以看到沿海城市的AQI分布普遍低于内陆城市。但我们仅仅只有样本数据,对于总体的支持力度还需假设检验。

    假设检验: 检验内陆AQI和沿海城市AQI的均值是否相等(两样本t检验)

    from scipy import stats
    
    coastal = data.loc[data["Coastal"] == "是", "AQI"]
    inland = data.loc[data["Coastal"] == "否", "AQI"]
    

    首先进行方差齐性检验(检验两样本的方差是否一致):

    stats.levene(coastal, inland)
    

    结果:

    LeveneResult(statistic=0.08825036641952543, pvalue=0.7666054880248168)
    

    方差齐性检验,原假设H0为方差相等(齐性),显然p-value超过显著性水平,说明两样本的方差是相等的。

    下面进行两样本t检验:

    #equal_var=True表示两样本方差一致
    r = stats.ttest_ind(coastal, inland, equal_var=True)
    r
    

    结果:

    Ttest_indResult(statistic=-2.7303827520948905, pvalue=0.006675422541012958)
    

    P值小于显著性水平,所以拒绝原假设,接受备择假设,即内陆AQI和沿海城市AQI的均值不相等。

    由于统计量由左样本减右样本得到,统计量小于0说明,临海的均值小于内陆。

    下面我们假设临海空气质量的均值小于内陆空气质量的均值,则这是一个右边假设检验,可以通过以下方法得到P值:

    p = stats.t.sf(r.statistic, df=len(coastal)+len(inland)-2)
    p
    

    结果:

    0.9966622887294936
    

    说明我们有99.7%的信心认为临海的空气质量整体好于内陆空气质量(均值小于内陆)。

    空气质量主要受那些因素影响呢?

    一般我们会有如下疑问:

    • 人口密度大,是否会对空气质量造成负面影响
    • 绿化率高,是否能提高空气质量

    首先查看散点图矩阵:

    sns.pairplot(data[["AQI","PopulationDensity","GreenCoverageRate"]])
    #参数 kind="reg"给散点图绘制一条回归线
    # sns.pairplot(data[["AQI", "PopulationDensity", "GreenCoverageRate"]], kind="reg")
    

    相关系数:

    变量X与变量Y的协方差为:
    Cov(X,Y)=i=1n(xixˉ)(yiyˉ)n1 \large{\operatorname{Cov}(X, Y)=\frac{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{n-1}}
    相关系数的定义:
    r(X,Y)=Cov(X,Y)σXσY \large{r(X, Y)=\frac{\operatorname{Cov}(X, Y)}{\sigma_{X} \sigma_{Y}}}

    =i=1n(xixˉ)(yiyˉ)i=1n(xixˉ)2i=1n(yiyˉ)2 \large{=\frac{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sqrt{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2} \sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}}}}

    相关系数的绝对值的取值范围是[0,1],可以根据相关系数衡量两个变量的相关性,正数代表正相关,负数代码负相关。绝对值的大小体现相关的程度:

    0.8-1:极强相关

    0.6-0.8:强相关

    0.4-0.6:中等程度相关

    0.2-0.4:弱相关

    0-0.2:极弱相关或无相关

    x = data["AQI"]
    y = data["Precipitation"]
    # 计算AQI与Precipitation的协方差。
    a = (x - x.mean()) * (y - y.mean())
    cov = np.sum(a) / (len(a) - 1)
    print("协方差:", cov)
    # 计算AQI与Precipitation的相关系数。
    corr = cov / np.sqrt(x.var() * y.var())
    print("相关系数:", corr)
    

    结果:

    协方差: -10098.209013903044
    相关系数: -0.40184407003013883
    

    其实可以直接使用内置方法计算:

    print("协方差:", x.cov(y))
    print("相关系数:", x.corr(y))
    

    结果:

    协方差: -10098.209013903042
    相关系数: -0.4018440700301393
    

    调用DataFrame中的方法计算相关系数:

    data.corr()
    

    使用热力图呈现相关性数值更佳:

    plt.figure(figsize=(15, 10))
    ax = sns.heatmap(data.corr(), cmap=plt.cm.RdYlGn, annot=True, fmt=".2f")
    

    结果:

    从上述相关性矩阵我们可以看到,AQI与人口密度绿化面积几乎不相关。

    AQI与纬度(0.55)和降雨量(-0.4)的相关性最高。说明:

    • 纬度越低,AQI越低,空气质量越好。
    • 降雨量越多,AQI越低,空气质量越好。

    空气质量验证

    传言说,全国所有城市的空气质量指数均值为71左右,这个消息可靠吗?

    下面作为原假设全部城市的AQI均值为71,并进行假设检验:

    print("样本均值 :", data["AQI"].mean())
    print(stats.ttest_1samp(data["AQI"], 71))
    

    结果:

    样本均值 : 75.3343653250774
    Ttest_1sampResult(statistic=1.8117630617496872, pvalue=0.07095431526986647)
    

    可以看到,P值大于显著性水平0.05,故我们没有充足的证据拒绝原假设,于是接受原假设全部城市的AQI均值为71。

    下面计算一下置信区间:

    stats.t.interval(0.95, df=len(data) - 1, loc=data.AQI.mean(), scale=stats.sem(data.AQI))
    

    结果: (70.6277615675309, 80.0409690826239)

    因此,我们可以认为全国所有城市的平均空气质量,95%的可能在(70.63, 80.04)范围内。

    建模预测

    问题:已知某市的降雨量、温度、经纬度等指标,如何预测其空气质量?

    为了进行模型计算,我们首先需要将一些文本型变量转换为离散数值变量。

    data["Coastal"] = data["Coastal"].map({"是": 1, "否": 0})
    data["Coastal"].value_counts()
    
    0    243
    1     80
    Name: Coastal, dtype: int64
    

    注意:只有两个类别时,转换为任意两个数值都可以。如果存在三个以上的分类,可以使用独热编码对变量进行转换。

    基础模型:

    #线性回归模型
    from sklearn.linear_model import LinearRegression
    #数据集的处理。训练集和测试集
    from sklearn.model_selection import train_test_split
    #构建X、y变量
    X = data.drop(["City","AQI"],axis=1)#删除多余变量 ,Y变量不能在此
    y = data["AQI"]
    #对数据进行分割 训练集和测试集
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
    #实例化模型
    lr = LinearRegression()
    #拟合模型
    lr.fit(X_train,y_train)
    #R方值  模型评价
    print(lr.score(X_train,y_train))
    print(lr.score(X_test,y_test))
    

    结果:

    0.4538897765064037
    0.4040770562383651
    

    绘制预测结果图

    y_hat = lr.predict(X_test)
    plt.figure(figsize=(15, 5))
    plt.plot(y_test.values, "-r", label="真实值", marker="o")
    plt.plot(y_hat, "-g", label="预测值", marker="D")
    plt.legend(loc="upper left")
    plt.title("线性回归预测结果", fontsize=20)
    plt.show()
    

    下面我们将尝试优化模型提高模型效果。

    模型优化

    首先我们使用临界值替换异常值:

    for column in X.columns.drop("Coastal"):
        s = X_train[column]
        if pd.api.types.is_numeric_dtype(s):
            quantile = np.quantile(s, [0.25, 0.75])
            IQR = quantile[1]-quantile[0]
            lower = quantile[0] - 1.5 * IQR
            upper = quantile[1] + 1.5 * IQR
            s.clip(lower, upper, inplace=True)
            X_test[column].clip(lower, upper, inplace=True)
    

    再次查看模型效果:

    lr.fit(X_train, y_train)
    print(lr.score(X_train, y_train))
    print(lr.score(X_test, y_test))
    

    结果:

    0.4631142291492417
    0.44614202658395546
    

    可以看到模型相对之前有一定的提高。

    下面使用RFE(Recursive feature elimination 递归特征消除) 方法实现特征选择,因为删除一些不重要的特征,反而有助于模型效果的提高。

    from sklearn.feature_selection import RFECV
    
    # estimator: 要操作的模型。
    # step: 每次删除的变量数。
    # cv: 使用的交叉验证折数。
    # n_jobs: 并发的数量。
    # scoring: 评估的方式。
    rfecv = RFECV(estimator=lr, step=1, cv=5, n_jobs=-1, scoring="r2")
    rfecv.fit(X_train, y_train)
    
    print("剩余的特征数量:", rfecv.n_features_)
    # 返回经过特征选择后,使用缩减特征训练后的模型。
    print(rfecv.estimator_)
    # 返回每个特征的等级,数值越小,特征越重要。
    print(rfecv.ranking_)
    print("被选择的特征布尔数组:", rfecv.support_)
    print("交叉验证的评分:", rfecv.grid_scores_)
    

    结果:

    9
    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
    [1 1 1 1 1 1 2 1 1 1]
    [ True  True  True  True  True  True False  True  True  True]
    [-0.06091362  0.1397744   0.19933237  0.16183209  0.18281661  0.20636585
      0.29772708  0.307344    0.30877162  0.30022701]
    

    绘图表示,在特征选择的过程中,使用交叉验证获取R平方的值

    plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, marker="o")
    plt.xlabel("特征数量")
    plt.ylabel("交叉验证$R^2$值")
    

    看看进行特征选择后的效果:

    print("剔除的变量:", X_train.columns[~rfecv.support_])
    # X_train_eli = rfecv.transform(X_train)
    # X_test_eli = rfecv.transform(X_test)
    X_train_eli = X_train[X_train.columns[rfecv.support_]]
    X_test_eli = X_test[X_test.columns[rfecv.support_]]
    print(rfecv.estimator_.score(X_train_eli, y_train))
    print(rfecv.estimator_.score(X_test_eli, y_test))
    

    结果:

    剔除的变量: Index(['PopulationDensity'], dtype='object')
    0.46306656191488593
    0.44502255894081927
    

    下面我们对部分数据使用分箱操作,并进行one_Hot编码:

    from sklearn.preprocessing import KBinsDiscretizer
    # KBinsDiscretizer K个分箱的离散器。用于将数值(通常是连续变量)变量进行区间离散化操作。
    # n_bins:分箱(区间)的个数。
    # encode:离散化编码方式。分为:onehot,onehot-dense与ordinal。
    #     onehot:使用独热编码,返回稀疏矩阵。
    #     onehot-dense:使用独热编码,返回稠密矩阵。
    #     ordinal:使用序数编码(0,1,2……)。
    # strategy:分箱的方式。分为:uniform,quantile,kmeans。
    #     uniform:每个区间的长度范围大致相同。
    #     quantile:每个区间包含的元素个数大致相同。
    #     kmeans:使用一维kmeans方式进行分箱。
    k = KBinsDiscretizer(n_bins=[4, 5, 14, 6],
                         encode="onehot-dense", strategy="uniform")
    # 定义离散化的特征。
    discretize = ["Longitude", "Temperature", "Precipitation", "Latitude"]
    
    r = k.fit_transform(X_train_eli[discretize])
    r = pd.DataFrame(r, index=X_train_eli.index)
    # 获取除离散化特征之外的其他特征。
    X_train_dis = X_train_eli.drop(discretize, axis=1)
    # 将离散化后的特征与其他特征进行重新组合。
    X_train_dis = pd.concat([X_train_dis, r], axis=1)
    # 对测试集进行同样的离散化操作。
    r = pd.DataFrame(k.transform(X_test_eli[discretize]), index=X_test_eli.index)
    X_test_dis = X_test_eli.drop(discretize, axis=1)
    X_test_dis = pd.concat([X_test_dis, r], axis=1)
    # 查看转换之后的格式。
    display(X_train_dis.head())
    

    再重新查看模型效果:

    lr.fit(X_train_dis, y_train)
    print(lr.score(X_train_dis, y_train))
    print(lr.score(X_test_dis, y_test))
    

    结果:

    0.6892388692774563
    0.6546062348355671
    

    可以看到模型在经过分箱离散化操作后,预测效果大幅度提高。

    残差图分析

    残差就是模型的预测值与真实值之间的差异,可以绘制残差图对模型进行评估,横坐标为预测值,纵坐标为真实值

    对于一个模型,误差应该的随机性的,而不是有规律的。残差也随机分布于中心线附近,如果残差图中残差是有规律的,则说明模型遗漏了某些能够影响残差的解释信息。

    异方差性,是指残差具有明显的方差不一致性。

    绘制残差图:

    fig, ax = plt.subplots(1, 2)
    fig.set_size_inches(15, 5)
    data = [X_train, X_train_dis]
    title = ["原始数据", "处理后数据"]
    for d, a, t in zip(data, ax, title):
        model = LinearRegression()
        model.fit(d, y_train)
        y_hat_train = model.predict(d)
        residual = y_hat_train - y_train.values
        a.set_xlabel("预测值")
        a.set_ylabel(" 残差")
        a.axhline(y=0, color="red")
        a.set_title(t)
        sns.scatterplot(x=y_hat_train, y=residual, ax=a)
    

    在左图中,可以看出随着预测值的增大,残差也有增大的趋势。此时我们可以使用对y值取对数的方式处理。

    model = LinearRegression()
    y_train_log = np.log(y_train)
    y_test_log = np.log(y_test)
    model.fit(X_train, y_train_log)
    
    y_hat_train = model.predict(X_train)
    residual = y_hat_train - y_train_log.values
    plt.xlabel("预测值")
    plt.ylabel(" 残差")
    plt.axhline(y=0, color="red")
    sns.scatterplot(x=y_hat_train, y=residual)
    

    此时异方差性得到解决。模型效果也可能会得到进一步提升。

    检查离群点:对于多元线性回归,其回归线已经成为超平面,无法通过可视化来观测。但我们可以通过残差图,通过预测值与实际值之间的关系,来检测离群点。我们认为偏离2倍标准差的点为离群点:

    y_hat_train = lr.predict(X_train_dis)
    residual = y_hat_train - y_train.values
    
    r = (residual - residual.mean()) / residual.std()
    
    plt.xlabel("预测值")
    plt.ylabel(" 残差")
    plt.axhline(y=0, color="red")
    sns.scatterplot(x=y_hat_train[np.abs(r) <= 2],
                    y=residual[np.abs(r) <= 2], color="b", label="正常值")
    sns.scatterplot(x=y_hat_train[np.abs(r) > 2], y=residual[np.abs(r) > 2], color="orange", label="异常值")
    

    结果:

    剔除异常值后,训练模型并查看效果:

    X_train_dis_filter = X_train_dis[np.abs(r) <= 2]
    y_train_filter = y_train[np.abs(r) <= 2]
    lr.fit(X_train_dis_filter, y_train_filter)
    print(lr.score(X_train_dis_filter, y_train_filter))
    print(lr.score(X_test_dis, y_test))
    

    结果:

    0.7354141753913532
    0.6302724058812207
    

    可以看到模型效果得到了进一步的提升。

    结论

    1. 从空气质量总体分布上来说,南方城市优于北方城市,西部城市优于东部城市。
    2. 临海城市空气质量整体好于内陆城市
    3. 城市是否临海,降雨量,以及维度对空气质量指数影响最大
    4. 有95%的把握可以说城市平均空气质量指数在区间(70.63, 80.04)之间
    5. 通过历史数据,我们可以对空气质量指数进行预测
    展开全文
  • 城市空气质量分析与预测

    千次阅读 2020-04-13 16:31:38
    城市空气质量分析与检测、AQI分析与预测1、背景信息2、任务说明3、数据集描述二、数据分析流程基本流程三、读取数据1、导入相关的库2、加载数据集 、AQI分析与预测 1、背景信息 AQI指的是空气质量指数,用来衡量...
  • 组合、继承与接口

    2016-10-31 11:13:20
    组合:has-a(鸟有翅膀)需要显示创建被组合对象  继承:is-a(麻雀继承鸟类)隐式 ...2、private 类型绝对只能在本类直接使用 至于一些间接使用的除外(用的比较少嘛)(错误说法:组合产生个实例就可以应
  • 汽车用组合仪表设计规范

    千次阅读 2019-03-13 08:36:54
    本文主要介绍汽车用组合仪表设计基本规范,主要为抛砖引玉,供广大网友参考,欢迎高手留言交流。 设计规范 组合仪表设计规范 1、范围 本标准规定了组合仪表的产品分类、技术要求、试验方法、检验规则及标志、包装、...
  • #每天点点# python 空气质量AQI数据分析与预测 #四:数据分析 #1:空气质量最好/最差的5个城市 #最好的5个城市 #sort_values对列进行排序 t = data[['City','AQI']].sort_values('AQI') #只取城市和空气质量,按照...
  • java对象间的关系(依赖,关联,组合,聚合)

    万次阅读 多人点赞 2016-07-21 16:22:10
    组合,聚合,关联,依赖 的区别 依赖与关联 依赖(Dependency ) : 含义:是类与类之间的连接,表示个类依赖于另外个类的定义;依赖关系仅仅描述了类与类之间的种使用与被使用的关系; 体现:在Java和C++...
  • 我们的空气曲棍球项目已经捣鼓好久了,现在绘制出来的桌面也是呈现出了个好视角并且配合纹理映射后看起来更好了;然而由于球棍只是个点所以看起来并不像真正的球棍,你能想象下使用像个点一样的球棍打球会是...
  • 组合,聚合,关联,依赖 的区别     依赖与关联 依赖(Dependency ) : 含义:是类与类之间的连接,表示个类依赖于另外个类的定义;依赖关系仅仅描述了类与类之间的种使用与被使用的关系; 体现:在Java和...
  • 而保证植物有生命能够进行光合作用的条件,就是要有空气、水等等。植物依赖于空气和水。他们之为依赖关系。【代码层表现】类B作为类A的参数被类A在某个方法使用。Air类和Water类作为Plants类Photosythesis方法的
  • 再早两个月前,当樊佳鑫在海尔集团产品经理“抢单”拿下小A这个项目时,他的提案是组合空调。但无论是空气管家还是小A,它们现在都意味着这只黑色圆润的空气盒子。 小A是空气盒子这个项目发起时它的内部代号...
  • 本发明涉及电器技术领域,具体涉及种检测空气质量的方法及装置、可移动空气净化器的控制方法及装置、可移动空气净化器、非暂态计算机可读存储介质。背景技术:随着现在空气污染状况的加剧和消费者对居住环境质量...
  • 空气动力学基本知识(二)

    千次阅读 2020-02-13 15:00:04
    模型飞机之所以能在空中飞行,很重要的条件是需要有副能产生足以支持模型重量的机翼。模型飞机飞行性能的好坏与机翼有很大的关系。尤其是竞赛留空时间的模型飞机,由于它的主要飞行阶段是滑翔飞行,所以机翼设计得...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,465
精华内容 4,586
关键字:

一组合空气中