新闻资讯
学了计算机能做什么呢?
从计算机底层细节拉到一个更高的应用层面,我们可以看看一旦人们学会了计算机技术,他们会做什么呢?
他们可以做电影中的动画特效
他们可以让飞机在天上飞
他们可以帮助外科医生把脑部手术做得更好
……
很多有趣的事情。
大体来讲,这些激动人心的事情的共同点是
他们都是采用计算性思维的
(Computational Thinking)
麻省教授Eric Grimson认为:计算性思维必将像读写技能一样成为21世纪中叶人人都将掌握的基础技能。而无处不在的计算和计算机将让计算性思维的传播成为可能。
既然计算性思维这么重要,那我们来看看计算性思维的基本过程:
计算性思维的基本过程是什么呢?
辨别和发现有用的抽象
Identify or invent useful abstractions
以计算实验的形式形成问题的一个解决方案
Formulate solution to a problem as a computational experiment
设计和架构一个足够有效率的实验
Design and construct a sufficiently efficient implementation of experiment
确认实验的建立,验证代码是否正确
Validate experimental setup
运行实验
Run experiment
评估结果
Evaluate results of experiment
重复上述过程
Repeat as needed
首先我们要辨别出或者发现有用的抽象,有时候这些抽象已经存在了,我把它们拿来用就好了,有时候你得自己去创造抽象。然后我们使用这些抽象,以某种计算实验的形式去形成一个问题的解决方案。
接下来有一个我们中的多数人可能会陷入错误的一个环节,不过随着不断学习,这个环节也会变得更加简单,这个环节就是设计和架构一个足够有效率的实验的实现。
然后我们要验证这个实验,确定这个代码可以正常运行,然后运行这个实验。
最后,评估结果。如果需要的话,我们会重复上面的过程再来一遍。
当然,就我们的经验来说,第一次运行实验总是很难成功的,我们需要修改修改再修改,直到运行成功。不过,这也不是计算机实验才会这样,生物实验,物理化学实验中都有这个现象存在,需要不停的实验,直到找出正确的方法和答案。以上这些就是基础的过程。
总之,计算性思维是一个实验的科学
两个重要的“a”概念
抽象
Abstraction
选择正确的抽象
Choosing the right abstractions
按照多层抽象同时进行操作
Operating in terms of multiple layers of abstraction simultaneously
在多层之间找到它们之间的关系
Defining the relationships between layers
自动操作
Automation
如何把这些抽象计算机化
Think in terms of mechanizing our abstractions
我们可以借助精确和严格的符号来表达这些模型
we have precise and exacting notations and models
首先我们选择正确的抽象,然后按照多层抽象同时进行操作,有时候这会显得有些棘手。比如你建立了一个完美的高层次抽象,但之后你得思考这个问题,然后用一个编程语言提供的相对低层次的抽象来完成它。
比如,我们对股票市场做一个模拟,对一支股票做一个抽象。当我们考虑整个市场时,我们会抽象的考虑一支股票,包括它的价格可能会上升或者下降。同时,我们会去看这种价格的变化是高斯式的还是始终如一的呢?我们在不同的层面进行操作,然后到下一层,我们会考虑如何来表现它。是用一个字典还是数组来表现。我们经常反复考虑这些层面是怎么关联的。
另外一个重要的,并且把计算机科学和其他科学分别开来的是:我们不是仅仅把抽象优雅的写在纸上就over了,我们会用数学算法来构建它,并通过编程让其自动化。我们可以用精确和严格的符号来表达这些模型从而达到这一目的。
比如我们对一支股票进行建模,或者对一个喝的醉熏熏瞎逛的人进行建模,我们不能仅仅用文字来表达,我们必须把文字变成代码。这在某种程度上对我们是一个很难受的考验。我们需要问自己,我们是不是真的对这句话理解了,如果我没有理解,我是不能把这句话转换成代码的。这对一个计算机人来说,既是一个坏事也是一个好事。坏事是:你没有办法伪造了。这就是为什么我们花费大量时间的原因。因为我们一跑代码,它要么运行,要么不运行。不像我们写一篇论文,我们可以自欺欺人的说这篇论文写得不错。好事是:一旦成功,你会清楚的知道成功了,而且能从中学到有用的东西。因为计算机可以执行你的指令,这就是有意思的地方,也是乐趣所在。
一个计算性思维的例子
一些计算思维的例子
Examples of Computational Thinking
这些问题有多难,我们如何最优的解答它?
How difficult is this problem and how best can I solve it?
计算机理论给了我们这些问题和相关问题的精确解答
Theoretical computer science give precise meaning to these and related questions and their answers
递归思想
Thinking recursively
把一个看似很难的问题转化成我们知道如何解决的问题
Reformulating a seemingly difficult problem into one which we know how to solve
缩小规模 Reduction
嵌入 Embedding
转换 Transformation
模仿 Simulation
首先我们会问这个问题有多难呢?对于用一个计算性思维解决的问题,我们有一个本质的难度,这与你解决方案的效率无关。然后我们的问题是,我们怎么得到最优解,计算机科学理论给了我们这些问题准确的解释。
然后我们要考虑递归思想,当我们考虑一个很复杂的问题时,我们会把它用一个我们已经知道怎么解决的问题的形式表达出来。经常,这个问题可以是一个缩小的问题。比如,一开始我们会想,天哪,这个太难了,然后我们假设一个数组只有2个元组,那我就知道怎么对它进行排序了吧。然后我们可以把这个递进进去再看情况。因此我们可以用这种思想去对任意大小的数组进行排序。我们学习递归思想的一部分好处就是,我们可以缩小问题的规模。我们可以把规模缩小,使得我们面临的是一个优化了的背包问题。一旦我们解决了这个问题,我们可以说,哦,我们知道如何解决所有的背包问题了。
动态规划(Dynamic programming)已经存在很长时间了,我们用这种方法就可以了。我们通过减少问题的规模来把一个事情转变成另一个形式。关注重要的东西,这种技能不仅仅在计算机世界很重要,在生活中也很重要。
我们选择一个合适的表达,对一个问题的相关抽象进行建模使其具有可操作性
Choosing an appropriate representation or modeling the relevant aspects of a problem to make it tractable
损失遏制,改正错误
Prevention, detection, and recovery from worst-case scenarios through redundancy, damage containment, and error correction
编程和加密
Using the difficulty of solving hard problems to foil would be evil doers
接下来,我们要选择一个合适的表达,对一个问题的相关抽象进行建模使其具有可操作性,这是计算机科学家学习抽象一个很重要的用途。建模就是指出什么和问题是相关的,找到相关的东西,忽视那些不相关的东西。我们还会担心出现最坏的情况,担心入侵遏制,担心怎么去改正错误等等,说到这些,我们就要去说调试和防卫性编程了,这让我们确保类型是正确的。这些都是我们考虑的很普通的问题。有时候,当真的有很严重的问题存在时,这会是一个很好的事情,因为这可以让我们对隐私数据做一些加密性的操作,或者对我们的通信和电话进行加密。因为我们已经知道一些问题在本质上是很难解决的。那么这就该轮到编程和加密出马来干活儿了。
一个专攻医学的计算机小组在做什么
目标 Goals
帮助人们活得更长更好
Help people live longer and better quality lives in collaboration with clinicians
推进计算机科学、电子工程和医学前沿的事情
Have fun pushing the frontiers of Computer Science,Electrical Engineering,Medicine
技术领域
Technical areas
机器学习
Machine Learning
集群
Clustering
数据挖掘
data mining
算法设计
Algorithm design
信号处理
Signal processing
软件系统
Software systems
这个小组的目标是想让人们活的更久一点,活的更好一点。
小组主要研究计算机科学、电子工程和医学前沿的事情。和一些物理学家紧密合作。这些都是非常有技术含量的工作。我们会用到机器学习,集群,数据挖掘、算法设计、信号处理。但是每一件事情最后,我们都是把它们转换成我们可以运行的代码。我们对软件系统和质量都非常在意,我们写一些向人的大脑植入电磁信号之类的操作。当你设计实现这个功能的系统的时候,这就需要很仔细了(至少如果你喜欢这个人的话)。我们研究如何从人体的电波中提取出临床有用的信息。通常从心脏、大脑以及其他的连接解剖中提取。
这个小组主要做两个研究:
一个是预测心脏病
一个是检测癫痫并做出应对
首先是癫痫,也许我们会对一个数据感到吃惊,那就是世界上每100个人中就有1个是癫痫。在美国这种发达国家是这样,在中非一些不发达国家也是这样。这种病是和经济状况关系无关的很少的病中的一种。很多癫痫病人都会隐瞒自己得了病这个事实。很多人因为不想丢工作,从而隐瞒了自己得病的事实。与其说癫痫是一种疾病,还不如说癫痫是一种症状。因为这种病是由很多不同的原因诱发的,有可能是遗传的,也可能是后天脑损伤引起的。比如人们中风了,或者严重感染了,都可能引起癫痫。这种病以周期性的癫痫发作为特征,由脑部不正常脑电活动引起的。
图中是脑电图扫描,扫描人体脑部表层电波。脑袋上戴着的很像浴帽的东西就是电极了。它会记录大脑的电波。有些癫痫会发生意识丧失性的中断,就像大脑突然中断一样。如果你正在开车,那就有危险了。
这里的关键点是,癫痫的发作看起来是不可预期的,癫痫不能被预测,这就是真正有风险的地方了。癫痫的自我局限能力很强,在一两分钟之内就会迅速恢复正常。但是因为癫痫是不可预测的,所以尽管人们可能一年就发作两次,但对他们生活的影响还是很大。因为如果你是一个小孩子,你就不被允许骑自行车。如果你是一个成年人,你也不被允许开车。几乎每个癫痫病人都受过重伤,比如当他们上楼时癫痫发作,就会让他们摔下来摔坏头骨,并造成头盖内血肿。如果他们正在做饭,他们会被烧伤。他们也可能在洗澡的时候掉到浴缸里去。因为无法预测所以往往造成很糟糕的结果。死亡率也比正常人高2-3倍。通常是由癫痫事故引起的。还有一种1%的突然死亡,通常发生在晚上,推测原因是因为他们睡觉时发生癫痫,然后脸朝下趴在枕头上,窒息而死。所以如果你是一名父母,如果你的孩子得了这种病,你肯定会睡不好的。
因此我们想到做点什么来改变这个现状,首先,我们的想法是提前检测到癫痫。
对于癫痫来说有两种开始时间的定义。电记录的和临床诊断的。
电记录:当大脑活动开始变的看起来可疑的时候。
临床诊断:当出现明显的生理临床征兆的时候,比如身体变僵硬。
两个发现的时间点
Two onset times
电记录
Electrographic
临床
Clinical
电记录检测
Detecting electrographic onset
使用脑电波探测
Use scalp EEG
治疗价值
Therapeutic value
提供警告
Provide warning
寻求帮助
Summon help
快速产生效用的药物
Fast acting grugs
神经刺激
Neural stimulation
有可能癫痫的反应消失的太快以至于你们都没注意,当你仔细看脑电波记录的话,你们会发现在她出现临床症状之前记录就有异常了。因为异常反应是大脑中的电波活动引起的。从定义上来说,脑电波引起了这些症状,所以我们的想法是检测到电记录的开始时间,如果我们能做到这一点,我们就可以发出警告了。所以我们可以让人们从楼梯上摔下来前坐下来,从浴缸里出来,离火炉远点。只是一个口头的警告就会非常有用。你也可以求助他人,可以提醒父母,你的孩子快要发病了。还可以提前吸取一定药物,比如Ativan,可以阻止或者减轻癫痫的发作。
还有一种未被证实的可能性是,如果在癫痫发作时,实施正确的电刺激的话,你就可以防止癫痫的发作。
癫痫是很难被发现的,你可能认为EEG里面某个点是癫痫的开始,但其实不是。病人之间的脑电波是不同的,癫痫患者的基线也是不同的。人们花了40年的时间来制作癫痫发作探测器,但一直不是很成功。大多数医院都会选择关闭掉对脑电波的癫痫发作探测器。因为这些探测器根本不管用。
不同的病人脑电波图不一样
EEG varies greatly across patients
癫痫患者的基线也是不同的
Epileptics have abormal baselines
通用的癫痫探测器没有什么作用
Generic detectors have not worked particularly well
某个特定患者的脑电波的情况会是一致的
Pretty consistent patterns for an individual
Use patient-specific detectors
使用高度特定的探测器
使用机器学习制作特定的检测器
Use machine learning to build patient-specific seizure onset detector. Highly successful retrospective studies
使用神经刺激
Turn on neural stimulator at start of seizure.
贝斯以色列女执事医疗中心研究进展
Study in prpgress at BIDMC
好消息是,尽管每个脑电波看起来都不同,但是一旦你认识到了某个特定患者的脑电波的情况,这个患者的脑电波情况会是一致的,包括发作期间。这个信息告诉计算机科学家,我们可以用机器学习来看看每个病人的脑电图情况。然后建立一个高度特定的探测器,这个探测器只能适用于一个病人而不能用于他人。然后我们安装,这样每个人都有自己的探测器。因此我们不是做一个大家都能用的探测器。而是设计一个适合特定病人的探测器。计算机科学家在这点上研究了6年,然后成功了。目前已经给80个客人安装了探测器进行实验,结果相当成功。
如图是一个神经刺激器,刺激器被植入到锁骨下面,然后通过一根线向上走,并环绕左交感神经电线(这个神经是人类体内最长的神经,它从脑部出来,一直延伸到大肠,这个神经控制一些很神奇的事情,比如控制你饿还是不饿,但它主要的功能是控制心脏的副交感神经系统,大脑通过这个神经告诉心脏慢下来,不仅仅可以从大脑往下传递信息,也可以从下部往上传递信息。)当癫痫发作的时候,我们在这个电线上加一个脉冲,我们模拟大脑,然后就可以终止癫痫的发作。这就是我们应用的理论,当我们用老鼠做实验的时候,这样做已经被证实可以阻止癫痫的发作。
预测死亡
大概有125万美国人每年会得严重的冠状动脉综合症
Acute eoronary syndrome(ACS)common:~1.25M/year in U.S
大约15-25%的人会在4年内因为心脏问题而死亡
15%~20% of these people will suffer cardiac-related death within 4 years
Stratifying risk key to choosing treatments
谁应该植入一个电震发生器
Who gets a defibrillator?
谁应该用抑制素药物进行主动治疗
Who should be treated aggressively with statins
有一个更好的方法来处理这事情
We think that we have a new and better way of doing this
不同形态变化
Morphological variability
大概8000名病人的心跳数据库
Tested on 8000*2*24*60*70 heart beats
大概有125万美国人每年会得严重的冠状动脉综合症,这些综合症也就是一些心脏的疾病。其中大约15-25%的人会在4年内因为心脏问题而死亡。事实上,我们可以治疗这种症状,但是我们不知道治疗谁,所以,谁应该植入一个电震发生器。谁应该用抑制素药物进行主动治疗,我们不清楚。我们已经在相当庞大的数据库中做了测试,我们有一个大概8000名病人的数据库,我们对每名病人观察两天,一天24小时,1小时有60分钟。1分钟有70次心跳,这样算下来有超过10亿的心跳了。这个测试结果非常有说服力。
例如:这是植入的电击器,他们同样也是植入到锁骨下面的。然后连接到心脏上,注意它们有一个感应器,当感应器感应到心脏跳动的情况不太好的时候,它们就会震动心脏。
在美国,差不多每两分钟就会因为心脏病死掉一个人。如果这些人都植入了我们说的电击器,他们中的很多人就不会死了。还有突发性心脏病猝死。这些提醒我们的技能和智慧要用来做一些真正有用的事情。我们会去从心跳图的形状来判断当前的情况,我们实际上是用动态编程(dynamic programming)来实现这一点的。我们做了很多次实验,我们在病人中挑选了25%的高危病人,实际上前30天,这些人中的4.19%已经死了。 如果我们检测到高危病人,我们可以给他植入一个点击器,或者进行动脉清理,或者注射血液稀释剂。
讲了这么多,那么最后我强调的一点是:
我们学习的计算机知识是真的很有用的,并且可以用来做一些非常有价值的东西。
回复列表