Windows 配置C语言环境

最近想学习一下C语言,可是有些问题实在是犯了难。老师一开始教大家学习C语言的时候使用的是Visual C++ 6.0这个IDE都是二十多年前的了,不但不支持新的C语言标准,而且没有关键字提示,最重要的是年代久远了兼容性太差,所以不得不放弃这个IDE了。很多人推荐Visual Studio 2015,抱歉,不是我说,这个IDE即便是安装时候只勾选C++一个选项安装之后也是臃肿的不得了,将近10G的空间,而且安装的时候巨费时间,所以这个IDE也放弃了。那怎么办,到底选哪个?

自己配置一个C语言的学习环境。

介绍一下,自己是在Windows 10(x64) 环境下,配置C语言的学习环境的,如果不完全在这个环境下,请灵活掌握,谢谢。

1. 安装GCC

什么是GCC?(黑人问号脸)

说真的,其实我也解释不清楚什么是GCC,只要记住GCC是由GNU开发的编程语言编译器的套件,其中就包括可以编译C语言的编译器即可。那么Windows版本下载地址呢,我是地址,根据自己操作系统的版本选择下载GCC的版本。

选择正确的版本下载,安装的过程就是一路默认即可,默认的安装配置是将GCC套件安装在了C盘的根目录下面,并且有版本指示GCC-64, 如下图所示:

安装结束之后,测试一下安装是否正确,我们通过Windows的CMD窗口,或者通过Powershell测试都可以,打开CMD命令行,输入下列命令,出现结果如下:

C:\Users\lynn>gcc
gcc: fatal error: no input files
compilation terminated.

说明GCC编译器安装成功,并且环境变量已经设置好。安装GCC到此结束。

2. 编写代码测试

GCC编译器安装成功了,下一步应该编写C语言的代码进行测试一下了。因为我们安装的GCC只是编译器,不能进行代码编写,所以我们需要在别的地方编写代码,推荐专业的写代码的记事本比如notepad++Visual Studio CodeSublime Text等。这些不仅仅有代码高亮、关键词提示,而且还有许多有意思的插件,提升写代码的质量。我在这里选择了VS Code,以此为例。

首先,打开VS Code,建立新的文件并保存,在保存的时候要将该文件的扩展名保存为.C的形式,这样才是C语言的代码,测试代码当然是hello world。

将代码保存到相应路径,然后在改路径下打开CMD命令行,我的路径是D:\C-Project,在改路径下打开的CMD命令行中并输入gcc hello.c,然后就会该路径下生成一个名为a.exe可执行文件,此时在CMD下输入a.exe,就会出现hello world

3. We made it ! : )

到此,我们便成功的在Windows 上配置了C语言的学习环境。


Coursera Code Python 2nd

这次代码是Python Data Structure 的字典讲解部分,主要介绍字典的常用方法,通过课后作业进行集中展示其用法。Python中的字典(dict )前面自己学习的时候接触比较少,所以这次需要多多介绍一下基本的知识。

字典(dict)是Python中非常强大的Collection,内部存放是的数据都是通过键值(Key-Value)对的形式存储,经过哈希化的映射表,可以存放一切。

1. 字典的声明/定义方式

在Python中定义字典的方式是通过下面方式:

>>>Dict = dict()

声明Dict变量是一个字典的形式,其实除了字典以上面的方式声明,列表list也可以通过按照字典的方式进行声明List = list(),平时使用习惯列表的声明方式都是List = [],这次开始都使用字典的声明方式进行声明。

2. 字典中需要注意知识点

  • 字典中的数据是通过键值对(Key,Value)的形式存放在字典中的;

  • 字典中的键值对是无序存放的;

  • 字典中添加键值对的方法:

    >>>Dict = dict()
    >>>Dict[Today] = 'Sunday'
    >>>Dict[Tomorrow] = 'Monday'
    >>>print Dcit
    {'Todya':'Sunday','Tomorrow':'Sunday'}
    

    列表list中添加元素的方法是List.append()通过特定的保留字段进行添加,字典中则无保留字段,直接添加。

3. 字典可以用来计数

字典计数的代码如下:

>>>Dict[key1] = 1
>>>Dict[key2] = 1
>>>Dict[key1] = Dict[key1] + 1
>>>print Dict
{'key1':2,'key2':1}

字典计数的功能使用了字典的一个特点,就是可以方便地修改键值对的值,比如初始化的时候 Dict[Hello] = 1,通过赋值语句Dict[Hello] = 3,那么数字3就会覆盖数字1。那么当使用字典进行计数的时候我们就可以使用如下方法:

#初始化字典,counts为空
>>>counts = dict()
#key值得取值范围
>>>keys = ['hello','Python','world']
>>>for key0 in keys:
    # 当key不在counts时,将目前key添加进去
       if key0 not in counts:
           counts[key0] = 1
    # 当key在counts时,key的值做加法
       else:
           counts[key0] = counts[key0] + 1

>>>print counts

通过上面的办法,我们就可以数出要计数的文字中,每个key值出现的次数,但是上面的for循环循环起来比较麻烦,所以官方给了另外的语句来代替循环的方法。

>>>counts = dict()
>>>keys = ['hello','Python','world']
>>>for key0 in keys:
       counts[key0] = counts.get(key0,0) + 1

>>>print counts

在上面的counts.get(key,0)0是初始值,可以设定为任意整数值(不确定)。整个句子相当于循环语句的里面两句话,使用起来相对简单很多。

4. 字典的迭代

同样字典中的键值对也可以通过迭代的方式进行打印输出,字典的迭代有多种方式,包括只迭代key值,只迭代value值,还包括key-Value一起迭代。

4.1 只进行key值迭代

当我们对字典里的Value值不感兴趣,只需要知道包括哪些key值得时候我们就可以只对key进行迭代输出,key是Python中的保留值,所以可以直接使用进行迭代:

>>>counts = {'hello':2,'world':3}
>>>for key in counts:
>>>    print key
4.2 对value/key-value值进行迭代

只需要在4.1程序中的最后一行修改为print counts[key]即可。将键值对一起迭代只需要将上面修改为print key,counts[key],便可以进行两个都输出。

除了上面的办法,在字典中key-value键值对的存在还可以看作字典内部的items

>>>print counts.items()
>>>    {('hello',2),('world',3)}

此时字典中的键值对组成了一个item,多个item组成了字典中的items,此时如果对字典进行迭代的时候,如果还是想要输出hello 2形式的键值对,可以按照4.2中典型的输出方法。由于键值对组成了一个item,我们还可以使用如下方法进行迭代:

>>>counts = {'hello':2,'world':3}
>>>for item in counts.items():
>>>    print item
>>>
('hello':2)
('world':3)

上面方法对字典中的items,进行了迭代,然后进行输出,得到的结果是('hello':2)类型的数据,即一个一个的元组形式数据。

5. 示例

下面的示例代码是Coursera公开课的课后作业代码,主要是练习Python中的字典的使用方法。

'''
A Simple Program for Coursera. Python Data Structure Chapter $9 Dictionary

Read the file 'mbox-short.txt' figure out who sent the most great number
of e-mails, then print it out.

Author: Lynn Lau
Date: 2016/0717
Version: 1.0
'''
# The first step: read the file
path = 'D:mbox-short.txt'
file = open(path)
List = list()
AddressList = list()
# The second step: split the lines into words
# then put the proper words into list
for line in file:
    if line.startswith('From:'):
        Line = line.split()
        List.append(Line)
#print List
index = 0
while index < len(List):
    AddressList.append(List[index][1])
    index = index + 1
    #pass
#print AddressList

# The third step: count the words 
# then put the numbers into dictionary
counts = dict()
for address in AddressList:
    counts[address] = counts.get(address,0) + 1 
    #pass
#print counts

# The forth step: print the most words & frequency
bigCount = None
bigAddress = None
for address,count in counts.items():
    if bigCount is None or count > bigCount:
        bigCount = count
        bigAddress = address

print bigAddress, bigCount

Coursera Assignments for Python Data Structure

​ 最近在Coursera学习Python的数据结构的一些简单知识,Coursera是不以不错的线上学习平台,不仅可以线上学习国外很多名校的课程,顺便可以练习一下英语水平,也算是一举两得了。除了能够学习线上只是之外,老师还会留了下作业,以便巩固课堂知识,但是作业都比较简单;还有线上测验,测试你本章知识的掌握程度,课程短小精悍,内容丰富,还是很值得大家学习一下的。

​ 本周老师留的一道作业题是,在一个文件中寻找一些包含特定内容的行,然后对行中的内容进行提取,然后进行进一步处理。主要涉及到的知识点很多,包括文件的读取字符串的解析循环的使用格式化输出等。具体先看题设与内容:

'''
A Simple Program for Coursera Python Data Structure $ Chapter Seven  Files

Open a file whose name is "mbox-short.txt"
Look for lines just like "X-DSPAM-Confidence : 0.8475"
Count the lines of them and Calculate the AVERAGE Value of float numbers 

Author:Lynn-Lau
Date: 2016/07/13
'''
path = 'D:\mbox-short.txt'
file = open(path,'r')
NumberList = []
for line in file:
    Line = line.strip()
    if Line.startswith('X-DSPAM-Confidence:'):
        Number = float(Line[20:])
        NumberList.append(Number)

Index = 0
Value = 0
while Index < len(NumberList):
    Value = Value + NumberList[Index]
    Index = Index + 1

AverageValue = Value/len(NumberList)
print "Average spam confidence: %.12f" % AverageValue

在这而非常值得一提的就是格式化输出,在float类型数据输出的时候,如果%f那么默认的输出小数点后面的位数为6,超过了就进行四舍五入然后输出。如果想要输出一定位数的小数那么就要在格式化输出时候进行规定:

>>>import math
#默认输出位数,不做修改
>>>print 'PI = %f' % math.pi
PI = 3.141593
#修改输出位数,保留三位小数
>>>print 'PI = %.3f' % math.pi
PI = 3.142

最常见的方式就是上面两种方式格式化输出,其他方式也有少见,另做补充。

除了格式化输出之外,还有就是startswith()函数,这个函数第一遇见并使用,一般用与字符串中,匹配字符串。注意是startswith()而不是startwith()

Mobile Crowd Sensing and Computing: The Review of an Emerging Human-Powered Sensing Paradigm

​ 本文是一篇移动群智感知与计算(Mobile Crowd Sensing and Computing, MCSC)的一篇综述文章,主要对MCSC的各个方面进行介绍总结。

1. Abstract

MCSC是参与式感知的一种拓展方式,它利用移动设备参与感知数据(离线)和移动社交网络中的用户的分布数据(在线)进行研究。MCSC在计算过程中利用人机智能相互结合,相互补充。本文主要介绍了MCSC的一些特点以及其应用,提出了建立MCSC的系统框架,介绍讨论了目前存在的限制,面临的问题,研究的机遇。

2. Introduction

​ 引言部分主要都什么是MCSC进行了简单介绍,MCSC是一种通过普通人利用其移动设备共享感知或生成数据并在云端进行聚合然后进行处理并服务大家的例子。

群智感知历史

MCSC在很多方面比如城市/社区的动态监控都有很多应用,在其他领域也有独特的应用但是也有很多挑战,本文内容的组织方式如下:

  • 介绍了MCSC的特点,比如草根驱动的感知方式,以人为中心的计算,短时间网络连接等;
  • 回顾现存的应用案例,介绍MCSC应用社区/城市感知,环境检测、交通规划中涉及的技术。基于上面的讲解引出MCSC的框架;
  • MCSC中的人的特点以及机器智能进行调查,探索人机在群智感知和计算过程中相互协作的模式;
  • MCSC未来带的挑战进行介绍,比如激励机制问题、短暂的网络连接数据选择问题,数据质量与数据选择,数据挖掘的不同模式等。

3. Characterzing MCSC

首先介绍了MCSC的特点,然会对其进行了分类。

3.1 Grassroots-Powered Sensing

​ 这个特点是MCSC区别于传统的传感器网络的最大特点之一,能够大量部署。这种方式的优点是:1)部署成本低;2)具有移动性,能够达到时空覆盖。 下面的表大体介绍了传统的传感器网络与MCSC的区别。

MCSC最主要的特点是以人为中心,但是相比于移动群智感知,MCSC要更加先进一步,也具有一些新的特点,主要体现在下面几个方面。

  • 数据产生的方式。1)移动感知,具有丰富传感器的移动设备感知数据;2)移动社交网络,通过移动社交获取数据将线上线下进行连通。参与式移动感知数据和移动社交网络数据的结合是其重要的特点。

  • 感知方式。形象感知与抽象感知,通过参与式感知的方式,参与者知道,形象感知数据;通过移动社交网络产生的数据是用户在使用网络的过程中不知不觉产生的抽象的感知到的数据。

  • 志愿者组织。MCSC中与群智感知用户的参与可以分成多种,Group, Community, Urban

    Volunteer Groups

3.2 Hybrid Human-Machine System
  • 人类参与的动机。虽然在群智感知中,人的能力有限,但是在适当的激励之下人们愿意参与到其中收集数据。除此之外,人们也愿意因为其他原因社交、名誉、获得别人的认可等原因参与数据收集的任务。
  • 人机智能的结合。在数据收集的时候移动设备随着人的移动,体现了人的智能。当数据收集之后,进行数据处理与数据挖掘的之后将人机的智能体现了出来。人机智能的结合有时候会互相补充,有时候会相互冲突,因此人机智能的结合如何能够更好的优化,仍然需要研究。
  • 用户的安全性与隐私。在MCSC中收集用户的个人数据势必会带来一些安全性和用户信息的隐私问题。应该研究新的技术以保护用户的数据的安全性,在MCSC中会有新的技术以保护用户信息的安全。
3.3 Transient Networking

MCSC的成功依赖于无处不在的异构通信能力,进而为移动设备提供了通信能力进行数据收集,不同MCSC应用之间的一些共同点:

  • 异构网络之间的链接。目前的移动设备都具备了多种无线通信的接口,支持多种通信方式,比如GSMWi-FiBluetooth等。多种无线通信方式增加数据传输的机会。
  • 网络拓扑的变化以及人类的移动性。携带移动设备的人类的移动新不仅为MCSC提供了良好的时空覆盖度,而且也带来的一定挑战。与此同时,随着时间的变化网络拓扑也在不断的演化,传统的传感器网络之间静态节点的通信协议已经不再适用于动态节点之间的通信了,使得移动设备之间寻找路由变得困难。虽然有这些挑战,但是目前一些研究学者做了许多贡献。
  • 中断容忍服务。并不是所有的MCSC应用都需要移动设备实时将数据进行传输,所以允许中断连接,MCSC可以利用这一特点,将数据存储然后进行转发。
  • 需求量大。MCSC需要移动设备收集大量的数据,所以这是通信系统面临的挑战和基本需求,同时也需要网络设备降低能耗等。
3.4 Crowd Data Processing and Intelligence Extraction

​ 数据抽取出来,有的数据质量较低,数据质量维度高,结构也不尽相同。

  • 低质量数据。
  • 异构,不同空间的数据挖掘。移动群智感知的数据来源多个方面,如离线/物理实体数据,在线/虚拟社区数据。不同空间的数据包含了不同的信息,如何有效的将不同空间的信息进行融合挖掘,也是MCSC面临的挑战。
3.5 The Taxonomy(分类) of MCSC

MCSC可以分成几个不同的部分:

  • Mobile Sensing,移动感知。
  • Crowd Data collection, 群智数据收集。
  • Crowdsourced data processing,众包数据处理。
  • Crowd intelligence extraction and usage,群智数据抽取和使用。

MCSC 分类图

4. MCSC-EMPOWERED APPLICATIONS

MCSC存在着多种应用,下面介绍几种常见的应用。

4.1 Crowd-Powered Environment Monitoring
  • Nature preservation ,保护自然。
  • Noise Pollution measurement ,噪声污染测量。
  • Air pollution measurement ,空气污染测量。
4.2 Transportation and Traffic Planning

群智感知数据可以应用于交通预测,公共交通系统设计,出行规划等方面。

  • Traffic dynamics,动态交通,通过公共交通设施上的数据可以得到实时城市交通状况;
  • Public transportation, 公共交通系统,可以通过乘客之间的数据共享来提高公共交通系统的设计水平;
  • Individual travel planning, 个人出行规划,利用分享的群智感知数据,规划自己的出行路线,提供方便出行。
  • Road condition, 路况信息监测。

​ 群智感知除了上面的应用之外,还有许多其他的应用,在此不像上面一一进行介绍,大体总结一些。群智感知也应用城市的动态感知,比如城市中人类的移动规律/行为模式,社交事件等。应用于位置服务中,移动社交的推荐,健康监测,公共安全监测等各个方面。

5. Conceptual Framework for MCSC

​ 根据上面的描述我们在这里介绍MSCS的架构,并介绍架构中的重要部分,包括crowd sensing, data transmission,data collection, crowd data processing, applications

架构图

  • Crowd Sensing, 群智感知层。包含多个不同数据源,移动设备感知得到的数据,用户在移动互联网中产生的数据。
  • Data transmission, 数据传输层。负责将感知层产生的数据传输到后端服务器,然后做进一步处理。
  • Data collection, 数据收集层。 将传输层传输的数据进行收集,并提供隐私保护机制保存数据。除此之外,数据收集层也具有其他功能或部分:
    • Task allocation, 任务分发。负责将应用层的感知任务进行解析并选择节点参与感知。
    • Sensor gateway, 传感器网关。通过统一的接口来服务上层。
    • Data anonimization, 数据匿名化。对数据进行处理以保证参与用户的隐私。
    • Incentive mechanism, 激励机制。奖励或激励用户参与到群智感知中来。
    • Big data storage, 提供大量的存储空间以存储感知的数据。
  • Crowd data processing, 数据处理层将收集到的原始数据进行抽取或者挖掘。
    • Data procssing architecture,
    • Data quality maintence,
    • Cross-space feature association/fusion
    • Crowd intelligence extraction
  • Application, 应用层。本层包含大量需要MCSC驱动的应用服务,也可以将数据进行可视化然后分享给大家。

6. Towards Hybrid Human-Machine Systems

​ 在MCSC中将人机智能进行了结合,这也是目前单纯的群智感之中不具备的特点,这一部分主要介绍如何在MCSC中将人和机器的智能进行有效的结合发挥作用。

  • Human intelligence, (HI). 人的智能在MCSC中具有重要作用,社交,感知等。在记忆力能力和计算能力方面具有一定的限制性。
  • Machine intelligence, (MI). 机器具有很强大的存储和计算能力,弥补人类能力的不足。

​ 在MCSC中将人和计算机的能力进行结合,二者缺一不可,分工明确,下图中将人机能力在MCSC的架构中的应用进行了形象的介绍。

Hybird System

​ 虽然目前在人机智能领域已经做了很多工作,但是目前的研究室仍然处于起始阶段,依然有很多工作要做,比如如何发挥机器的能力这一方面人有很大的研究潜力。

在此不做过多介绍

7. Limitations, Challenges and Opportunities

这一部分主要介绍MCSC领域内的关键技术,面临的挑战,未来的机会。

7.1 Sensing with Human Participation

​ 群智感知与传统的传感器网络的最大的区别就是有人的参加,参与式感知目前也有很大的挑战。

  • Task allocation, 任务分发与数据抽样。群智感知中潜在着有大量的移动节点,那么如何从大量的节点中甄别出适合参加感知任务的节点。在不同的感知任务中需要考虑一些标准,用以过滤一些无关或者不适合参加任务的节点,比如有些任务需要特定的地域和时间段,感知路况信息、车流量信息,只能将一些符合要求的节点选入。在这方面有一些学者做了很多的工作,仍然需要进一步研究。
  • Human group, 在感知中有些节点具有相似的能力,或者相同的感知任务,如何将这些移动节点进行分组也非常值得研究。前人工作在此不赘述
  • Coverage, reliable and scalability, 在感知过程中如何达到一定的覆盖比例,如何提高系统的可靠性与可扩展性,非常重要。
7.2 Incentive Mechanism

​ 在群智感知中激励机制是一个比较热门的研究领域,激励机制不仅仅使用在群智感知中,也使用在其他领域中,同样在MCSC中激励机制的研究也是一个非常大的挑战,即便前人做了很多这方面的研究。因为激励机制在MCSC中扮演着不可或缺的角色,有了激励机制参与感知的用户才能愿意长时间参加感知任务要,并且适当的激励机制可以提高感知数据的质量。

激励机制的激励方式有多种,比如金钱奖励、积分等,在此不赘述,可通过前人文献激励机制综述学习

7.3 Data Delivery in Transient Networks

​ 在MCSC中如何将分布在参与者设备中的零散数据传输到集中的后端数据中心,移动设备的通信方式都是无线通信的方式,并且带宽小,用户携带设备的移动也不断地引起网络的拓扑变化,所以,这也是一个很大的挑战。在MCSC的通信组网中需要考虑很多方面,下面问题也亟待解决:

  • Robust data delivery among highly mobile devices. 虽然目前存在很多的移动自组织网络或者其他机会网络的通信协议,但是这些协议不能目前满足MCSC通信的可靠性。
  • Tradeoffs between communication and processing via localized analytics. 移动设备之间的数据交换问题。

​ 除了上述两个问题与挑战之外,还有其他问题与挑战,比如Distribution caching and replication schemes, Hybrid networking protocols

7.4 Data Redundance, Quality and Inconsistence(前后矛盾)

​ 在MCSC中参与感知的用户数量大,并且用户存在着移动性,难免会出现感知数据的冗余、重复和前后矛盾的问题。那么如何去控制数据的质量,去除数据的冗余与重复,或者从根本上去避免此类事情的出现很值得去研究。同样,前人的工作在此不做赘述。

​ 上面介绍了MCSC中部分领域遇到的挑战与机遇,除了上面的几方面还有其他方面如Cross-Space, Heterogeneous Crowdsourced Data Mining, Trust, Security and Privacy,这几方面我们不做重点介绍。

8. Conclusion

​ 总的来说本文是一篇MCSC的综述文章,包括对MCSC的介绍以及对科研学者在此领域各个方面权威性文章进行总结列举,文中对MCSC的特点进行了介绍与分类,并对MCSC的应用进行分析、总结与分类,并提出了MCSC的架构,并对架构中的每一部分进行了详细介绍,然后介绍了MCSC中最突出特点人机智能进行了介绍,最后对MCSC中各个方面面临的挑战与基于进行了描述,指出了存在的相关问题以及研究的方向。

Limits of Predictability in Human Mobility

​ 2016年06月27日-07月2日 一周研究报告

1. 概述

本周的主要工作就是对人类移动性的行为模式进行研究与学习,并思考如何将其应用于群智感知中去。

2. 术语定义

​ 回转半径(radius of gyration ): 在文中意思为以某基站为圆心,个体用户的出行半径;

​ 重尾分布(fat-tailed distribution): 一种概率分布模型,在许多情况下,右边尾部的部分比较受到重视,但左边尾部比较厚,或是两边尾部都比较厚的状况,也被认为是一种重尾分布。

fat-tailed distribution

3. 文献介绍

3.1 引言与数据集介绍

​ 文中同样现对目前学者专家们对人类移动模式的研究进展进行介绍,以及前人做的工作,研究的程度、常用的研究方法等等。

​ 本文作者研究所使用数据集都是匿名用户的移动电话的数据,一部分是记录移动手机每次进行呼叫时记录下的接入基站等相关位置信息,时长跨度较大(14周),用户数量大(50000用户);另一部分是用户主动参与该实验,每个小时不断的上报自己的位置相关信息,时间、附近的基站信息,时长为八天。

3.2 研究过程

​ 首先,在数据集中选出两个典型用户,将他们的移动模式做了抽样,简单刻画其行为模式。

​ 第一个用户中记录的基站数量为22,表示其大约在22个基站附近活动,其活动半径大约为30km,第二个用户中记录的基站数量为76,同理其大约在76个基站附近进行活动,活动半径大约为90km。将这些基站在地图中一一进行标注,并将其连接起来,如下图1所示。

图 1 两个匿名用户出行距离图

​ 然后分别将两个用户在每个地点停留的时间长短进行统计,可得下图。图2中点形状的大小代表了用户在这个地点停留的时长占总时长的比例。

图 2两个匿名用户的出行网点图

​ 经过简单的行为模式刻画之后,分别定义了三个参数-熵值,进行定量预测。

  • 随机熵(Random Entropy)):

$$
S^{rand}_i\equiv\log_2N_i
$$

​ 其中Ni是用户i访问过的不同地方的数量,随机熵值表示了如果每个地方以相同概率被访问的话,用户下一个地点的可预测程度。

  • 时空不相关熵(Temporal-uncorrelated Entropy):

$$
S^{unc}i\equiv-\sum^{N_i}{j=1}p_i(j)log_2p_i(j)
$$

​ 其中pi(j)是用户i以往访问位置j的概率,该熵表示了用户访问的每个地方之间是存在不同的。

  • 真实熵(Actual Entropy):

    ​ 该熵值得的大小不仅仅取决于用户i访问某个地点的频率,而且取决有用户方位该地点的时间顺序以及用户在该地点停留的是将的长短,具有时空相关性,准确的刻画了用户一个用户的移动模式的时空相关性。具体来说,假设

$$
T_i = {X_1,X_2,X_3,\cdots,X_L}
$$

表示用户i以小时为间隔单位所被观察到的出行规律,那么真实熵就是上面的Si计算方法。

​ 为了计算出真实熵 ,需要一个连续时间间隔内的用户位置信息,由于数据集中用户位置信息是每次进行手机通话的时候进行记录的,然后用户的通话行为呈现出一定突发性,短时间内多次通话,然后很长一段时间都是沉默的(如下图3中D所示),所以数据集中的数据具有很大的不完整性。这种数据的不完整性我们用q来描述,代表着我们每个小时内不知道用户信息的比例,并得到了数据集中q的概率密度分布图,如图3中E所示.

图 3 D通话概率与时间间隔该路密度分布图,E数据不完整性q分布图

​ 上图中q的峰值出现在0.7左右,通过实验我们得到当q的值大于0.8时不能提供一定量的位置信息,所以我们保留了q值小于0.8的部分进行熵值计算。

图 4三种熵值概率密度分布

​ 计算完三个熵值,分别得到其分布图。图中比较有价值的分别是 和 ,前者的峰值出现在6左右,后者的峰值在0.8左右,通过熵值的逆运算我们可以得到随机熵值中位置数为64,表示如果使用随机熵来预测用户下一刻出现的位置,有64种可能。用真实熵0.8逆运算约为1.7,少于两个地方。

​ 在数据集中每个个体日常活动的距离(回转半径 )大多都在1-10km,很少用户超过10km在几百km,符合重尾分布。因此,作者假设用户行为的可预测都也应该符合重尾分布。

图 5回转半径的重尾分布图

​ 用来说明可预测都大小的为可预测概率 ,并且提出了预测算法(此处不介绍)。可预测概率可以解释为,例 ,表示一个人至少80%的时间的行为模式是随机的,只有剩余20%的时间的行为行踪是可以进行预测。同时也可以理解为,即便我们的预测算法是100%正确的我们也只有20%的可能预测出他的位置,所以 代表了每个用户移动可预测的极限。

​ 有了预测算法,对数据集中的每个用户进行了可预测度计算,并将这些数据做成分布图,但是p的峰值出现在了0.93的位置,并不符合前面假设符合重尾分布,如下图6中B所示。这种分布规律表明,虽然我们每个人的行为模式看似都是随机的,但是每个人的里使用移动轨迹中却隐藏着高度可预测性。​

图 6 B可预测性分布图,C可预测概率与回转半径函数分布图

​ 上面提出的假设是,用户的回转半径符合重尾分布,可预测性也应该符合重尾分布,但是假设用户的可预测性并不符合重尾分布,假设失败上图所示,当用户的回转半径大于10km,甚至到了100km或者几百km其可预测性的最大值与回转半径为10km的可预测性的值几乎一样。那么失败的原因是什么?

​ 因为在回转半径比较小的时候,随着观察用户的回转半径的增大,访问的数量会增加,所以可预测性会降低(上图6中图C中回转半径1-10km时候),但是当观察回转半径达到一定量时候,用户访问的地点数量不再增加,那么可预测性概率的大小保持稳定(上图6中图C中回转半径10-1000km时候)

​ 上面介绍了 为个体行为可预测性的上限,下面介绍了个体行为可预测性的下限。

​ 为了理解观察到的个体行为的高度可预测性,将一周的时间分成了168小时,每个小时我们都对用户最常去的地方做记录。比如,在星期一,一个用户在8-9点的时候记录了十次,其中出现在了A位置1次,B位置2次,C位置7次,说明在这个小时内最可能出现的位置为C,设概率值为R,意义为在某个时间段发现一个人出现最有可能的那个地方的概率。经过对数据集中个体数据的统计,发现R的值大约为0.7,这意味着平均70%的时候用户方位的位置与实际位置相同。这个值得大小依赖于具体的某个时间段,比如在半夜的时候R的峰值为0.9,在中午到下午6/7点的时候,R具有最小值。如图7中A所示。

图 7 A图为R随着时间的分布图,B图访问地点数量随着时间变化的分布图

​ 上面R值的规律也可以通过图7中B图得到验证,当A图中R出现最小值的时候,B图响应时刻正好对应的访问地点的数量呈现出最大值,说明当访问地点数量所得时候,可预测的概率小;当A图中R呈现峰值的时候,对应B图中响应时刻访问的地点数量是最少的时候,此时可预测的概率最大,这样在A、B图中使得R为可预测得到了相互的验证。

​ 加入用户在访问的所有的地点中随即移动话,根据上面随机熵值可以到 为0.016,远远小于0.7,所以再一次证明了用户的移动性与随机移动的方式相去甚远。除此之外,文中还将相对预测规律 与回转 半径做了描述,如下图8所示。

图 8相对规律 与回转半径变化图

​ 为了测试上述实验的适用范围,以及其他因素是否会影响个体行为的可预测性。文中在不同地区,不同年龄段的人群做了相同的测试,包括使用不同语言的地区,人口密度不同的地区,贫富程度不同的地区,均没有发现非常大的区别。

3.3 结论

​ 综上所述,我们通过实验所得,个体的行为可预测都高达93%,但是更见成果是,这一结果并不会因为人群的不同而出现,较大偏差,即适用范围很广。除此之外,根据不同地区人群,以及描述的参数不同,个体的行为也不尽相同,经常出行且距离远的用户行为的可预测性要比不经常出行的用户的可预测性要低。

4. 参考文献

[1] Song C, Koren T, Wang P, et al. Modelling the scaling properties of human mobility[J]. Nature Physics, 2010, 6(10):818-823.

[2] 陆锋, 刘康, 陈洁. 大数据时代的人类移动性研究[J]. 地球信息科学学报, 2014, 16(5):665-672.

[3] 刘瑜, 肖昱, 高松,等. 基于位置感知设备的人类移动研究综述[J]. 地理与地理信息科学, 2011, 27(4):8-13.

文件的读取与输出

想在文本数据中提取特定的某列数据,如下图:

868216817   2016-05-01 00:00:02 1462032002562   0   2911023347
868216818   2016-05-01 00:00:02 1462032002562   1   2911023347
868216819   2016-05-01 00:00:02 1462032002562   1   2911023347

将上述数据的某一列进行提取并输出写入另外一个文件。

#-*- coding:utf-8 -*-

# 将要打开文件的路径
path = ("E:\split\part0001.txt")
file = open(path)
"""
列表解析将文本文件的内容写入列表,将每一行的不同字段
再次写入列表嵌套的列表
[[868216817]    [2016-05-01 00:00:02]   [1462032002562] [0] [2911023347]
[868216818] [2016-05-01 00:00:02]   [1462032002562] [1] [2911023347]]
"""
L = [line.split() for line in open(path)]
# print len(L)
# 进行列表解析后列表的长度就是文件中字符串的行数

File = open("test.txt",'w')
num = 0
# while循环,将每一行进行打印并写入test文件
while num < len(L):
    # L[num][4] 其中num是行数,4是每行所代表的列表的元素索引号
    print L[num][4]
    File.write(L[num][4])
    num += 1

这几代码尝试着写了两个晚上。

  • 在上面的while循环将每一行进行打印试过使用for迭代器进行迭代,但是没有可迭代的对象,所以使用迭代器不成功。

  • 在上面打印每一行的数据的时候,使用过以下代码:

    while True:
      line = file.read()
      print line
    

    这种输出可以将每一行进行输出,但是不能得到每一行固定的数值,又想办法:

    while True:
      line = file.read()
      print line[4]
    

    同样得不到想要的结果。

常见几个读取文件的函数

讲到这里就顺便记一下几个常用读取文件的函数的作用于区别,它们分别是readlines()readline()read()

  • readlines()的用法是List = file.readline(),将file中的内容以字符串的形式读入到名为List列表中去。
  • readline()的用法是String = file.readline(),将file的内容以字符串的形式都入到名为String的字符串。
  • read的用法是String = file.read(N),将file中的前N个字节读入String字符串中。

同理可得writewritelines

Python中的函数与多态

开始在学习Python的面向对象编程的时候,总也没有找到“多态”,最近在看《Python学习手册》的时候在函数这一章介绍了多态概念。在此就借着介绍函数中的部分知识学习理解一下到底什么是Python中的“多态”。
先介绍几个函数相关的语句和表达式:

***************
def 
def fun(a,b,...):
****************
return 
return a+b+c   
**************** 

函数简介

  • def语句与return
def <name>(arg1,arg2,...argN):
    ...
    return <values>

def语句定义的函数主题往往都包含了一条return语句。按道理上说Python中的return语句可以在函数主题的任何一部分出现,但是往往出现在了函数主体的末尾。它表示函数调用的结束,并将结果返回到函数调用处。rerurn语句是可选的,如果没有在函数主体中出现,那么函数将会在控制流执行完函数主体时结束。从技术角度来讲,一个没有返回值得函数自动会反悔了none对象,但是这个只往往被忽略。

Python中的多态

在学习Python的面向对象编程的时候并没有提到多态,今天在此介绍一下多态,介绍多态的同时举一个小例子,算是锻炼一下自己的代码水平了:(

>>>def times(x,y):
...    trturn (x*y)
...

上面定义了一个times函数如果调用此函数,如下:

>>>times(2,4)
8

上面调用times函数的时候传入的两个参数为2、4,都是整形的数字,如果传入的实参不是整形的数字呢?

>>>times(1.5,4)
6
>>>times('Hello',4)
'HelloHelloHelloHello'

上面两次对times函数的调用传入的实参分别是浮点型数据、整形和字符串、整形,我们可以看出times函数对数字做了乘法,重复了四次字符串序列。当times函数传入的实参数据类型不同时候“*”的操作也不同。

注意,上面的times函数两个参数有一个为字符串时候,另外一个参数必须为整形,如果两都是字符串或者一个字符串一个浮点类型,则会报错。

>>> times("hello",2.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in times
TypeError: can't multiply sequence by non-int of type 'float'   

通过上面调用函数我们可以看到times函数中表达式x*y的意义完全取决于xy的对象类型,同样的函数,在一个实例下执行的是乘法,在另一个实例下执行的是赋值。在Python中将对某一对象在某种语法的合理性交由对象自身来判断,这种依赖类型的行为便可以称为多态

介绍完多态之后,我们再通过第二个例子来认识多态。本例主要功能寻找两个序列的交集,在两个字符串中寻找相同的元素并进行输出。

首先,定义寻找交集的函数,然后调用函数。

def intersect(seq1,seq2):
    res = []
    for x in seq1:
        if x in seq2:
            res.append(x)
    return res

调用上面函数,

>>>s1 = "SPAM"
>>>s2 = "SPCM"
>>>intersect(s1,s2)
['S','P','M']

Python中的函数和上面的函数一样是多态的,同样intersect也是多态的,支持多种类型。

>>>x = intersect([1,2,4],(1,4))
>>>x
[1,4]

这次我们给函数传递了不同类型的对象,一个列表一个元组,两个不同类型的数据,同样输出了预期的结果,所以传递的两个参数支持迭代功能即可完成上述功能,再一次体现出了Python的多态。

Python中的多态功能,增加了代码的灵活性。

June 26, 2016 3:18 PM