【0003小程序第三弹】寻找失踪的核弹~~~贝叶斯失物查找演示
drracket吧
全部回复
仅看楼主
level 11
最近飞机丢了,大家都很关心,很着急,紧急发帖,出谋划策~~~~
先上程序,然后上历史介绍,米国核弹寻找的故事~~~
[勉强]
2014年03月11日 14点03分 1
level 11
#lang racket
;;;贝叶斯查找程序
;;;(change p q r y/n)
(define (sum-vector vect)
(let ((len (vector-length vect)))
(let loop ((len (- len 1)) (result 0))
(cond ((>= len 0)
(loop (- len 1) (+ result (vector-ref vect len))))
(else
result)))))
;;;数据改变函数
(define (r-d num n)
(string->number (real->decimal-string num n)))
(define (r-d5 num)
(r-d num 5))
(define (change p q r y/n xz)
(let* ((p (/ p xz))
(1-pq (- 1 (* p q)))
(1-q (- 1 q)))
(cond ((eq? y/n 'y)
(r-d5 (/ (* r 1-q) 1-pq)))
(else
(r-d5 (/ r 1-pq))))))
;;;建立数据结构模型
;;;失物在某区域的概率模型 P(Mn)
(define B-lost (vector .1 .2 .05 .25 .15 .2 .05))
;;;各种因素(地形等)能够找到的概率P(Y|Mn)
(define B-find (vector .9 .8 .95 .75 .45 .23 .99))
;;;确在此处并且找到的概率
(define (B-win) (vector-map (lambda (a b) (r-d5 (* a b))) B-lost B-find))
;;;向量中最大元素的位置
(define (vector-max-pos vect)
(vector-member (vector-argmax + vect) vect))
;;;贝叶斯地图查找
(define (Bayesian-mapfind . pos)
(define xz (sum-vector B-lost))
(define (b-h1 pos)
(let ((max-pos (vector-max-pos (B-win)))
(use-pos '())
(len (vector-length (B-win))))
(cond ((null? pos) (set! use-pos max-pos))
(else (set! use-pos pos)))
(let ((p (vector-ref B-lost use-pos))
(q (vector-ref B-find use-pos)))
(let loop ((len (- len 1)))
(cond ((>= len 0)
(cond ((eqv? len use-pos)
(vector-set! B-lost len
(change p
q
(vector-ref B-lost len)
'y
xz)))
(else
(vector-set! B-lost len
(change p
q
(vector-ref B-lost len)
'n
xz))))
(loop (- len 1)))
(else
(display "No find in ")
(displayln use-pos)
(display "B-lost : ")
(display B-lost)
(displayln (r-d (sum-vector B-lost) 3))
(display "B-find : ")
(displayln B-find)
(display "B-win : ")
(displayln (B-win))
(display "Next Find pos ")
(display (vector-max-pos (B-win)))
))))))
(cond ((null? pos)
(b-h1 pos))
(else
(b-h1 (car pos)))))
(define bmf Bayesian-mapfind)
;;;test
(bmf)
(define (do-n fun n)
(let loop ((n n))
(cond ((> n 0)
(fun)
(loop (- n 1)))
(else
'Finish))))
;(do-n bmf 10000)
2014年03月11日 14点03分 2
level 11
死理性派发明的贝叶斯大法还是不可小视的,美国海军在汪洋大海里搜索丢失的氢弹、失踪的核潜艇都用过这种方法,下面我们就由情感频道转台到历史频道。
  1966年1月的一天,美国一架B-52轰炸机在西班牙的帕洛玛雷斯上空飞过,飞机上的几位飞行员在执行着空军司令部安排给他们的空中加油任务。按理说这次飞行称不上危险,据说机长还是个很淡定的人,没事儿喜欢拿个大烟斗抽两口,甚至在飞机飞行舱里也不例外。可是这一会机长和他的几个部下可遇到大麻烦了,以后能不能再享用大烟斗都难说了。在一次加油的时候,负责加油的运输机试图从其右后侧方接近B-52轰炸机,以便把柔性输油管送至对方飞机上。两机速度没有控制好,互相撞擦了一下,这一“亲密接触”不要紧,加油机的油立刻起火爆炸,B-52也被撞的不轻,两架飞机的飞行员当场死的死,跳伞的跳伞……
  可是故事还没有完,之后又发生一连串的悲剧和喜剧
  为了找那一枚丢失的氢弹,美国赶紧从国内调集了包括了多位专家的搜索部队前往现场,其中也包括一位名为John Craven的数学家,头衔是“美国海军特别计划部首席科学家”,既然是特别的,那就不是一般的,Craven博士做的工作到底有什么特别之处呢?
【John Craven】
  在寻找氢弹的问题上,Craven提出的方案使用了刚刚提到的贝叶斯方法,他召集了各方面的专家,不过每个专家都有自己擅长的领域,并非通才。有的对于B-52轰炸机了解甚多,却对于氢弹的特性知之甚少。氢弹如何储存在飞机上是一个问题,氢弹怎么从飞机上掉下来又是一个问题;氢弹会不会和飞机残骸在一起也没有答案;氢弹上的两个降落伞各自打开的概率是多少?风的流速和方向?氢弹落到地上之后会被埋到土里吗?
  对于这些各式各样的问题,Craven要求专家们做出各种假设,想象出各种情景,然后在各种情境下猜测出氢弹在各个位置的概率,以及每种情境出现的可能性。
  Craven的做法也受到了同行的质疑,因为在他的方案中,结果很多是这些专家以猜测、投票甚至可以说赌博的形式得到的,无法保证所有结果的准确性,可是因为搜索氢弹的任务紧迫,并没有时间进行精确的实验、建立完整可靠的理论,Craven的办法不失为一个可行的办法。
  Craven得到了从专家那里“招供”的结果后,综合到一起,画了一张氢弹位置的概率图:把整个可能的区域划分成了很多个小方格,每一个小方格有不同的概率值,有高有低,如同地图上表示山峰和山谷的等高线一样。像判断女孩是否单身的死理性派们一样,Craven完成了贝叶斯方法的第一步。
  之后,Craven和搜索部队的指挥官一起开始了对氢弹的搜索,在搜索的过程中同时对每个格子的概率进行更新,不过,概率最大的方格子指示的位置常常是陆地上险峻的峡谷和深海区,即使氢弹真的在那里,也未必找得到,所以需要绘制另一张概率图,表示“氢弹已经在那里,能找到的概率”而不是氢弹位置的概率。最后氢弹被找到,Craven的两张概率图和他的贝叶斯方法发挥了不小作用。
  仅仅过了两年,到1968年,Craven又有机会发挥一下才能了,上回丢了个小小的氢弹,这回美国海军丢了个“大个儿”的。
  1968年6月海军的天蝎号核潜艇在大西洋亚速海海域一下子失踪了,潜艇和艇上的99名海军官兵全部杳无音信。按照事后调查报告说法,罪魁祸首是这艘潜艇上的一枚奇怪的鱼雷,发射出去后竟然敌我不分,扭头射向自己,让潜艇中弹爆炸。
  为了寻找天蝎号的位置,美国海军进行了大规模的搜索,Craven自然也参与其中。由于失事时潜艇航行的速度快慢,方向,爆炸冲击力的大小方向,爆炸时潜艇方向舵的指向都是未知量,即使知道潜艇在哪里爆炸,也很难确定潜艇残骸最后被海水冲到哪里。Craven初略地估计一下,在半径20英里的圆圈内的海底,天蝎潜艇都有可能躺在那里,要在这么大的范围内、这么深的海底找到潜艇几乎成了不可能完成的任务。
  没有专家能准确的估计到,在出事前后潜艇到底发生了什么,和搜索氢弹的时候一样,Craven咨询了数学家、潜艇专家、海事搜救各个领域的专家,编写了各种可能的“剧本”,让他们按照自己的知识和经验对于情况会向哪一个方向发展进行猜测。据说,为了给枯燥的工作增加一些趣味,Craven还准备了威士忌酒作为“投注”
正确的
奖品。
  最后,Craven得到了一张20英里海域的概率图。整个海域被划分成了很多个小格子,每个小格子有两个概率值p和q,p是潜艇躺在这个格子里的概率,q是如果潜艇在这个格子里,它被搜索到的概率。按照经验,第二个概率值主要跟海域的水深有关,在深海区域搜索时失事潜艇“漏网”的可能性会更大。如果一个格子被搜索后,没有发现潜艇的踪迹,按照贝叶斯原理更新后,这个格子潜艇存在的概率就会降低:
  其他各个格子的潜艇存在的概率值就会上升:
  每次寻找时会挑选整个区域内潜艇存在概率值最高的一个格子进行搜索,如果没有发现,概率分布图会被“洗牌”一次,搜寻船只就会驶向新的“最可疑格子”进行搜索,这样一直下去,直到找到天蝎为止。
  最初的时候,海军人员凭经验估计潜艇是在爆炸点的东侧海底,对于Craven和其它数学家的建议嗤之以鼻,但是几个月的搜索后一无所获。后来海军不得不听从了Craven的建议,按照概率图,失事后的潜艇应该在爆炸点的西侧。经过几次搜索,潜艇果然在爆炸点西南方的海底被找到了。
  经过两次给力的表现,Craven在海事搜索中使用的贝叶斯方法逐渐被广为接受,从此,贝叶斯方法意想不到地常常和氢弹、核潜艇一起成为关键词在各处出现。几十年间,贝叶斯方法应用越来越广泛,从google搜索筛选词条到无人驾驶汽车综合判断自己的行驶位置,钻进了各个角落。当然,这个神奇的方法用在追女上实在是大材小用了。
2014年03月11日 14点03分 3
level 1
写得好认真啊【惭愧
2014年03月11日 15点03分 4
level 11
贝叶斯统计方法。
贝叶斯方法简单的说就是“先验概率+新得到的证据=更正后的概率”,可以不受信息量多少的限制,将各种来源的结果,包括主观判断和有限的客观信息,综合到一起,得到最后的结论。
2014年03月12日 11点03分 5
level 3
我一直搞不明白let loop是怎么循环的
2014年03月12日 12点03分 6
现在手机,你单独发个帖吧,明天电脑上解答。[呵呵] 建议你看一下r5rs标准,有中文版的,里面有详细定义和示例。
2014年03月12日 12点03分
[哈哈]R5RS标准总共才50页哦,号称最短的编程语言标准。相比较common lisp 1000+ ,c++ 1500+[黑线]
2014年03月12日 12点03分
现在可以上电脑了,每天晚上6~11点百度贴吧就卡的要死。。。 let loop 可以理解成带赋值的局部函数定义 (let fun1 ((a 2) (b 3)) (if (= a 0) b (+ b (fun1 (sub1 a) b)))) ------ (define (fun2 a b) (if (= a 0) b (+ b (fun2 (sub1 a) b)))) (fun2 2 3) 比较以上两段代码意思是相同的。
2014年03月12日 15点03分
你复制到解释器里整理下格式,比较,运行一下,应该就懂了。 let loop --- loop 其实可以是任何函数名,但let形式是局部函数定义用完就没用了,作用域就在let范围内,所以特别去取一个名字没什么意义,而且程序一般都类似于循环结构所以大家一般就统一用loop这个函数名了。
2014年03月12日 15点03分
level 2
支持一下楼主
2014年10月12日 14点10分 7
level 1
请问楼主,你发的那个程序应该用什么软件运行啊?matlab和microsoft visual C++我都用过了,都运行错误耶[呵呵][哈哈][泪]
2016年01月21日 03点01分 8
1