Flyaway's Bloghttp://zhouyichu.com/2021-01-03T10:29:00-07:00Computers are useless. they can only give you answers.2020年度总结2021-01-02T11:30:00-07:002021-01-03T10:29:00-07:00Flyawaytag:zhouyichu.com,2021-01-02:/words/Summary-2020/<p>2020年年度总结</p><p>悲催的2020年终于过去了,该好好整理整理这一年的收获了。</p>
<h1>科研</h1>
<p>科研方面,又投了一篇工作,目前还在review中,还不知道结果。
这次的工作是我自己比较看重的,估计我的毕业论文将会围绕这项工作展开。
希望在新的一年里,在这个研究方向上能有所突破。</p>
<p>另外,今年也开始了自己的research blog,主要是以英文和研究工作为主的博客主页。
希望这样一个平台能够为自己打打广告。</p>
<h1>实习</h1>
<p>今年拿到了美国腾讯的实习机会,可惜是因为疫情原因没能现场过去,只能以远程的方式进行实习。
实习的过程还算不错,让我认识到了自己和工业界之间的区别,帮助我确立了下一阶段的目标。</p>
<h1>读书</h1>
<p>最近几年的阅读习惯是原来越差了,去年全年阅读了40本,今年只有28本,一年比一年少。
不过,后来思考了一下,这也是没办法的事情,毕竟现在已经处于攻读博士的后半段时间了,我需要把所有的精力和时间都放到科研和毕业上面。
在吸取了去年的教训之后,今年的阅读计划更加有针对性,更加主题化。
今年的阅读主题是投资理财方面的,阅读了不少投资理财方面的经典著作,都是一些英文原文的大部头,虽然看得慢了一些,但是还是很有收获的。
让我对美国的金融体系有了一个初步的理解。</p>
<h1>健身</h1>
<p>今年的健身算是废了,从4月份健身房关闭之后,就再也没能进行系统的健身了。
虽然在家的时候,也会进行有限度的健身,但是效果肯定是无法和健身房比拟的。</p>
<h1>每周一文</h1>
<p>今年的每周一文计划写了33篇,和去年没有什么太的变化。
总是会因为各种各样的原因断更,一旦断更之后,就几乎没有什么动力重新开始了。
今年年底的时候,好好思考了一下,决定明年暂时会取消每周一文计划。
我需要把更多的时间放在科研上面,现在开始要为了毕业开始冲刺了,不能继续把精力分散在其他方面了。</p>
<h1>感悟</h1>
<p><strong>一年之内能做的事情其实并没有多少</strong></p>
<p>每年做这么一次总结,每每都发现,其实一年之内能够完成的事情并没有多少。
年初的时候,总以为时间很多,给自己安排很多的任务。其实到头来真正能够完成的又有多少呢?
现在越来越感同身受吴军老师的一个说法,我们应该关注的<strong>完成</strong>了多少事情,而不是<strong>开始</strong>了多少事情。</p>注意力管理2020-10-10T10:15:00-06:002020-10-10T10:54:00-06:00Flyawaytag:zhouyichu.com,2020-10-10:/weekly-blog/attention/<p>时间管理只是注意力管理的一个近似</p><p>我在过去几年的博文中,我不断提到过计划的重要性、时间规划的重要性。
关于时间规划,近期我又有了一个新的体悟。
在做好计划的前提下,在具体执行计划的时候,我们真正需要的是进行<strong>注意力的规划</strong>,而所谓的<strong>时间规划</strong>其实只是注意力规划的一个近似而已。
因为我们无法直观的量化注意力,所以我们才会用时间来进行近似和量化。</p>
<p>过去几年我得出的结论是,为了保证工作上的进度,一个简单的策略就是我们可以在固定的时间去做固定的事情。
这样就能保证各项不同的工作都能有序的进行。
但是,我后来慢慢发现,做一件事有多集中注意力比在这件事上花费多少时间重要得多。
高度集中的注意力可以大幅提高工作效率,这是毋庸置疑的。但是,人的注意力的分布是不平均的,不同的身体状态会导致不同的注意力水平。很多时候,这其实不受主观控制。
我们进行时间规划的一个主要目标是为了尽量让自己在状态好的时间段内去完成更加重要的工作。
就我自己来说,上午的时间时我注意力最高的时候,通常是用来完成一天之中最重要的事情。</p>
<p>但是,固定的时间规划并不一定能完全反应出身体的变化。比如,如果前一天晚上失眠了,第二天的状态一定会不好。
如果在这种时候继续原来的时间规划,可能就无法按时完成任务。这种时候就需要放弃「固定时间做固定的事情」的原则了,应该重新安排适合自己当前注意力状态的工作。
这样才能保证自己的每一分注意力都用在最值得的地方。</p>
<p>在具体的实践过程中,我们每天的注意力的变化浮动其实并没有很大,通常注意力最高的时段都是固定的时间,因此我们可以用「固定时间来做固定的事情」这一策略来近似最大化我们注意力的效用。
但是,当出现一些意外情况导致我们的注意力分布产生变化时,相应的时间规划也需要做出适时的改变。
这种时候,我觉得就不能继续拘泥原先的规划了,必须要做出适当的改变,才能保证工作的进度和质量。</p>
<p>因此,我现在的策略是首先做好一周的工作安排,细分到每一天需要完成的任务,然后根据任务的重要性分配不同的时间段工作。
但是,如果工作中发现自己的状态明显下降了,注意力无法集中,那就需要马上做出改变。
将自己切换到不是那么重要的工作中,重新调整好自己的状态。
等自己的注意力恢复之后,继续重要性较高的工作。</p>英雄2020-09-19T10:34:00-06:002020-10-10T10:07:00-06:00Flyawaytag:zhouyichu.com,2020-09-19:/weekly-blog/heros/<p>中西方英雄之对比</p><p>之前的一篇博文中提到了中国的「圣人」文化,这次我想谈谈中国式的英雄。
圣人和英雄这两个概念其实有着一定程度上的交集,但是英雄更加具有侠义和铁血的色彩,并且通常是某种制度的守护者或创建者,比如刘关张桃园结义、比如霸王自刎乌江、比如岳飞曲死风波亭。
在我心中,所谓的英雄就是能坚持自己心中的「道」的人,简单的说,他们都是殉道者。
无论这个他们坚持的「道」是否是时代的主旋律。从这个角度来说,其实投湖自尽的王国维也能算得上是一个英雄。</p>
<p>西方文化中的英雄和中国的英雄的又略有区别。
总体来说,中国的英雄形象和我[之前]提到的圣人很相似,都是有着一种悲天悯人的感觉,所谓侠之大者,为国为民;
而西方文化中的英雄则觉有更多的冒险和反叛精神,比如蝙蝠侠、绿箭侠等。
虽然都是救助他人,但是触发点并不相同。中国推崇的英雄更偏向于守护或征服,比如曹操、比如刘关张,虽然他们也有个人武力,但并不是最重要的;
而西方文化中的英雄则是对制度的一种反叛,正因为制度无法保护普通人,才会出现了西方式的英雄,而且西方的英雄通常都具有高强的武力.</p>
<p>这两者的区别也正反映出了两种文化的区别,中国自古就是自上而下的统治,所谓的英雄大都都是统治阶级;
而西方文化都透露着保守主义的思想,西方的英雄都是站在弱势的一方,自下而上的反抗。
不管是中国的英雄还是西方的英雄,他们都是各自文化中不可获取的一部分,都是想象的共同体中的一部分</p>
<p>然而,历史上真正的英雄又有几人呢?之前提到的刘关张结义、霸王自刎等等令人唏嘘的故事,其实很多都是后人的演绎,他们将自己对英雄的想象投射到这些历史人物身上。虽然这些历史人物不一定都是演绎中的英雄,但是正是这些演义中的英雄形象,培养了一代又一代的中国人,成为了中国的精神脊梁。</p>圣人2020-09-19T09:47:00-06:002020-09-19T10:37:00-06:00Flyawaytag:zhouyichu.com,2020-09-19:/weekly-blog/saints-culture/<p>中国的「圣人」文化</p><p>在很早的时候,我就发现中国拥有很严重的「圣人」文化。从古至今流传着很多关于「圣人」的神话和故事,比如大禹治水三过家门而不入、孟母三迁等等。
在我们的思想观念中,「圣人」永远是对的,「圣人」的话就是绝对真理。
这也导致了后世多少人一辈子只学四书五经,只学圣人之言,但是却连最基本的生活常识都没有。</p>
<p>包括后来的皇权制度,其实也都深深受到了「圣人」文化的影响。人们都期待出现一个圣明的皇帝,带领他的子民走向繁荣昌盛。
这也就解释了,为什么中国社会上千年来只是在皇权制度下的不断轮回,改变的永远只是朝代,而不是制度。</p>
<p>可是,所谓的「圣人」就一定不会犯错吗?<a href="https://zh.wikipedia.org/wiki/%E5%AD%99%E7%9A%93%E6%99%96">孙皓晖</a>先生在他的大型历史小说「<a href="https://zh.wikipedia.org/wiki/%E5%A4%A7%E7%A7%A6%E5%B8%9D%E5%9B%BD_(%E5%B0%8F%E8%AF%B4)">大秦帝国</a>」中就借商鞅之口,批判这种思想。把整个国家的命运维系在一个所谓的「圣人」身上是极为不明智的。百姓对一个十全十美的「圣人」的期待完全是错误的,美好的生活是靠自己创造的,不是依靠什么「圣人」来创造。「圣人」首先也是人,他也有七情六欲,他也有私心。
百姓生活的保障应该来自于超越个人的一种制度,而不应该把这种保障放在一两个人身上。</p>
<p>中国人印象中的「圣人」应该是十全十美的,是没有私心的,是可以为了天下百姓放弃自身一切的人。但是,不知道人们有没有想过,一个人如果能为了一群不想干的人而放弃自己的家庭、甚至牺牲自己的亲人,这样的人真的值得信赖吗?一个连自己的家人都不爱的人,怎么能期待他十全十美,一心为公?</p>
<p>来美国这么几年,我深深体会到了保守派的思想。保守派的思想和所谓的「圣人」思想完全相反。保守派首先相信美好的生活是靠自己创造的,不是依靠圣明君主,不是靠十全十美的圣人,而是靠自己的勤劳的双手。
其次,保守派没有太多家国天下的概念,他们只想管好自己的一亩三分地。这也充分解释了二战之前美国的孤立主义政策。
具体到个人,保守主义者首先会管好自己的家庭,<strong>有余力之后</strong>会为自己所在的社区做出贡献;再有余力之后,会为城镇做出贡献。
他们的做事方式是永远从自己的家庭出发,一点点向外扩展。
作为的对比,中国的「圣人」思想就是相反的,他们一出现就是凌驾在所有人之上的,他们没有家庭、没有私欲,一心只想造福百姓。
这也解释了中国社会的管理模式一向都是自上而下的,而美国的管理模式都是自下而上的。</p>
<p>略微想想,其实就能知道,中国的「圣人」文化只是一种水中花,镜中月,只是一种想象中的理想情况。它完全忽略了人的七情六欲,忽略了是个人都有犯错的可能。
好在,现在的中国社会,这种「圣人」文化正在逐步消失,至少再也没有人把孔孟之道放在口上了。</p>宗教2020-09-12T10:05:00-06:002020-09-12T11:11:00-06:00Flyawaytag:zhouyichu.com,2020-09-12:/weekly-blog/Religion/<p>我的宗教信仰</p><p>宗教是一个很敏感的题目,毕竟这种世界上的大部分人是有宗教信仰的。
但是,我今天还是想谈谈自己的宗教观。
先说一下结论,我相信存在着某种超越现在人类认知的力量存在,这种力量可以认为是人类还未发现的物理规律,也可以认为是无所不能的神。
我相信存在这样一种超越目前人类认知的一种力量在支配着这个世界的运行。
但是,至于说,这种力量是否是自己的意识,我不知道; 这种力量是否在守护人类?我也不知道。</p>
<p>我并不信仰任何已知的宗教,因为我觉得这些宗教其实也是在随着时代的变迁而在不断修正自己对教义的解读。
这是一件好事,不然人类可能永远会被困在中世纪的时代。
但是,这也说明了,这些宗教的教义其实并不能完美解释这个世界。
他们不得不因为社会的变迁做出相应的改变,本质上,他们是在修正自身去适应世界,而不是从本质上解释这个世界。</p>
<p>需要注意的是,我只是说我不信仰任何已知宗教,并没有说这些宗教是不对的。
宗教信仰这种事情,其实是无法用逻辑来证明或推理的,它就是一种信仰问题。
信则有,不信则无。
我不认为信仰就是迷信;不信就是渎神。</p>
<p>对于宗教的种种问题,因为它本身具有的不可证伪属性,任何与其相关辩论其实都没有太大的意义。因为反正不可证伪,总是可以自圆其说的。</p>
<p>可是,对于宗教有一点我是无法忍受的。那就是一神教的排他属性。人类历史上的很多悲惨的事情都是因为一神教的排他性导致的。
比如十字军东征、比如ISIS。人类披着神的外衣做出了太多悲惨的事情。
不过,随着现代社会的发展,一神教的傲慢几乎已经被消磨殆尽了。
他们不再傲慢,变得愿意接受其他宗教的存在。
这其实也是一种宗教随着社会的改变而改变的一个例子。</p>Research Blog发布2020-09-05T09:33:00-06:002020-09-05T10:51:00-06:00Flyawaytag:zhouyichu.com,2020-09-05:/weekly-blog/research-blog/<p>自己的新Research blog正式建立</p><p>为了进一步提高自己的research写作能力,我在几个月前就开始筹划建立自己的research blog。
在写作几篇博文之后,我的research blog正式上线了,地址在<a href="http://research.zhouyichu.com/">这里</a>.
这个新开设的博客将会有以下的特点:</p>
<ol>
<li>它将会是全英文的,我建立它的一个重要目标就是不断打磨自己的英文写作能力</li>
<li>它的主题将仅限于NLP相关的研究,目前的设想将会是写一些科研的调研论文。这样,既能加强我自己对最新研究成果的理解,也能在将来作为一个查询参考,快速定位到自己感兴趣的论文。</li>
<li>将来我也会开始将自己的工作整理成博文,在自己的博客上进行推广。</li>
</ol>
<p>我打算建立的这样一个专注于研究的博客,主要有如下几个原因:</p>
<ol>
<li>
<p>加深自己的对相关研究领域的思考与认知。
通过最近两年对weekly blog的坚持,我越来越觉得写作的重要性。
要完成一个高质量的写作任务,不仅仅是要磨练写作的技巧,更重要的是在写作过程中重塑自己的思想,加深自己思考的深度。
另外,为了写好调研文章,需要有大量的阅读作为基础,这就可以倒逼我自己阅读大量的论文。
按照我之前的经验,阅读一篇论文之后,如果和自己的研究方向差距比较大,其实很快就会忘记了。
但是,通过进行调研写作,能很大程度上给自己的大脑留下更多的印象。
当将来遇到类似的问题的时候,不会显得不知所措了。</p>
</li>
<li>
<p>即使在科研领域,也是要讲究推广的。我发现很多做得好的实验室都是非常会做营销的。他们会不断推出自己的博文、公众号,写作各种科研文章来推广自己的实验室。而且在投稿会议的时候,热门的话题或方向的录用率也更高。
因此,为了建立自己在研究领域的声名,我决定建立一个自己的research blog,作为推广自己的第二战场。</p>
</li>
</ol>
<p>维护这样一个research blog,我已经想见必定需要付出不少的精力。毕竟我对它的定位是一个职业的、客观的学术博客,不能像普通的博客一样那么随性,想到什么就写什么。
为了写好每一篇博文,我需要进行大量的准备工作。
即使是这样,我还是相信这样做是有意义的。我需要这样一个工具或者平台,来倒逼自己更加努力的工作。</p>自我迭代的行为原则2020-08-29T10:19:00-06:002020-08-29T10:55:00-06:00Flyawaytag:zhouyichu.com,2020-08-29:/weekly-blog/A-Good-System-Can-Selfupdate/<p>必须建立一种能够自我更新的行为原则</p><p>前段时间有一本书很火,那就是<a href="https://en.wikipedia.org/wiki/Ray_Dalio">Ray Dalio</a>的<a href="https://www.principles.com/">Principles</a>一书。
之前我自己也曾经拜读过。
虽然现在记忆中几乎无法回忆起其中的任何一条原则,但是阅读整本书,我最重要的收获有两个:
1. 将自身的行为原则化,能最大程度减少外界对自己的影响,进而保持一种高效的工作状态。
2. 所建立的原则必须是可以进行自我迭代的,而不是一成不变的。</p>
<p>其实,在阅读<a href="https://www.principles.com/">Principles</a>之前,我自己的也已经慢慢领悟到第一点的内容。
在我个人的经验中,我发现将日常的各种决策以一种原则化的方式进行处理,是一种非常高效且节省精力的做法。
至少不会出现选择困难症。</p>
<p>但是,此书的第二点是我之前没有体悟到的。
我认为其实第二点才是更重要的。
通过日常的生活,任何一个人都会有意无意的建立起自己的行为模式,有些人一旦形成之后,可能终生都不会发生大的变化。
如果在不自觉的情况下,形成了比较好的行为模型,那他的生活可能会比较顺畅;而如果形成了很多不良的行为模式,那他的生活也许会变得越来越悲惨。
前一种情况的极端就是我们常说的天才,他们因为从小就形成了比较的好的行为原则和思考原则,能在非常年轻的时候就做出超越常人的成绩;后一种情况的极端就是我们常常说的一句话: 「不是老人变坏了,而是坏人变老了」.</p>
<p><a href="https://www.principles.com/">Principles</a>最重要的贡献是,它让我理解到,我们其实是可以,同时也需要主观的去引导自己的行为原则和模式。
通过不断的自我迭代,更新自己的行为模式,使得我们能够朝着自己的目标前进。
我们身边的环境每时每刻都在发生着变化,我们相应的行为模式也需要进行相应的更新,才能让我们继续前进。
其实这种思想很早就有了,比如曾子所说的「吾日三省吾身」,又比如「元认知」的概念。
只是,在学习这些概念的时候,还无法和改进自身行为模型联系起来。</p>
<p>对于个人来说,定时的日记、周记就是非常重要的自我更新节点。
通过日记、周记、月报这种形式的自我反省很更新,不断修正自己的行为模式,已达到更好的状态。</p>
<p>对于组织来说,必须要允许存在不同的声音。据说<a href="https://en.wikipedia.org/wiki/Ray_Dalio">Ray Dalio</a>的桥水基金内部会给每个员工建立一个公开的档案卡,档案卡上记录着别人对自己的各种评价,以此希望每个员工都能利用这些评价提高自己。
档案卡的建立包括了<a href="https://en.wikipedia.org/wiki/Ray_Dalio">Ray Dalio</a>本人,很多人也会对[Ray Daily][]提出负面的评价。
我觉得,正是在这种宽容、能够不断更新的环境下,桥水基金才能成为世界上最好的基金之一。</p>制定计划2020-08-29T09:29:00-06:002020-08-29T10:56:00-06:00Flyawaytag:zhouyichu.com,2020-08-29:/weekly-blog/Make-A-Valid-Plan/<p>制定一个合理的计划是一件需要学习的事情</p><p>现代社会中的每个人都是非常忙碌的,每天总是需要处理很多不同的事务。
因此,各种任务管理工具、日程规划方法论应运而生。为现代生活带来了极大的帮助。
在我自己的实践中,我发现这些工具在帮助我们很好的处理各种事务的时候,也在无形中给我们自身带来了压力和焦虑。
在具体的实践中,如果我无法按照原定的计划完成任务或者计划被各种突发情况打断时,我总是会产生深深的焦虑感,
这种焦虑感会继续导致失眠,进而工作效率降低,更加无法按计划完成任务,由此进入恶性循环。</p>
<p>其实对于这种情况,我很早之前就已经发现了。自己也慢慢摸索出了一些应对的方法和思考方式。很多事情,稍微转变一下看法,事情就会变得大不一样。</p>
<ol>
<li>
<p>做计划本身也是一件需要学习的事情
以前做计划的时候,总是根据需要完成事情来制定的。
但是,实际情况是,每天的工作负荷是有上限的,超过了这个上限,无论你工作多努力、多高效都是无法完成的。
因此,如果制订出一个合理的计划这件事本身也是一个慢慢学习的过程。同时,这也是一个动态的过程,随着自己的经验的增长,工作效率会有所提升,需要重新评估自己固定时间内能完成的工作。
因此,减少焦虑感的第一步的,就是要制定出一个符合自己能力范围的工作规划。
如果错误高估了自己的能力,焦虑感是必然的产物。</p>
</li>
<li>
<p>必须留有足够的缓冲区。
在制定了合理的规划的前提下,依然是有可能无法按时完成计划的。
其中最主要的一个原因就是日常生活中各种不同的突发事件。
比如老板临时安排的任务、工作电脑坏了、服务器出现问题需要联系管理员进行修复等等,生活中种种的突发情况总是层出不穷。
面对这种情况,我认为最好的方式是首先在心理上明确,所有的突发情况都是正常的,计划被打断才是<strong>常态</strong>,而顺利无障碍的完成计划才是<strong>非常态</strong>.
其次,在具体的操作上,我们需要提前就预留出一定的缓冲时间来应对可能出现的特殊情况。
在制定计划的时候,不能把所有的时间都占满,一定要留出一定量的缓冲时区,用来对冲或缓解各种突发情况带给我们的影响。</p>
</li>
</ol>教育2020-08-15T09:28:00-06:002020-08-15T10:55:00-06:00Flyawaytag:zhouyichu.com,2020-08-15:/weekly-blog/Education/<p>关于教育的一点想法</p><p>最近看了不少有关孩子教育的片子,想法有些乱,我希望这篇博文能帮我自己理清思路。</p>
<p>现在有很多电影、网剧都是在反应应试教育的弊端,批评对孩子评价标准过于单一。这些影视作品无一不是在强调教育要多元化,要加强孩子的特长教育。</p>
<p>首先,我是同意这些影视作品的,孩子的成长不能没有兴趣爱好。但是,我也想指出,这个社会需要的人才并不是由个人的兴趣所决定的。
比较功利的说,学校的作用本来就不是培养孩子的兴趣爱好,它的目标其实是培养社会需要的人才。
社会需要的技能和每个人的兴趣爱好不一定匹配,甚至可以说一定不会匹配。但是为了将来能在这个社会上占有一席之地,学校必须牺牲一定程度个性,向学生教授社会需要的技能。</p>
<p>另外,关于考大学的问题,其实这个问题不只是中国的问题,全世界都是这样。为了上一个好大学,学生总是需要经历一段痛苦挣扎的时间。因为,他们都知道将来的收入水平、社会地位都是和受教育水平息息相关的。而大学的名额就这么多,必须通过竞争才能拿到有些的名额。
当然,特例总是会有的,面对我的这种观点,总会有人提出扎克伯格、比尔盖茨这种肄业退学却依然成功的人,但这些仅仅个例而已,从整个社会的统计数据来看,虽然受教育水平不一定是决定性因素,但是却和未来的收入水平、社会地位有着强相关性。</p>
<p>因此,其实我认为认真积极参与高考的过程本身没有什么错。错误的点在于备考的过程和学校教育方式。如果通过一味的题海战术、高压战术,不断压缩学生的个性空间,那么就有可能得不偿失了。
很多的影视作品都是以此作为背景,讲述了一个又一个悲剧的故事。</p>
<p>我是相信大部分人的智商水平是处于同一区间的,区别在于如何才能发挥出学生最大的潜能。这就涉及到教育的方法,教育不仅仅是传授知识,更应该教授孩子正确的思维方式,最大程度上发挥孩子的潜能。</p>
<p>总的来说,我认为应试教育其实本身没有什么错,错的是在于在应试教育这个目标的前提下,学校只能制定出高压政策这一种教育方式。对于现在初高中普遍使用的高压战术、题海战术我是反对的。我觉得重点不仅仅是灌输知识,更要培养出孩子正确的思考方式。
正确的思考方式加上足够的知识,足以应对任何的考试。</p>历史经验的思维陷阱2020-08-08T10:18:00-06:002020-08-08T10:58:00-06:00Flyawaytag:zhouyichu.com,2020-08-08:/weekly-blog/Experience-Bias/<p>历史经验的思维陷阱</p><p>在一些时候,我们自己的思维方式和行为模式都在受到自己的各种过去的经验所影响。
这些影响,在对我们有帮助的时候,就称为「经验」;但是这些影响对我们有害的时候,就被称为「思维误区」。</p>
<p>我在最近就经历了这么一次思维误区。我付出的代价则是几乎浪费了两天时间在一个错误的方向上寻找出错的地方。
具体的问题是科研上的一个问题,因为我之前遇到过一个类似的问题,后来也是在别人的提醒下解决了。这次遇到类似的问题,我想当然的认为问题的原因和之前那次是一样的,结果花了大精力去排查这个问题。结果证明,出问题的部分并不是我预想的那样。
这次的事故再次告诫我,做科研一定不能有思维定式,不能想当然地就排除一些可能性。</p>
<p>这次的经验,让我想起了在<a href="https://www.igetget.com/">得到</a>的「张潇雨 个人投资课」中看到的一个例子:</p>
<p>美国的80年代的股票是投资回报率非常好的一个黄金十年,但是,在这个十年里,美国家庭投资在股票上的比例却是下降的。之后的90年代,股市依然是一个牛市,但是美国家庭投资在股市上的资金却还在继续减少。原因是,美国70年代的经济和股市很糟糕,整个70年代,股市几乎没有增长。而那些在年轻的时候(70年代)看到谁买股票谁倒霉的人,在他们壮年的时候(80、90年代)就会非常谨慎的看待股市。其结果就是,大部分都不会选择投资股市,从而错过了这个长达十几年的大牛市。</p>
<p>我自身的例子和美国股市的例子,都在说明,过去的经验对我们自身,有时候不仅是没有帮助,甚至是有害的。
当我们调用自己的历史经验来做出判断的时候,我也许就已经犯了一个错误。真正一模一样的历史场景其实是很少的,我们每一天遇到的各种决策问题,它们所处的环境、影响因素其实都是不一样的。单纯的只用历史经验来做出判断,是远远不够的。</p>
<p>面对这种时刻存在的思维陷阱,老实说,我目前还没有任何的解决方案。只能在生活中不断改变自己的思维方式,历史经验只能作为一个参考,不能作为决定性的因素。</p>接受自己2020-08-08T09:21:00-06:002020-08-08T10:11:00-06:00Flyawaytag:zhouyichu.com,2020-08-08:/weekly-blog/Accept-Yourself/<p>学会接受自己,减少痛苦.</p><p>自从开始每天的冥想练习之后,我发现要想做到真正的宠辱不惊,保持一个平和的心态,最重要的其实就是要学会接受自己,接受这个世界。
只有接受自己的不完美,接受这个世界的种种丑恶和美好,才能让与自己和解,与世界和解。</p>
<p>曾经有段时间,我深受失眠的影响。而我自己的应对则是焦虑和对抗。焦虑的是,无法保质保量的睡眠,就无法保证第二天的精神状态,会大大降低工作的效率;对抗的方式就是不停想方设法去解决失眠这个问题。基本方针是要彻底解决这个问题。
这种焦虑和对抗的方式进行了好几年,其实都没有太大的进展。
后来,逐渐了解了冥想的一些基本思想,并且自己开始练习冥想。
我开始反思,是否是自己之前的策略都是有问题的。焦虑和对抗其实对我没有任何帮助。
我决定开始采用冥想的思想,开始学会接受失眠的存在,接受它,然后忽视它。这就有点像是冥想过程中观察自己的思维一样,我开始接受并且观察失眠的这个想象。
渐渐的也不再焦虑,我自己只是作为一个第三方在观察自己的失眠的情况。
事实证明,一旦你开始接受一件事,这件事对你的影响就会开始逐渐下降。自从我换了一个角度看待失眠这个问题之后,我发现我就很少失眠了。虽然失眠这个现象并没有完全消失,时不时它就会出现。但是对我的影响是越来越小了。</p>
<p>人生不如意十之八九。生活中总会有一些事情让我们产生负面情绪,这种负面情绪的积累,往往会对人的状态产生很多不好的影响,导致自己怀疑人生、怀疑自己。
面对这种情绪,人的第一反应就是要解决它,消除它。
但是这种正面对抗的方式往往不会有什么太好的效果。结果只是自己被搞得身心俱疲,整体精神状态会变得越来越差。</p>
<p>也许,更好的策略是学会去接受它,接受自己的不完美,接受自己的失败,然后站在第三者的角度观察自己,审视自己。
当然,那些负面情绪依然会存在,只是我们可以换一种方式对它进行反应。
<a href="https://en.wikipedia.org/wiki/Dale_Carnegie">Dale Carnegie</a>曾经说过,对我们影响最深的不是那些坏事情本身,而是我们对这些坏事情做出的反应。
我们人类天生就会对坏事情产生负面情绪,会感受到低落和无力感。
我现在觉得,越是这种时候,越要学会接受自己,接受这些坏事情。然后,告诉自己,这些负面情绪都是暂时的,不需要太当回事。真正需要做的是,从第三方的角度,客观公正的分析坏事情发生的原因以及自己可以继续改进和提高的地方。</p>一将功成万骨枯2020-08-01T10:04:00-06:002020-08-01T10:54:00-06:00Flyawaytag:zhouyichu.com,2020-08-01:/weekly-blog/One-Success-Rely-on-Thousands-of-Death/<p>一将功成万古枯</p><p>本科快毕业的时候,有段时间我一直在阅读<a href="https://zh.wikipedia.org/wiki/%E5%AD%99%E7%9A%93%E6%99%96">孙皓晖</a>先生的<a href="https://zh.wikipedia.org/wiki/%E5%A4%A7%E7%A7%A6%E5%B8%9D%E5%9B%BD_(%E5%B0%8F%E8%AF%B4)">大秦帝国</a>系列小说,当时被这本小说深深吸引。其中的历史人物,商鞅、秦孝公、苏秦、张仪等人都让人产生了一种指点江山、挥斥方遒的快感。
更早之前,在看陈宝国主演的<a href="https://zh.wikipedia.org/wiki/%E6%B1%89%E6%AD%A6%E5%A4%A7%E5%B8%9D">汉武大帝</a>的时候,也有类似的感觉。
总觉得如果能生活在这样一个能「彰显国威」的时代,那将会是一件多么幸福的事情。</p>
<p>然而,事实真是如此吗?这一切其实都是自己的臆想罢了。</p>
<p>尽管历史上的评价,秦皇汉武、唐宗宋祖都被认为的一代雄主,对内安定江山,对外威服四方。
然而,这些都是史书和后人的观点。
对于那些真正生活在秦皇汉武治下的百姓来说,其实并不是一件幸福的事情。
秦皇就不必说了,焚书坑儒、阿房宫、长城、秦皇陵等等浩大工程,生活在那样一个时代,仅仅是活着就已经很不容易了。
汉武帝其实也没有好多少,为了筹措军费,汉武帝更是开创了盐铁专卖、国有垄断企业、政府垄断货币发行等各项制度,彻底扰乱了一个正常的商业社会,导致一个原本商业发达的汉朝变成了一个民生凋敝、经济衰败的汉朝。
虽然他在史书上留下了丰功伟绩,开疆拓土、远击匈奴,但是同时也留下了一个千疮百孔的国家和多个将会制约中国几千年的制度。
生活在汉武帝治下也绝对不是一件幸福事情。</p>
<p>其实,还是那句老话,一将功成万骨枯。</p>
<p>从史书上我们看到的是指点江山、挥斥方遒的快感,然而却忽略了是谁在承受代价。
其实,这种事情至今没有什么变化。
当初的美苏争霸,现在的中美摩擦其实都是一样的。
两个国家的领导人在争夺世界的话语权,而真正付出代价的却是最普通的百姓。
这种断裂感,不是任何制度、任何时代所能改变的。
也许日后的史书会对我们现在这一段历史添油加醋,增加很多引人入胜的故事。
但是这其中的困难和焦虑,也只有生活在我们这个时代的人才能明白。</p>
<p>作为一个普通,面对这样的时事,更多的其实也是无可奈何。
能做的也只是管好自己的一亩三分地。</p>从来没有正义2020-07-25T00:00:00-06:002020-07-25T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-07-25:/weekly-blog/No-Justice/<p>从来没有什么正义</p><p>今天的话题可能有些争议性,我不想说服任何人,只是想分享一些我自己的感悟。
今天的话题是关于「正义」。
曾几何时,我认为这个世界上是存在着正义的。
所谓的坏人最终一定会得到相应的报应。
然而,看得多了,听得多了,我推翻了自己的之前的论断。
现在我认为,这个世界上从来不存在什么正义,所谓的正义,本身就是人类想象出来抽象概念,可以因时因地地不断修改。
总的来说,我之所以觉得不存在正义的原因,有以下几点:</p>
<ol>
<li>
<p>只有胜者才能定义正义。</p>
<p>这就是那句老话,胜者王败者寇。没有什么好说的。
只有胜利的人才有发言权,失败者连说话的权利都没有。
想象一下,历史上的各种战争,每个胜利者都会坚称自己才是正义的一方。</p>
</li>
<li>
<p>幸存者效应。</p>
<p>之所以很多人会产生「不是不报,只是时候不到」这种错觉,是因为我们时常会看到新闻说,某某十几年前干了什么坏事,现在终于被揭露了,得到了应有的报应。
这类事件其实存在着很多的问题,最重要的一个就是幸存者效应。
媒体报道出来的事情都是被揭发的,而也许更多的是没有被揭发的。
没有揭发的,是世人所不知道的。所以,每次看到有类似的新闻,总是让人觉得,万事万物都有报应。其实未必,你没看到的地方,有着很多没有受到报应的人。</p>
</li>
<li>
<p>媒体的倾向性</p>
<p>之所以「正义必胜」这种概念深入人心,也是因为这种思想是「政治正确」的。
不管什么国家,都需要一种思想体系来管理自己的国民。
这种思想体系多半都会和正义相关,任何国家都会声称这种思想体系是正义的。
而媒体也会因为「政治正确」而选择性的报道各种事件,使得被报道的事情符合国家的统治思想。
这就更加加深了普通人对正义的执念。</p>
</li>
<li>
<p>定义的模糊性</p>
<p>正义本身这个概念是模糊的,在一些情况下,是否正义是很难界定的。
并且,正义的定义是因时因地不断变化的。
比如,Harvard的Justice公开课上的很多例子都是道德悖论问题。
在这些问题中,不管怎么选,总会有人认为做出的选择是非正义的。</p>
</li>
</ol>
<p>在想明白没有什么正义之后,我发现自己的看待世界的眼光也正在逐渐改变。
首先,我不再以道德标准来看人看物,尽量不做道德判断。
其次,不再觉得不公平,因为这个世界上本来就不存在公平正义,这个世界仅仅就是一种存在而已。
我们能做的就是,在现有资源的情况下,将自己的幸福感最大化。</p>第三百篇博文2020-07-18T00:00:00-06:002020-07-18T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-07-18:/weekly-blog/Three-Hundred/<p>第三百篇博文</p><p>不知不觉中,这个博客已经维护了近8年的时间了,而现在这篇博文刚好是第三百篇。
这几年的博客写作下来,感觉自己的变化也很大。</p>
<p>首先,最开始打造这个博客的时候,是希望把这个博客作为一个技术博客的。但是,后来渐渐发现自己的关注点不再是纯粹的技术了。
更多的是想抒发一些自己生活中的感想。
因此,这个博客的主题渐渐发生了变化,从原本一个技术导向的博客转变为了现在这个以生活感悟为主题的博客。</p>
<p>自从开始坚持博客写作以来,我经历了几个不同的阶段,写作的频率有着显著的变化。
第一个阶段是2012年到2015年,这段时间的博客是一个高产的阶段,主要内容还是以技术和机器学习模型为主题的。
这段时间刚好是我本科毕业、开始读研的阶段。
这个阶段是我「创作力」最旺盛的时候,也许是因为当时本科毕业,确定保研之后,生活各方面比较惬意,而且刚建立博客,写作动力很旺盛。</p>
<p>接下去一个比较低产的阶段是2015-2017这两年的时间。这段时间我研究生毕业,来到美国开始自己的异国求学之旅。
也许是这段时间忙着体验新的生活经历吧,这段时间虽然依然有坚持写作,但是频率就变得很低了。
而且,在这段时间里,写作的主题也渐渐开始从技术转变为生活了。</p>
<p>接着是2018到现在。在2018年的时候,我发现自己已经荒废了博客写作接近了两年的时间,我决定重新开始认真的写作。
当时我给自己定的目标是「每周一文」,至少要保证每周产出一篇博文,主题不限。
从2018年一直坚持到了现在,虽然没有百分之百的坚持每周一文,但至少我在大部分的情况下,都坚持了下来。</p>
<p>当把思考和写作作为一个日常的工作之后,我其实这并没有增加我的负担,相反,很多时候依靠写作,我将自己脑海中的各种混乱想法系统的记录了下来,反而使得自己的思维更加轻松了。
现在往前回顾之前写过的博文,发现当年的自己还是有点幼稚的,有些想法明显透出了不成熟的思想。
但是我并不想撤销这些文章,这些文章的存在就是在提醒我自己,不要盲目自信,即使是现在,我的一些想法也有可能在未来的我的眼中是不成熟的。
这些文章也在告诉我自己,这些年来我自己的心境变化。
总的来说,我觉得坚持写作是一件利大于弊的事情,希望我能继续坚持下去,将这个博客一直维持下去。</p>避免犯错2020-07-11T00:00:00-06:002020-07-11T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-07-11:/weekly-blog/Avoid-Mistake/<p>不犯错比事事完美更有优势</p><p>近期一直阅读一系列有关投资的书籍,其中我学到的一个很重要的观点是,如果能在整个投资生涯中不犯错,就大概率能得到非常不错的收益。
为什么会这样呢?其实很简单,因为每次犯错所产生的的损失,需要更多的收益来填补。
下表总结了亏本之后需要涨回到原来水平需要的获得的收益。
比如,第一行表示,当我的资产损失10%之后,我需要获得11%的收益才能回到原来的水平;最后一行表示,当我的资产损失90%之后,我需要获得900%的收益才能回到原来的水平。</p>
<table>
<thead>
<tr>
<th align="center">损失</th>
<th align="center">收益</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">10%</td>
<td align="center">11%</td>
</tr>
<tr>
<td align="center">20%</td>
<td align="center">25%</td>
</tr>
<tr>
<td align="center">30%</td>
<td align="center">43%</td>
</tr>
<tr>
<td align="center">40%</td>
<td align="center">67%</td>
</tr>
<tr>
<td align="center">50%</td>
<td align="center">100%</td>
</tr>
<tr>
<td align="center">60%</td>
<td align="center">150%</td>
</tr>
<tr>
<td align="center">70%</td>
<td align="center">233%</td>
</tr>
<tr>
<td align="center">80%</td>
<td align="center">400%</td>
</tr>
<tr>
<td align="center">90%</td>
<td align="center">900%</td>
</tr>
</tbody>
</table>
<p>这个表格告诉我们,收益和损失的比例的不对称的,每次我们犯错导致亏损之后,我们需要得到更多的收益才能恢复。
因此,如果一味的进行激进的投资,当巨大的亏损产生时,几乎是不可能恢复到原来的水平了。</p>
<p>人生路上的选择也许和投资是差不多的,我们应该学习的是如何不犯错,而不是把每件事都做到完美。
类似的道理,我曾经在吴军老师的硅谷来信中听到过,可惜当时并没有认真思考这个观点,甚至有点嗤之以鼻。
当时就觉得,只有努力把每一件事都做好,才能在职业生涯上走得更长久。
然而,经历的事情多了之后,渐渐明白,「努力不犯错」的策略其实比「努力完美」的策略更有优势。 </p>
<p>「努力完美」的策略就像是投资中的激进策略,在大环境良好的时候,你的事业发展会一帆风顺,能很快取得不俗的成绩。
然而,当把时间拉长,随着职位、自我要求、别人的期许等各种压力越来越大,需要付出的精力越来越多,你根本无法兼顾把那么多的事情做到完美。
直到有一天犯下一个重大的错误,使生活变得混乱。
另外,「努力完美」的代价是你需要对每一件事都倾注相当的精力。
整天生活在高度紧张的状态下,似乎并不是一个很好的选择。</p>
<p>「努力不犯错」就像是投资中比较保守的做法,虽然每一步的收益都比较少,但是却很稳定。
一步一步的积累经验,认准一个方向努力做到的最好,而不是想要全部的最好。
这样的生活也许会更惬意和舒适。</p>
<p>「努力不犯错」的另一个好处是,我们能够从别人的失败中学习到很多。
平时大家的关注点都是成功人士的成功秘诀,然而,即使是本人总结的的成功秘诀未必是正确的。
自我归因向来是人类的弱项。
相反的,失败的因素却是很容易找到的和分析的。
与其去猜测别人成功的原因,还不如关注失败的原因,在自己的生活中避免同样的错误。</p>科研的感想2020-07-04T00:00:00-06:002020-07-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-07-04:/weekly-blog/Some-Thoughts-on-Research/<p>科研的感想</p><h1>点线模型</h1>
<p>最近一段时间我在一点点的回溯我研究方向上的历史,渐渐意识到, 科研这种事其实是连续且跳跃的。
这让我联想到了所谓的「点线模型」和「科学的范式」.</p>
<p>在学术界,科学家们努力科研,提出的新的理论、发现新的现象。但是,这些科研工作通常都是建立在大家都认可的一个科研学说之上的。
比如,相对论发表之前,物理学家的科研基础就是建立在牛顿的经典力学之上的。
然而,后来科学家们发现了越来越多的新的物理现象是牛顿力学无法解释的。
因此,很多科学家试图修正牛顿力学,就像打补丁一样,希望在不改变大框架的前提下,使得理论符合现象。
然后,随着越来越的物理现象被发现,小修小改已经无济于事。
于是,爱因斯坦提出了相对论,将之前所有的不和谐的地方都统一到了一个理论框架中。
由此形成了新的物理学基础。
然后,新的轮回又将开始。科学家们继续发现未知、提出修改方案,当积累的知识、数据足够多的时候,新的理论又将出现替换旧的理论。</p>
<p>在这个过程中,牛顿力学和相对论就是<strong>线</strong>,而其他的各种小理论、各种现有理论无法解释的物理现象都是<strong>点</strong>.
当积累的<strong>点</strong>足够多的时候,新的<strong>线</strong>就会出现,形成一个新的平台。
点与点之间是非常接近的,而且具有很强的相关性,是连续的。
我认为大部分科学家其实都只能做到产生一些新的<strong>点</strong>.
而只有真正的天才才能产生<strong>线</strong>。这样的人都是时代巨匠,不是一般人都能做到的。
<strong>线</strong>的产生具有跳跃性,只有划时代的理论的才能成为<strong>线</strong>。</p>
<p>表面上,似乎<strong>线</strong>的重要性要大于<strong>点</strong>。
其实不然,要知道,<strong>线</strong>的形成必须要<strong>点</strong>,没有点的支撑和佐证,<strong>线</strong>是不可能存在的。</p>
<h1>追星</h1>
<p>之前提到过,科研的工作往往都是相互紧密联系的,不太可能出现孤立的工作。
尤其在现在这种资讯高度发达的时代。
每一篇论文一旦发表,理论上全世界的相关领域的人都能看到。每一个工作都不是独立,都是建立在别人的工作之上的。</p>
<p>然而,我发现这种趋势随着信息的高速传播变得越来严重,某种程度上来说,我认为这种趋势某种程度伤害了科研的发展。
当信息能够告诉传播的时候,人们往往会被最具有吸引力的事物所吸引,而渐渐失去了静下心思考的能力。
比如,有人提出了一种新的模型,取得了突破性的进展。
结果是,接下去几年所有的相关学术会议上都将充斥着与这个新模型相关的论文。
而这些论文其实都是对这种新模型的小修小补,其重要性远小于之前提出的新模型。
在这种趋势下,大家都在盲目追逐新的科研热点,而不是静下来思考,什么才是目前的这个领域所需要的研究工作。
我认为这种追逐热点的心理在某种程度上伤害着整个科研体系的发展。</p>
<p>这种「追星」的科研方式的另外一个后果就是,学者之间的竞争变得非常激烈。
大家都在争夺那么几个少的可怜的「热点」,论文发的表速度慢上一点点,也许过去几个月的工作都白干了。
这样的环境中,其实是一种恶性循环。
新晋的学者想要打开自己的学术声名,不得不多发论文,而只有那些追逐热点的论文才更有可能被发表。
结果,那些科学领域的新鲜血液逐渐被带偏了方向,思维逐渐被束缚住了,变成了新的热点的牺牲品。</p>「The Permanent Portflio 」读书笔记2020-07-04T00:00:00-06:002020-07-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-07-04:/reading-list/The-Permanent-Portflio/<p>「The Permanent Portflio 」读书笔记</p><h1>综述</h1>
<p>This book talks about several aspects of the permanent portfolio:</p>
<ul>
<li>The reasons behind it.</li>
<li>Detiled analysis of four components of permanent portfolio</li>
<li>How to implement this portfolio</li>
<li>Taxes issues with this portfolio</li>
</ul>
<h1>结构和细部</h1>
<h2>What Is the Permanent Portfolio?</h2>
<ul>
<li>25% Stocks</li>
<li>25% Bonds</li>
<li>25% Cash</li>
<li>25% Gold</li>
</ul>
<h2>The 16 Golden Rules of Financial Safety</h2>
<ol>
<li>Your Career Provides Your Wealth<ul>
<li>Investing should be a process of taking part of the earnings from your career and allowing them to grow safely.</li>
</ul>
</li>
<li>Do not Assuem You Can Replace Your Wealth<ul>
<li>Never assume you can earn back money that is lost through bad investments.</li>
</ul>
</li>
<li>Recognize the Difference between Investing and Speculating - Investing is the process of taking a clear strategy and implementing it with discipline and focus with an emphasis on long-term results.<ul>
<li>Speculating is the process of engaging in trading for short-term profits, looking for hot stock tips, day trading, market timing, or other highly risky approaches (and there are many of them).</li>
</ul>
</li>
<li>No One Can Predict the Furture</li>
<li>No One Can Time the Market</li>
<li>Trading System Will Work as Well in the Future as It Did in the Past</li>
<li>Don't Use Leverage</li>
<li>Don't Let Anyone Make Your Decisions</li>
<li>Don't Ever Do Anything You Don't Understand</li>
<li>
<p><strong>Don't Depend on Any One Investment, Institution, or Person for Your Safety</strong></p>
<div class="admonition note">
<p class="admonition-title">Note</p>
</div>
<p>Do not put all the money in the ETFs that provided by the same company.</p>
</li>
<li>
<p>Create a Bulletproof Portfolio for Protection</p>
</li>
<li>Speculate Only with Money You Can Afford to Lose</li>
<li><strong>Keep Some Assets Outside the Country in which You Live</strong></li>
<li>Beware of Tax-Avoidance Schemes</li>
<li>Enjoy Yourself with a Budget for Pleasure</li>
<li>Whenever You're in Doubt about a Course of Action, It's Always Better to Err on the Side of Safety</li>
</ol>
<h2>Permanent Portfoloi Performance</h2>
<ul>
<li>According to historical data, the Permanent Portfolio strategy has provided investment returns of 9 to 10 percent a year for the past 40 years.</li>
<li>The most significant difference between the Permanent Portfolio and other approaches is that the Permanent Portfolio gives you real growth and protection of your money.</li>
<li>No large loss. It is very difficult to recover from a large loss.</li>
<li>Nominal Returns: non-inflation adjusted returns</li>
<li><strong>Real Returns: Inflation-adjusted returns</strong></li>
<li>Three measure of a good portfolio:<ul>
<li>A good growth rate</li>
<li>Avoiding large losses</li>
<li>Real return matter most.</li>
</ul>
</li>
</ul>
<h2>Simple, Safe and Stable</h2>
<ul>
<li>Three factors of designing a portfolio:<ul>
<li>Simplicity</li>
<li>Safety</li>
<li>Stability</li>
</ul>
</li>
<li>Simplicity:<ul>
<li>Complexity kills returns.</li>
<li>Complexity usually involves hidden fees, unknow risk.</li>
</ul>
</li>
<li>Safety<ul>
<li>Strong diversification</li>
</ul>
</li>
<li>
<p>Stability</p>
<ul>
<li>A stable portfolio allows an investor to avoid panic when the markets are in turmoil.</li>
</ul>
</li>
<li>
<p>Strategy:</p>
<ul>
<li>Using passive investing</li>
<li>Keep costs low</li>
<li>Use volatile individual assets to reduce overall protfolio volaility</li>
<li>Expect the unexpected and embrace the idea of market uncertainty.</li>
</ul>
</li>
</ul>
<h2>Investing Based on Economic Conditions</h2>
<ul>
<li>The Illusion of Diversification</li>
<li><strong>The correlation between different assets changes a lot in differnt time periods.</strong></li>
</ul>
<table>
<thead>
<tr>
<th align="center">Asset Class</th>
<th align="center">Correlation 1972-2011</th>
<th align="center">Correlation 1972-1979</th>
<th align="center">Correlation 1980-1989</th>
<th align="center">Correlation 1990-1999</th>
<th align="center">Correlation 2000-2009</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Stocks/Bond</td>
<td align="center">0.06</td>
<td align="center">0.51</td>
<td align="center">0.32</td>
<td align="center">0.54</td>
<td align="center">-0.83</td>
</tr>
</tbody>
</table>
<ul>
<li>Strong diversification is not built by looking at asset class correlation data, but rather through an understanding of how certain assets respond to changing economic conditions.</li>
</ul>
<p>Hard assets
~ are physical objects or property that can be held in one's own possession and retain value independent of what the value of a currency or other paper may be doing.</p>
<ul>
<li>Hard assets is that they are subject to different market forces than stocks, bonds and other paper assets, and thus they do not share the same risks that can impact paper assets.</li>
<li>Four Economic Conditions<ul>
<li>The Permanent Portfolio approaches diversification by selecting assets that are correlated to the economy and pays no attention to how asset classes are correlated to each other.</li>
</ul>
</li>
</ul>
<dl>
<dt>Prosperity</dt>
<dd>Periods of prosperity are characterized by rising productivity and profits, low unemployment, and stable or falling interest rates.</dd>
<dt>Deflation</dt>
<dd>Deflation is an economic environment in which some economic shock, such as a credit crisis or market panic, sets off a cycle of declining prices, falling interest rates, and rising currency value.</dd>
<dt>Recession</dt>
<dd>The word recession has become a blanket description of any economic condition outside of prosperity.</dd>
<dt>Inflation</dt>
<dd>Periods of inflation are the result of too much money circulating in an economy relative to the available supply of goods and services.</dd>
</dl>
<table>
<thead>
<tr>
<th align="center">Condition</th>
<th align="center">Good Assets</th>
<th align="center">Bad Assets</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Prosperity</td>
<td align="center">Stocks/Bonds</td>
<td align="center">Gold</td>
</tr>
<tr>
<td align="center">Deflation</td>
<td align="center">Bonds/Cash</td>
<td align="center">Stocks/Gold</td>
</tr>
<tr>
<td align="center">Recession</td>
<td align="center">Cash</td>
<td align="center">Stocks/Bond</td>
</tr>
<tr>
<td align="center">Inflation</td>
<td align="center">Gold</td>
<td align="center">Bonds/Cash</td>
</tr>
</tbody>
</table>
<ul>
<li>Gold should not necessarily be thought of as a long-term investment, but as a long-term insurance policy protecting against bad economic events.</li>
</ul>
<h2>Stocks</h2>
<ul>
<li>Indexs criteria:<ul>
<li>Have an expense ratio below <span class="math">\(0.5\%\)</span> a year.</li>
<li>Passively managed</li>
<li><span class="math">\(100%\)</span> invested in stocks at all times</li>
</ul>
</li>
<li>International stock exposure is not that important to U.S. investors, in part because the U.S. stock market includes companies already responsible for about half of the world's economic output.</li>
</ul>
<h2>Bonds</h2>
<ul>
<li>A bond is a loan. The borrower makes periodic interest payments over a certain amount of time before returning the initial loan to the lender.</li>
<li>The only bonds that are appropriate for the Permanent Portfolio are 25- to 30-year U.S. Treasury long-term bonds.</li>
<li>Interest rates rise --> Bound prices fall</li>
<li>Interest rates fall --> Bound prices rise</li>
<li>Permanent Portfolio perfer long term bonds because:<ul>
<li>They have no default risk</li>
<li>Their long maturity provides maximum volatility to profit from periods of deflation.</li>
<li>They are nominal (fixed rate) bonds, meaning they do not have inflation adjustments built-in.</li>
</ul>
</li>
<li>
<p>The important point is that investors want average bond maturity in the portfolio to be greater than 20 years.</p>
</li>
<li>
<p>Three ways of buying bonds:</p>
<ul>
<li>At auction from the Treasury</li>
<li>On the secondary market</li>
<li>Through a bond fund</li>
</ul>
</li>
<li>
<p>At auction or on secondary markets</p>
<ul>
<li>Open an account at Treasury Direct (www.treasurydirect.gov) to make the purchase.</li>
<li>Or use your mutual fund company or broker to make the purchase.</li>
</ul>
</li>
<li>
<p>Risks for non-Treasury Bonds:</p>
<ul>
<li>Default risk: investor won't get paid back.</li>
<li>Credit Risk</li>
<li>Call Risk</li>
<li>Currency Risk</li>
<li>Political Risk</li>
<li>Tax Risk</li>
<li>Bond Fund Mangager Risks</li>
</ul>
</li>
<li>Bonds to Avoid for Permanent Portfolio<ul>
<li>TIPS</li>
<li>Municaipal Bonds</li>
<li>Mortgages</li>
<li>Corporate Bonds</li>
<li>Junk Bonds</li>
<li>International Bonds</li>
</ul>
</li>
<li>Gains from bonds<ul>
<li>Interest payments</li>
<li>Capital gains when interest rate declines</li>
</ul>
</li>
</ul>
<h2>Cash</h2>
<ul>
<li>Cash is designed to act as a stabilizer to the portfolio.</li>
<li>Permanent portfolio holds its cash in ultra-safe U.S Treasury Bill (T-bills) with maturity of 12 months or less.</li>
<li>The goal with the Permanent Portfolio's cash is to make sure that it is always there when you need it.</li>
<li>The criteria for the Permanent Portfolio's cash are:<ul>
<li>Be very liquid (can be bought and sold instantly at any time).</li>
<li>Have no interest rate risk.</li>
<li>Have no default, credit, call, currency, counterparty, or other common types of fixed income risk.</li>
</ul>
</li>
<li>T-bill is a perfect cash investment.</li>
<li>
<p>Treasury Money Market Funds</p>
<ul>
<li>Only owns 100 percent U.S. Treasury bills.</li>
<li>Has a low expense ratio (preferably below 0.20 percent a year.)</li>
<li>Is passively managed to track the market, rather than being actively managed to try to beat the market.</li>
</ul>
</li>
<li>
<p>Recommended Funds:</p>
<ul>
<li>iShares Short Treasury ETF (Ticker: SHV)</li>
<li>Fidelity Treasury Money Market (Ticker: FDLXX)</li>
<li>SPDR Treasury Bill ETF (Ticker: BIL)</li>
<li>Gabelli U.S. Treasury Money Market (Ticker: GABXX)</li>
</ul>
</li>
<li>
<p>Cash Risks:</p>
<ul>
<li>Default Risk</li>
<li>Credit Risk</li>
<li>Currency and Political Risk</li>
<li>Counterparty Risk:the party you give your money to won't be able to give it back when you ask for it.</li>
<li>Call Risk</li>
<li>Tax Risk</li>
</ul>
</li>
<li>
<p>Cash to avoid:</p>
<ul>
<li>Chasing yield with non-treasury funds</li>
<li>Bank Certificates of Deposit</li>
<li>Municipal Bonds</li>
<li>Corporate Debt</li>
<li>International Funds</li>
<li>Shaky Banks</li>
</ul>
</li>
</ul>
<h2>Gold</h2>
<ul>
<li>Gold does best under high-inflation scenarios.</li>
<li>Owning gold<ul>
<li>Physical gold bullion</li>
<li>Buying gold from a gold dealer<ul>
<li>AJPM Precious Metals</li>
<li>American Precious Metal Exchange</li>
<li>Colorado Gold</li>
<li>Canlifornia Numismatic Investments</li>
<li>Kitco Metal, Inc</li>
</ul>
</li>
<li>Buying gold from a bank</li>
<li>Buying gold from a gold fund</li>
</ul>
</li>
<li>
<p>The best gold to hold directly are one-Troy-ounce bullion coins. Bullion coins are either 100 percent gold, or a gold/copper alloy that contain the same amount of gold mixed with copper to make it more durable (pure gold is soft and easily scratched).</p>
</li>
<li>
<p>Cautions</p>
<ul>
<li>Do not buy gold coins on E-Bay</li>
<li>Do not buy/sell on Craigslist</li>
<li>Do not store gold at a dealer</li>
<li>Storing gold in a back safe deposit box and carry insurance on the contents.</li>
</ul>
</li>
<li>
<p>Holding the gold</p>
<ul>
<li>Create gold custody accounts in Everbank</li>
<li>Allocated account: holds gold in your name of a specific lot of coins or bars.</li>
<li>Unallocated account: stores an amount of gold for many customers in which you have a claim</li>
<li><strong>Allocated gold storage should be the first choice for the gold within your Permanent Portfolio even though the fees are slightly higher than for unallocated storage.</strong></li>
</ul>
</li>
<li>
<p>Gold funds</p>
<ul>
<li>Risks: You have a lot of people and papers between you and the asset, which can be a problem in an emergency.</li>
<li>It's not recommended that you use a gold fund for 100 percent of your gold holdings.</li>
</ul>
</li>
<li>
<p>Assets to Avoid</p>
<ul>
<li>Storing Gold in an IRA</li>
<li>Swiss Frances</li>
<li>Commodities</li>
<li>Gold Mining Companies</li>
<li>Collectible Coins</li>
<li>One-ounce buillion bars</li>
<li>Pre-1933 Coins</li>
<li>Silver</li>
<li>Fake Gold</li>
</ul>
</li>
</ul>
<h2>Implementing the Permanent Portfolio</h2>
<ul>
<li>Use at least two brokerages</li>
<li>Use different fund providers</li>
<li>Four Levels of Protection<ul>
<li>Level 1(Basic): All ETFs and mutual funds for stocks, bonds, cash and gold.</li>
<li>Level 2(Good): ETF for stocks, cash and most gold. Bonds and some gold owned directly.</li>
<li>Level 3(Better): ETFs for stocks and cash. Bonds owned directly. Gold stored in country securely.</li>
<li>Level 4(Best): ETFs and mutual funds for stocks and cash. Bonds owned directly. Gold split between in country and overseas storage for geographic diversification</li>
</ul>
</li>
<li>Do not do dollar cost average</li>
</ul>
<h2>Portfolio Rebalancing and Maintenance</h2>
<ul>
<li>Two purpose of rebalancing<ul>
<li>Control risk</li>
<li>Capture additional returns</li>
</ul>
</li>
<li>Rebalancing bands:<ul>
<li>higher than 35% or lower than 15%</li>
</ul>
</li>
</ul>
<h2>Taxes and Investing</h2>
<p>Interest income
~ Interest is what you earn on your money by lending it: to a company through a bond, for example, or to a bank when you buy a CD.</p>
<p>Dividends
~ A share of profits that you get as a part owner of a company when you purchase its stock</p>
<p>Capital Gain
~ You sell an asset for a profit.</p>
<ul>
<li>Simplicity is often the best tax strategy</li>
<li>Paying the smallest allowable amount of taxes should be the goal of all investors.</li>
<li>
<p>Types of Taxable Events</p>
<ul>
<li>Interest Taxes</li>
<li>Dividend Taxes</li>
<li>Capital Taxes</li>
<li>Collectible Gain Taxes</li>
</ul>
</li>
<li>
<p>Capital Gains</p>
<ul>
<li>Long term (more than 1 year) has lower tax rate</li>
<li>Short term (less than 1 year) has normal tax rate</li>
</ul>
</li>
<li>
<p>401K Plans</p>
<ul>
<li>A brokerage window allows a 401(k) participant to bypass the plan's normal investment lineup and instead access a much wider range of investment options, almost as if the 401(k) plan account was an investment account with a brokerage company.</li>
</ul>
</li>
<li>Tax-loss Harvesting<ul>
<li>If you have a loss in an asset, you can sell the asset and recognize the loss for tax purposes.</li>
</ul>
</li>
</ul>
<h1>Institutional Diversification</h1>
<ul>
<li>Institutional diversification simply means dividing your money among several funds, brokerages, banks, and other institutions to diversify against risks from the people and organizations holding and managing your assets.</li>
<li>At leat two brokerages and fund providers.</li>
</ul>
<h1>Geographic Diversification</h1>
<ul>
<li>Geographic diversification means simply holding some of your wealth outside of the country where you live.</li>
<li>Physical gold is the best asset to keep in a foreign account.</li>
<li>
<p>Ground rules:</p>
<ul>
<li>Only deal with first-world countries with stable governments and legal systems that provide strong protections of private property.</li>
<li>Avoid dealing with institutions where accountability rules are opaque or unclear.</li>
<li>Try to do business in legal jurisdictions that support financial privacy.</li>
<li>Always follow all legal disclosure requirements.</li>
</ul>
</li>
<li>
<p>Types of Geographic Diversification</p>
<ul>
<li>Online Gold Storage Services<ul>
<li>Unallocated Accounts</li>
<li>Allocated Accounts</li>
<li>Segregated Storage Account(Best choice)</li>
</ul>
</li>
<li>Foreign Sage Deposit Box</li>
</ul>
</li>
<li>
<p>New Zealand</p>
<ul>
<li>Small country, isolate from the world</li>
<li>The New Zealand Mint<ul>
<li>Account Types: Allocated gold or safe deposit boxes.</li>
<li>Account Minimums: None.</li>
<li>Account Costs:<ul>
<li>1 percent per year for allocated gold storage</li>
<li>Minimum $30 charge per year</li>
<li>$200 per year for small safe deposit box and $250 for large</li>
<li>Discounts for very large quantity (over $500,000 USD) are available</li>
<li>Their commissions on gold purchases are higher than industry norms</li>
</ul>
</li>
<li>Accepts U.S. Customers? Yes</li>
<li>Accepts Non-U.S. Customers? Yes</li>
<li>Requirements to open an account:<ul>
<li>Two forms of ID (passport, etc.)</li>
<li>Confirmation of address</li>
<li>Agreement with New Zealand Mint's terms and conditions</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>For other countries, please see the Chapter 15</strong></p>
<h2>The variable Portfolio</h2>
<ul>
<li>The Variable Portfolio is for speculation. Only money you can afford to lose should be allocated to it.</li>
</ul>
<h1>评价</h1>
<p>This is a well written book. The analysis is simple but complete. However, I think this book misses an important part: the comparison between other portfolio choices, such as all weather.</p>
<h1>和我的关系</h1>
<p>What I learned from this book:</p>
<ul>
<li>Diversity is not always going to work. The correlation betweeen different assets varies a lot over the time.</li>
<li>We should design our portfolio based on the understanding of the economic conditions.</li>
<li>Some actionable suggestions on implementing permanent portfolio.</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>IT技术加速限制了我们的眼界2020-06-27T00:00:00-06:002020-06-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-27:/weekly-blog/IT-Limits-Our-Vision/<p>IT技术加速限制了我们的眼界</p><p>在我小时候,互联网刚刚兴起的时候,大家都在鼓吹互联网拉近了人
与世界的距离,大大加速了信息传播的速度。事实其实也确实如此,
然而,信息的快速传播未必全部都是好事。</p>
<p>通常的观点都是认为,现代信息技术的发展使得人们能够看到更多的
信息,可以更好的了解这个世界上正在发生的事情。然而,这也许只
是一厢情愿的想象罢了。从年初的新冠疫情到现在美国的Black
Live Matters运动,各种假新闻、不完整的信息充斥在各大媒体上。
这种不完全的信息一直在误导着人们,只让人们看到他们想看到的事
情。</p>
<p>虽然这些事情其实并不是技术本身的错,但是技术的发展使得信息的
传播的成本大大降低,几乎不需要任何成本就能快速让一个虚假的或
不完整的信息传遍全世界。比如:</p>
<ul>
<li>
<p>有多少人知道那个在明尼阿波利斯被警察杀死的黑人其实是一个
十分危险的罪犯?他曾经用枪指着一个孕妇实施了抢劫。
相关信息:</p>
<p><a href="https://www.youtube.com/watch?v=JtPfoEvNJ74">Candace Owens: "I DO NOT support George Floyd!"</a></p>
</li>
<li>
<p>又有多少知道后来在波特兰被枪杀的黑人是在醉酒驾驶、袭警、抢夺警察电
击枪之后,在逃跑过程中才被警察开枪射杀的。
相关信息:</p>
<p><a href="https://www.youtube.com/watch?v=hnRuWcgflaE">Body cam footage of Rayshard Brooks’ death shows calm, then chaos</a></p>
</li>
</ul>
<p>另外,随着各种推荐算法的广泛应用,其实作为普通人的我们,只能
看到越来越多的我们想要看到的信息。最终我们的目光、眼界和思想
都会越变得越来越狭隘。</p>
<p>最重要的是,我认为这样的趋势是不可阻挡的,没有什么力量能够阻
挡这种趋势。因为,这本质上并不是技术的错,而是人的本质就是这
样。他们只能看到的他们想要看到的事情。技术的发展,只是将这种
缺点放大了很多倍而已。</p>
<p>面对这种情况,我们只能强迫自己主动地去倾听与自己想法不同的声
音,努力让自己摆脱巨大的宣传机器,学会独立搜索、分析、思考介
接受到的信息。</p>毒鸡汤2020-06-20T00:00:00-06:002020-06-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-20:/weekly-blog/Anti-Motivational-Quotes/<p>这个世界本质就是不平等的</p><p>这周看到了一个挺有意思的帖子,原贴在<a href="https://www.v2ex.com/t/682617">这里</a>。
看着该帖子下面的各种回复,真是感觉其实大家的想法都是很不一样的,在一些关于社会体制、价值观上都有很多不同之处。</p>
<p>我也来谈谈我的想法。</p>
<h1>平等</h1>
<p>首先,我觉得这个世界本身就没有什么平等可言。
所谓的平等,只是人类为了团结协作而产生的概念而已。为了维持整个社会族群的稳定,平等的概念必须存在。
但是,事实上是做不到绝对平等的。而且,我认为,在大多数的时候,抱怨不平等的人其实只是在抱怨自己处于不平等的弱势的一方。
一旦这些人处于不平等关系的强势一方的时候(中国几千年来的王朝更替早就证明了这一点),他们就不会认为不平等了。</p>
<p>即使整个群体真心想要追求所谓的平等也是不可能的。因为每个人的出身条件不同,有的人出身就是富二代、官二代,他们所获得的教育资源、人脉关系不是普通人能够获得的。而且,他们也不可能的放弃他们所占有的这些资源。</p>
<p>所以,我觉得与其抱怨,我们首先应该做的就是接受、承认这种的不平等的事实。
接受和承认其实并不能改变任何事情,它只是让你不再纠结这个无解的问题。
而我们所能做的其实就是只有这样而已。</p>
<h1>比较依据</h1>
<p>原贴中很多参与者都在列出各种各样的例子来说明自己的观点,在和这些例子的对比中,我发现大家默认的对比标准就是拥有的财富数量。
如果一个人我认为他在一些方面不如我,但是他却拥有了更多的财富,我就会认为这个不公平。我就会产生各种负面的情绪。
虽然这样的思维范式很常见也很自然,但是其中却存在着很多的问题。</p>
<p>首先,评价一个人成功与否,财富只是众多标准中的一个而已。但是,现在大家似乎把财富当成了唯一的一个标准。
通常都是觉得拥有更多的财富就一定能成功。
其实不然,就像我在很多篇博文中提到的一样,判断一个其实不能看他得到了什么,应该要看他最终留下了什么。
就像是股票大势一样的,短期的各种波动情况都可能的发生的,但是长期来看,优质的公司必然会呈现上升的趋势,劣质的公司最终一定会被清盘出局的。</p>
<p>其次,在一些方面不如自己,就真的代表他不应该获得更多的财富吗?社会中的财富的流动可并不会因为人的意志而转移。它只是按照基本的经济原则在社会群体进行流转。
而这个经济绝不是「优秀的人获得更多的财富」.</p>
<h1>影响因素</h1>
<p>有太多的因素塑造了我们现在每个人各自所处的状态,而其中绝大多数因素其实都不是我们能决定的。
比如我们的出身,一个出身在偏远农村的人和一个出生在大城市里的人,其中的差距远远不止一代人的差距<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>;
比如大的社会、经济、政治环境,生活在现代自由国家的人一定会比当年生活在专制的东德幸福。
在众多的影响因素中,其实我们自己能够真正掌握的只有自己而已。其实,不管从什么程度上来说,个人的力量在社会大局中总是显得十分渺小。</p>
<h1>应对</h1>
<p>面对上面写的那么多的毒鸡汤,我们又能做什么呢?
其实,我们能做的并不多。为了我们的生活能够快乐的继续下去,我觉得我们能做的也只是:</p>
<ol>
<li>认识并承认这个世界是不公平的,而我们能改变的很有限。</li>
<li>努力提高自己,努力做好自己,因为这几乎是我们唯一能做的。</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>当然,总是会存在一些不符合这个论断的个例的。但是,个例却无法说明什么,<span class="math">\(0.01\%\)</span> 和 <span class="math">\(10\%\)</span>其实有着本质差别。如果只是扣着那<span class="math">\(0.01\%\)</span>的概率,是无法看清这个事实的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>「The Intelligent Asset Allocation」读书笔记2020-06-20T00:00:00-06:002020-06-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-20:/reading-list/The-Intelligent-Asset-Allocation/<p>「The Intelligent Asset Allocation」读书笔记</p><p>作者: <a href="https://en.wikipedia.org/wiki/William_J._Bernstein">William J. Bernstein</a></p>
<h1>摘录</h1>
<blockquote>
<p>A suboptimal strategy you can live with and execute is better than an optimal oen you can't.</p>
<p>It's only slight simplification to say that we own stocks to hedge long-term risk and bonds to hedge short-term risk.</p>
<p>Asset allocation is the only factor affecting your investments that you can actually influence.</p>
<p>A security of less than 1 year is called a Treasury bill, or more simply, a T-bill. An obligation of 1 to 10 years is called a note, and of greater than 10 years a bond.</p>
<p>It is the human nature to find patterns where there are one.</p>
</blockquote>
<h1>综述</h1>
<p>This is a well-written book. It shows how to construct your portfolios in the modern scoiety.</p>
<h1>结构和细部</h1>
<h2>General Considerations</h2>
<ul>
<li>Average Return: simply adding up all of the annual returns and dividing by the number of years.</li>
<li>Annualized Return (time weighted return): An annualized total return is the geometric average amount of money earned by an investment each year over a given time period. </li>
<li>Use the standard deviation as a measure of risk:<ul>
<li>Money market: 2%-3%</li>
<li>Short-term bond: 3%-5%</li>
<li>Long term bond: 6%-8%</li>
<li>Domestic stocks(conservative): 10%-14%</li>
<li>Domestic stocks(aggressive): 15%-25%</li>
<li>Foreign stocks: 15%-25%</li>
<li>Emerging markets stocks: 25%-35%</li>
</ul>
</li>
</ul>
<h2>The Behavior of Multiple-Assset Portfolios</h2>
<ul>
<li>Dividing your portfolio between assets with <strong>uncorrelated</strong> results increases return while decreasing risk.</li>
<li>Some key points about diversity:<ul>
<li>If two assets have similar long-term returns and risks and are not perfectly correlated, then investing in a fixed, rebalanced mix of the two not only reduces risk but also actually increases return.</li>
<li>If two poorly correlated assets have similar returns and risks, then the optimal mix of the two will be close to 50/50.</li>
</ul>
</li>
<li>It is difficult to find two assets that are uncorrelated, and it is practically impossible to find three. </li>
</ul>
<h3>Summary</h3>
<ul>
<li>The concept of correlation of assets is central to portfolio theory—the lower the correlation, the better.</li>
<li>Diversifying your portfolio among uncorrelated assets reduces risk and increases return. It is necessary to rebalance your portfolio periodically to capture this increased return.</li>
</ul>
<h2>The Behavior of Real World Portfolios</h2>
<ul>
<li>In the real world, the correlations usually cluster between 0.3 and 0.8</li>
<li>The essence of effective portfolio construction is the use of a large number of poorly correlated assets.</li>
<li>The correlation between two assets is not fixed, it can change over the time.</li>
<li>The real purpose of portfolio backtesting, mean-variance analysis, or any other kind of portfolio analysis is not to find the “best” asset mix. Rather, it is to find a portfolio mix that will not be too far off the mark under a wide variety of circumstances.</li>
<li>The efficient portfolois change over the time. There is no way of predicting the best portfolio for the next time period.</li>
</ul>
<h2>Optimal Asset Allocations</h2>
<ul>
<li>Sticking by your target asset allocation through thick and thin is much more important than picking the right asset allocation.</li>
<li>
<p>Mean-variance Optimizer</p>
<ul>
<li>An optimizer will heavily favor those assets with high historical or assumed returns.</li>
<li>If you can predict the optimizer inputs well enough to come close to the future efficient frontier, then you don’t need an optimizer in the first place.</li>
</ul>
</li>
<li>
<p>Three steps to design an asset allocation</p>
<ul>
<li>How many different asset classes do I want</li>
<li>How conventional a portfolio do I want</li>
<li>How much risk do I want to take</li>
</ul>
</li>
<li>
<p>Asset classes</p>
<ul>
<li>
<p>Level 1:</p>
<ul>
<li>U.S. large stocks (S&P 500)</li>
<li>U.S. small stocks (CRSP)</li>
<li>Foreign stocks</li>
<li>U.S. short-term bonds</li>
</ul>
</li>
<li>
<p>Level 2: </p>
<ul>
<li>U.S. large stocks (S&P 500)</li>
<li>U.S. small stocks (CRSP)</li>
<li>Foreign large stocks</li>
<li>Emerging market stock</li>
<li>Foreign small stocks</li>
<li>RETIs</li>
<li>U.S. short-term bonds</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2>Market Efficiency</h2>
<ul>
<li>No one cam time the market.</li>
<li>Indexing is the right way to do.</li>
<li>Using autocorrelation to test if we use the history to predict future.</li>
</ul>
<h2>Odds and Ends</h2>
<ul>
<li>
<p>Value Investing</p>
<ul>
<li>Price/Earnings(P/E) ratio: How much you are paying for the earnings. <ul>
<li>P/E=30 <span class="math">\(\Rightarrow\)</span> expensive</li>
<li>p/E=10 <span class="math">\(\Rightarrow\)</span> cheap</li>
</ul>
</li>
<li>Price/Book(P/B) ratio<ul>
<li>Book Vale <span class="math">\(\approx\)</span> net value of the cooporate</li>
<li>P/B>5 <span class="math">\(\Rightarrow\)</span> expensive</li>
<li>P/B<1 <span class="math">\(\Rightarrow\)</span> cheap</li>
</ul>
</li>
<li>Dividend yield: it is simply the amount of dividend remitted to the shareholders divided by the price of the stock.</li>
<li><strong>Good companies are generally bad stocks, and bad companies are generally good stocks.</strong></li>
</ul>
</li>
<li>
<p>Three-factor Model: any stock asset class earns four different returns:</p>
<ul>
<li>The risk-free rate, that is, the time value of money. Usually set at the short-term T-bill rate.</li>
<li>The market-risk premium. That additional return earned by exposing yourself to the stock market.</li>
<li>The size premium. The additional return earned by owning small-company stocks.</li>
<li>The value premium. The additional return earned by owning value stocks.</li>
</ul>
</li>
</ul>
<h2>Implementing Your Asset Allocation Strategy</h2>
<ul>
<li>
<p>Choosing Your Allocation</p>
<ul>
<li>Determine your basic allocation between stocks and bonds. Answer this: “What is the biggest annual portfolio loss I am willing to tolerate in order to get the highest returns?”</li>
<li>Determine how much complexity you can tolerate.</li>
<li>Determine how much tracking error you can tolerate.</li>
</ul>
</li>
<li>
<p>Vanguard and DFA</p>
<ul>
<li>Recommended Vanguard Mutual Fund<ul>
<li>Vanguard 500 Index Fund</li>
<li>Vanguard Tax-Managed Growth and Income Fund</li>
<li>Vanguard Total Stock Market Index Fund<ul>
<li>75% large cap + 15% mid cap and 10% small cap</li>
</ul>
</li>
<li>Vanguard Value Index Fund<ul>
<li>This fund tracks the bottom 50% of market capitalization of the S&P 500 when sorted by price/book ratio.</li>
</ul>
</li>
<li>Vanguard Small-Cap Index Fund </li>
<li>Vanguard Tax-Managed Small-Cap Fund.</li>
<li>Vanguard Small-Cap Value Index</li>
<li>Vanguard European and Pacific Stock Index Funds.</li>
<li>Vanguard Emerging Markets Stock Index Fund.</li>
<li>Vanguard Total International Stock Index Fund.</li>
<li>Vanguard REIT Index Fund.</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Executing the plan</p>
<ul>
<li>Dollar Cost Average (DCA) is a wonderful technique, but it is not a free lunch.</li>
<li>Value average is also a usful technique.</li>
</ul>
</li>
<li>
<p>Rebalance </p>
<ul>
<li>One or two years is good enough.</li>
</ul>
</li>
<li>
<p>Final words:</p>
<ul>
<li>Risk and reward are inextricably entwined.</li>
<li>Those who do not learn from history are condemned to repeat it.</li>
<li>Portfolios behave differently than their constituent parts.</li>
<li>For a given degree of risk, there is a portfolio that will deliver the most return; this portfolio occupies the efficient frontier of portfolio compositions.</li>
<li>Focus on the behavior of your portfolio, not on its constituent parts.</li>
<li>Recognize the benefits of rebalancing.</li>
<li>The markets are smarter than you are; they are also smarter than the experts.</li>
<li>Know how expensive the tomatoes are.</li>
<li>Good companies are usually bad stocks; bad companies are usually good stocks.</li>
<li>In the long run, it is very hard to beat a low-expense index mutual fund.</li>
</ul>
</li>
</ul>
<h2>Investment Resources</h2>
<ul>
<li>Reading List:<ul>
<li><em>Random Walk Down Wall Street</em>, Burton Malkiel</li>
<li><em>Common Sense on Mutual Funds</em>, John Bogle</li>
<li><em>Asset Allocation</em>, Roger Gibson</li>
<li><em>Global Investing</em>, Roger Ibbotso and Gary Brinson</li>
<li><em>What Has Worked in Investing</em>, Tweedy, Browne</li>
<li><em>The New Finance: The Case Against Efficient Markets</em>, Robert Haugen</li>
<li><em>Value Averaging</em>, Michael Edleson</li>
<li><em>The Intelligent Investor</em>, Ben Graham</li>
<li><em>The Wall Street Journal.</em></li>
<li><em>Portfolio Selection</em>, Harry Markowitz</li>
<li><em>Stocks, Bonds, Bills, and Inflation</em>, Ibbotson Associates</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>这是一本非常高质量的书,书的作者本身是一个化学博士,还是神经科医生。作为一个科学从业者,他的写作能力非常高超,整本书的阅读体验非常好。
论点有理有据,是一本不可多得的好书。</p>
<h1>和我的关系</h1>
<p>这本书从纯数学角度分析了为什么多元分散的投资能够减少风险的同时提高收益。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>小乌龟投资智慧2: 投资丛林生存法则2020-06-13T00:00:00-06:002020-06-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-13:/reading-list/Little-Tortoise2/<p>「小乌龟投资智慧2」读书笔记</p><p>作者: 伍治坚</p>
<h1>摘录</h1>
<blockquote>
<p>在做任何判断,或者听取任何意见之前,我们应该先认清其背后的利益激励</p>
</blockquote>
<h1>结构和细部</h1>
<p>本书通过大量的案例阐述了金融投资界的各种猫腻。</p>
<h2>位置决定脑袋</h2>
<ul>
<li>理财产品的销售人员的收入和销售业绩挂钩,他们的利益和我们的利益并不一致</li>
<li>区分好的和坏的投资建议<ul>
<li>
<table>
<thead>
<tr>
<th align="center">好的投资建议</th>
<th align="center">坏的投资建议</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">知识型</td>
<td align="center">销售型</td>
</tr>
<tr>
<td align="center">以客户本身的需求为导向</td>
<td align="center">以销售的金融产品为导向</td>
</tr>
<tr>
<td align="center">通过改变客户的投资习惯来提升其理财能力</td>
<td align="center">通过售卖投资产品来解决客户的理财需求</td>
</tr>
</tbody>
</table>
</li>
</ul>
</li>
<li>知识型和销售型<ul>
<li>销售型:<ul>
<li>推销过高收费的金融产品</li>
<li>基金经理不买自己的产品</li>
<li>以超市推销法攻克客户心理</li>
<li>倾向于推销时髦的投资产品</li>
<li>永远不会对投资者说: 够了</li>
</ul>
</li>
<li>知识型:<ul>
<li>以投资者个人需求为导向</li>
<li>利益冲突信息披露</li>
<li>身体力行,看顾问自己有没有按照自己推荐的方案去投资</li>
<li>自我提升</li>
</ul>
</li>
</ul>
</li>
<li>
<p>给理财顾问的问题列表</p>
<table>
<thead>
<tr>
<th align="center">序号</th>
<th align="left">问题</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">1</td>
<td align="left">你从这款理财产品中可以获得多少佣金收入</td>
</tr>
<tr>
<td align="center">2</td>
<td align="left">这款理财产品和其他产品相比处于什么水平?你们卖的产品最贵的佣金和最便宜的佣金分别是多少</td>
</tr>
<tr>
<td align="center">3</td>
<td align="left">你自己和家人有没有购买这款理财产品?买了多少?</td>
</tr>
<tr>
<td align="center">4</td>
<td align="left">可否将你收取的费用、该理财产品基金经理的收费以及其他所有相关费用明细都列一下</td>
</tr>
<tr>
<td align="center">5</td>
<td align="left">这款产品的风险有哪些,最坏情况是什么样的</td>
</tr>
<tr>
<td align="center">6</td>
<td align="left">如果我赚了10%,你们赚多少,如果我亏10%,你们赚/亏多少</td>
</tr>
<tr>
<td align="center">7</td>
<td align="left">你销售的这款产品来自于第三方还是关联方?你在销售该产品时有没有利益冲突</td>
</tr>
<tr>
<td align="center">8</td>
<td align="left">你的学历和职业资格是什么?考取的相关证书是什么?</td>
</tr>
<tr>
<td align="center">9</td>
<td align="left">你如何管理自己和家人的储蓄</td>
</tr>
<tr>
<td align="center">10</td>
<td align="left">你在这家公司工作几年了?之前都卖过哪些产品</td>
</tr>
</tbody>
</table>
</li>
</ul>
<h3>人性本傻</h3>
<ul>
<li>幸存者偏差</li>
<li>小样本偏见</li>
<li>心理账户</li>
<li>锚定效应</li>
<li>赢家诅咒: 拍卖中,最后的买家付出了高于竞拍品价值的价格</li>
<li>过度自信</li>
</ul>
<h3>英雄榜的背后</h3>
<ul>
<li>基金排名并没有太多的指导意义,现在的top50和5年前的top50完全不一样</li>
<li>对基金未来业绩最有相关性的三个因素是:<ol>
<li>基金费用</li>
<li>基金规模</li>
<li>基金策略</li>
</ol>
</li>
</ul>
<h3>简单的事情复杂化</h3>
<ul>
<li>销售人员更喜欢卖复杂的产品</li>
<li>只买自己懂的产品,坚决不买自己不理解或不懂的</li>
<li>策略: 只选择常见的资产大类,其他的产品都属于金融衍生品</li>
</ul>
<h3>信息就是力量</h3>
<ul>
<li>查询基金公司的背景、人员履历</li>
<li>理解产品的收费结构</li>
<li>基金管理团队和投资人之间的利益冲突</li>
</ul>
<h3>狐狸和乌鸦</h3>
<ul>
<li>券商和股民<ul>
<li>股民的目标是赚钱</li>
<li>券商的目标是增加交易次数</li>
</ul>
</li>
<li>向赌场学习策略<ul>
<li>如果赢的概率不如对方,那就只能想办法速战速决,不能让大数定理发挥作用</li>
<li>如果胜率高于对方,那就应该尽量重复游戏,越多越好,发挥大数定理的作用</li>
<li>在美国股市中过去的60年里,有54%的天数是上涨的,有46%天数是下跌的,因此股市赚钱的一个策略就是坚持,利用大数定律。</li>
</ul>
</li>
</ul>
<h3>风口上的猪</h3>
<ul>
<li>私募股权介绍<ul>
<li>不同的阶段<ul>
<li>创业投资(风险投资): 初创企业的早期</li>
<li>成长资本: 被投资公司已经形成一定的规模</li>
<li>收购</li>
</ul>
</li>
<li>特点:<ul>
<li>不透明</li>
<li>流动性差</li>
<li>风险高</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>正确计算投资回报</h3>
<ul>
<li>时间加权(time weighted return)<ul>
<li>基本假设: <strong>投资者的投资金额是不变的,中间没有发生追加或赎回</strong></li>
<li>计算: 每个周期收益率的几何平均值</li>
<li>Example: 某只基金的3年回报率为: <span class="math">\(+10\%, -5\%, +7\%\)</span>.</li>
<li>TWR=<span class="math">\(((1+0.1)\times (1-0.05)\times (1+0.07))^{\frac{1}{3}}-1=0.0379\)</span></li>
</ul>
</li>
<li>资金加权(dollar weighted return)</li>
<li>考虑所有现金流入和流出的投资组合的内部收益率</li>
<li>当谈到投资者的投资组合时,时间加权收益率几乎是无关紧要的,因为期限并不总是相等的,而且TWR忽略了资金的出入</li>
</ul>
<h3>投资前的问题</h3>
<ol>
<li>利益绑定。管理人/卖方的利益和自己有绑定还是有冲突</li>
<li>投资费用。该产品的费用是不是市场最有竞争力之一</li>
<li>价值。该产品是否能产生价值</li>
</ol>
<h1>评价</h1>
<p>这本书的总体感觉没有该系列的上一本那么扎实。我现在越来越讨厌标题起不好的书籍或文章了。光看目录完全不明白本书想要说些什么,不得不花时间去阅读每一章节的内容。本系列的第一本书是标题好的例子,而这本则是标题差的例子。</p>
<h1>和我的关系</h1>
<p>本书给我最大的启示是,向我展示了「坚持」和「大数定理」之间的关系。正因为整个股市是呈现上升的趋势,所以我们的坚持才有意义。用书中的数据来说,一年中有54%的天数股市是上涨的,有46%的天数是下跌的。这相当于抛一个已知概率的不平均的硬币。如何能保障胜率?那就是使用大数定律,抛尽量多的次数,使得它出现正面的概率回归到它真实的概率:54%。坚持时间足够长,我们总是会有收益的。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>为什么坚持努力是正确的策略2020-06-13T00:00:00-06:002020-06-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-13:/weekly-blog/Why-Persistence-Is-The-Right-Thing-To-Do/<p>利用概率论来解释坚持的重要性</p><p>最近一段时间一直都是在阅读有关投资理财的书籍,大量相关的书籍都在传达这样的一个理念: <strong>长期坚持才是投资的关键</strong>。
很多人给出的理由是,股市总是会起起伏伏的,但是总体趋势一定是增长的,因为人类创造的财富总是在增长的。
这个说法似乎是很有道理的,但是,我总是觉得缺了一点什么,无法完全的说服我。
直到最近我在阅读「小乌龟投资智慧」系列的第二册的时候,书中给出的数据使我完全信服了「长期坚持」这个方法论的正确性。
数据其实很简单,据统计,一年中有<span class="math">\(54\%\)</span>的天数股市是上涨的,而有<span class="math">\(46\%\)</span>的天数是下降的。
这就是相当于一个概率不平均的硬币,而这个硬币有<span class="math">\(54\%\)</span>的概率会出现正面,有<span class="math">\(46\%\)</span>的概率会出现反面。
那么什么样的策略能保证胜率呢?
很显然,我们这个时候就应该利用<a href="https://en.wikipedia.org/wiki/Law_of_large_numbers">大数定律</a>,尽量多的进行实验,使得它出现正面的概率回归到它真实的概率:<span class="math">\(54\%\)</span>。
只要坚持的时间足够长,我们总是会有收益的<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<p>反过来说,如果我们已经知道一个资产的能够获利的概率是小于<span class="math">\(50\%\)</span>的,那么合理的策略又是什么呢?
一个合适的策略就是「赢了就跑」,我们不应该在这样的资产上重复投资,因为根据<a href="https://en.wikipedia.org/wiki/Law_of_large_numbers">大数定律</a>,时间越长,我们亏本的概率就越大。</p>
<p>同样的道理也可以应用到日常生活工作的方法论上,只有不断的<strong>坚持努力</strong>,才有可能走向成功。这里的关键点在于:</p>
<ul>
<li><strong>努力</strong>: 通过自身把握努力的方向和方法,最大化我们每次出现「正面」的概率。</li>
<li><strong>坚持</strong>: 把努力这种行为长期坚持,这样的就能使得我们利用<a href="https://en.wikipedia.org/wiki/Law_of_large_numbers">大数定律</a>,使得真实的成功概率无限接近我们出现「正面」的概率。尽量放大我们最终成功的概率。</li>
</ul>
<p>需要注意的是,「坚持努力」只能略微增加成功的概率,并不意味着「坚持努力」就一定能成功。这只是一个概率化的模型。</p>
<p>当然,也可以反过来看。这个社会上每天都有无数的人在为了生活而奔波,而当样本量足够大的时候,再小概率的时间也是有可能发生的。
比如,有人会喜从天降,中了上亿的彩票,一下子走向人生巅峰。
但是这并不意味着这是一个可重复的事件,更加不意味着守株待兔是一个合理的策略。
更多的人只是在毫无希望的等待中蹉跎了岁月。</p>
<p>虽然「坚持努力」不能保证一定成功,但它至少系统地提高了成功的可能性。在所有可能的策略中,「坚持努力」依然是一个最好的选择。</p>
<p>当我们把生活中的一切事物都看成是概率的时候,很多朴素的道理其实都可以用简单的数学来阐释。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>当然,真实的投资情况要复杂的多,但是这是一个非常不错的解释角度。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>「小乌龟投资智慧」读书笔记2020-06-02T00:00:00-06:002020-06-02T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-06-02:/reading-list/Little-Tortoise/<p>「小乌龟投资智慧」读书笔记</p><p>作者: 伍治坚</p>
<h1>摘录</h1>
<blockquote>
<p>坚持3个基本原则: 有效系统、控制成本和长期坚持.</p>
</blockquote>
<h1>综述</h1>
<p>本书是针对小白的入门级投资书籍。它首先分析了日常投资中人们常犯的三个错误:</p>
<ol>
<li>非理性</li>
<li>成本</li>
<li>长期坚持</li>
</ol>
<p>通过对这三个错误的简单分析,提出了相应的应对策略。
在分析了这些错误之后,作者又介绍了两种投资理论: <em>市场有效理论</em>和<em>贝塔理论</em>。
接着,又分析了各个大类资产的特点以及投资策略。
最后,总结了资产配置的具体策略。</p>
<h1>结构和细部</h1>
<h2>投资者最易犯的3大错误</h2>
<ul>
<li>对自己非理性的认识不足</li>
<li>对投资成本重要性的认识不足</li>
<li>对长期坚持的重要性的不足</li>
</ul>
<h3>错误一: 对自己的非理性认识不足</h3>
<ul>
<li>不理性</li>
<li>过度自信(Overconfident)</li>
<li>可利用性偏见(Availability Bias): 我们更加容易被自己所看到的或者听到的东西影响,而不是依靠统计学知识的理型思考</li>
<li>处置效应(Disposition Effect): 盈利和亏损之间不对称效用偏好。对于相同数目的钱,在亏钱的时候,我们会感到更多的痛苦。</li>
<li>后视镜偏见(Rear-view Mirror Bias)</li>
<li>锚定偏见(Anchoring)</li>
<li>代表性偏见(Representative Bias)</li>
</ul>
<h3>错误二: 对投资成本的重要性认识不足</h3>
<ul>
<li>寻找明星基金经理未必是最优的选择</li>
<li>基金经理的利益与投资者并不一致,存在代理人问题</li>
</ul>
<h3>错误三: 对长期坚持的重要性认识不足</h3>
<ul>
<li>股市长期趋于稳定,短期波动巨大</li>
<li>对策: 多元分散<ul>
<li>资产分散: 不同资产类别</li>
<li>市场分散: 不同国家市场</li>
<li>时间分散: 坚持长期投资</li>
</ul>
</li>
</ul>
<h2>投资者必须了解的投资理论</h2>
<h3>市场有效理论</h3>
<ul>
<li>市场有效性: 股票价格已经包含了所有的相关信息<ul>
<li>市场很难被战胜,天上不会掉馅饼</li>
<li>市场的价格总是正确的(只是假设)</li>
</ul>
</li>
<li>关键是避免错误, 长期坚持</li>
<li>市场不完全有效 <span class="math">\(\neq\)</span> 自己有能力从中获利</li>
</ul>
<h3>贝塔理论</h3>
<ul>
<li>总回报= 市场回报 + 超额回报(<span class="math">\(\alpha\)</span>)</li>
<li><span class="math">\(\beta=\frac{Cov(r_a,r_b)}{Var(r_b)}\)</span>, <span class="math">\(\beta\)</span>是用来衡量资产相对于市场的波动程度,也即风险。</li>
<li><span class="math">\(\beta > 1 \Rightarrow\)</span> 高风险</li>
<li><span class="math">\(\beta < 1 \Rightarrow\)</span> 低风险</li>
<li><span class="math">\(\beta\)</span>只是衡量风险,与回报无关</li>
<li>理想的投资项目应该是:<ul>
<li>正的<span class="math">\(\alpha\)</span></li>
<li>低的<span class="math">\(\beta\)</span></li>
</ul>
</li>
<li>因子模型<ul>
<li>价值</li>
<li>红利</li>
<li>动量</li>
</ul>
</li>
</ul>
<h2>大类资产的投资策略</h2>
<h3>股票投资的最佳策略</h3>
<ul>
<li>从长期来看,股票能够给予投资者最好的投资回报,并且能够帮助投资者有效的应对通货膨胀风险</li>
<li>把股票当成资产,而不是投机工具</li>
<li>投资变成赌博的11个经典症状:<ul>
<li>经常买卖股票</li>
<li>经常打听关于股票的小到消息,沉迷于对股票的研究而影响自己的正常生活</li>
<li>玩的资金越来越大</li>
<li>多次试图控制或停止却欲罢不能</li>
<li>当有现金时,无法控制自己不去买股票</li>
<li>通过股市搏杀来转移自己的注意力</li>
<li>投资失利之后,试图购买更多的股票把钱赚回来</li>
<li>向自己的家人和朋友撒谎掩盖自己的炒股行为</li>
<li>通过非法手段为自己集资炒股</li>
<li>借钱炒股</li>
<li>沉迷股票而影响家庭关系</li>
</ul>
</li>
<li>设计的股票指数的标准<ul>
<li><strong>市值加权: S&P500</strong></li>
<li>GDP加权</li>
<li>价格加权: 道琼斯工商指数</li>
<li>等权重指数:</li>
</ul>
</li>
<li>市值加权是最佳的指数</li>
</ul>
<h3>债券投资策略</h3>
<ul>
<li>低风险资产</li>
<li>和股市的相关性不大</li>
<li>回报分类<ul>
<li>无风险回报(Tisk Free Rate): 短期国债<ul>
<li>政府可以印钞,所以基本可以认为短期国债是无风险的</li>
</ul>
</li>
<li>期限溢酬(Term Premium): 承担长期风险中获得的超过无风险回报的那部分投资回报(长期国债)<ul>
<li>历史数据来看,7年以上的长期国债,期限溢酬已经降低为0了</li>
</ul>
</li>
<li>信用利差(Credit Spread): 投资者购买的公司或房地产抵押的债券,由于投资者承担了公司违约的信用风险,因此他需要获得超额回报作为补偿。(公司债券)<ul>
<li>公司债券的风险小于公司股票<ul>
<li>公司债券的派息率是固定的</li>
<li>公司破产的时候,债券持有人的优先权在股东之上</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>投资债券,需要关注通货膨胀的风险<ul>
<li>债券的利息是固定的,如果通货膨胀率较高,投资者收到的回报就缩水了</li>
<li>防通胀债券</li>
</ul>
</li>
<li>不建议购买的公司债券的原因<ul>
<li>公司的管理层永远是希望债券价格降下降的,因为他们可以用低廉的价格回购债券</li>
</ul>
</li>
<li>债券投资建议<ul>
<li>不仅要持有美国和中国的国债,也要持有其他国家的国债</li>
<li>如果一个投资组合中只有股票,在其中加入公司债券,可以降低投资组合的风险</li>
<li>聪明的投资者,会寻找成本最低的方式去实现跨国多资产配置组合</li>
</ul>
</li>
</ul>
<h3>大宗商品投资策略</h3>
<ul>
<li>大宗商品简介<ul>
<li>可进入流通领域,但非零售环节,具有商品属性并用于工农业生产与消费使用的大批量买卖的物质商品</li>
<li>能源类<ul>
<li>传统能源: 石油、天然气、煤</li>
<li>生物能源: 生物柴油、燃料乙醇</li>
</ul>
</li>
<li>金属类<ul>
<li>贵金属: 铜、铝</li>
<li>贱金属: 黄金、白金</li>
</ul>
</li>
<li>农产品<ul>
<li>谷物: 小麦、玉米、大豆</li>
<li>肉类: 牛、羊</li>
<li>软商品: 糖、咖啡、可可</li>
</ul>
</li>
<li>期货,期货价格和现货价格是两个概念</li>
</ul>
</li>
<li>
<p>投资和投机的区别:</p>
<ul>
<li>投资的收益来自于资产的内生性产出</li>
<li>
<p>投机的收益来自于市场情绪的波动</p>
</li>
<li>
<table>
<thead>
<tr>
<th align="center">投资</th>
<th align="center">投机</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">公司股票</td>
<td align="center">大宗商品</td>
</tr>
<tr>
<td align="center">债券</td>
<td align="center">郁金香</td>
</tr>
<tr>
<td align="center">现金</td>
<td align="center">艺术品</td>
</tr>
<tr>
<td align="center">房产</td>
<td align="center"></td>
</tr>
</tbody>
</table>
</li>
</ul>
</li>
<li>
<p>大宗商品<strong>不是</strong>投资的原因</p>
<ul>
<li>大宗商品本身不产生价值:回报只来自于未来某个时间段有人以更高的价格买走你手上的大宗商品</li>
<li>大宗商品现货的风险溢价几乎为零</li>
<li>其价格波动太过剧烈,无法对抗通胀</li>
</ul>
</li>
<li>大宗商品<strong>是</strong>投资的理由<ul>
<li>现货不是投资、期货是投资</li>
<li>期货可以用来抗通胀</li>
<li>期货的收益来自于转仓收益</li>
<li>大宗商品的内在价值来自原其稀缺性,以及将其开采出来的资金和劳力</li>
<li>大宗商品的价格和股票以及债券回报的相关性不高</li>
</ul>
</li>
</ul>
<h3>对冲基金投资</h3>
<ul>
<li>投资对冲基金的原因<ul>
<li>获取<span class="math">\(\alpha\)</span></li>
<li>提供和传统资本市场不相关的回报</li>
</ul>
</li>
<li>对冲基金没有义务公开自己的业绩<ul>
<li>幸存者偏差,很多对冲基金只会公开他们业绩好的时间段</li>
<li>改写历史(Back Fill). 只申报一堆基金中业绩最好的几个</li>
<li>自我淘汰: 基金业绩不好的时候就会关闭,但不会申报差的业绩</li>
</ul>
</li>
<li>对冲基金的交易策略<ul>
<li>对冲股票策略(Equity Long Short)</li>
<li>期货交易策略(Managed Future/CTA)</li>
<li>债券策略(Credit Stratgey)</li>
<li>相对价值策略(Relative Value)</li>
<li>宏观策略(Macro Strategy)</li>
<li>事件驱动策略(Event Driven Strategy)</li>
</ul>
</li>
</ul>
<h2>资产配置策略详解</h2>
<h3>大类资产的特点和风险</h3>
<ul>
<li>现金<ul>
<li>通货膨胀的风险</li>
<li>汇率风险</li>
</ul>
</li>
<li>股票<ul>
<li>股票如果长期持有,是能够保证战胜通货膨胀的</li>
<li>必须是多元分散的</li>
<li>必须长期坚持(十年以上)</li>
</ul>
</li>
<li>债券<ul>
<li>通货膨胀可能会使债券的回报是负的</li>
</ul>
</li>
<li>防通胀国债(TIPS)<ul>
<li>首要风险: 政府赖账</li>
<li>风险二: 通货不膨胀</li>
<li>如果没有发生通货膨胀,TIPS的利率有可能是负的</li>
</ul>
</li>
<li>房地产<ul>
<li>持有时间越长,回报越稳定</li>
<li>波动比较大</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center">资产类别</th>
<th align="left">风险</th>
<th align="left">应对方法</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">现金</td>
<td align="left">通货膨胀, 汇率风险</td>
<td align="left">购买抗通货膨胀资产,购买外汇进行多元分散</td>
</tr>
<tr>
<td align="center">政府债券</td>
<td align="left">通货膨胀,利率风险</td>
<td align="left">购买抗通胀资产,投资股票</td>
</tr>
<tr>
<td align="center">防通胀国债</td>
<td align="left">通货不膨胀,政府违约</td>
<td align="left">购买外汇和其他资产</td>
</tr>
<tr>
<td align="center">公司债券</td>
<td align="left">公司违约,通货膨胀,缺乏流动性</td>
<td align="left">投资其他资产,多元分散,减少交易频率</td>
</tr>
<tr>
<td align="center">公司股票</td>
<td align="left">公司不赚钱或倒闭,价格波动</td>
<td align="left">多元分散,长期持有</td>
</tr>
<tr>
<td align="center">房地产</td>
<td align="left">房价或租金下跌,缺乏流动性</td>
<td align="left">投资其他资产,减少交易评率</td>
</tr>
</tbody>
</table>
<ul>
<li>债券股票的投资组合<ul>
<li>持有股票的比例取决于持有周期,周期越长,那么可以持有股票的比例越高</li>
<li>如果周期是20年以上,那么债券的回报就远不如股票</li>
</ul>
</li>
</ul>
<h3>在全球范围进行资产配置</h3>
<ul>
<li>最重要的大类资产<ul>
<li>股票</li>
<li>短期政府债券</li>
<li>长期政府债券</li>
<li>防通胀债券</li>
<li>房地产信托</li>
</ul>
</li>
<li>配置原则: 根据风险对资产配置</li>
</ul>
<table>
<thead>
<tr>
<th align="center">类别</th>
<th align="center">资产</th>
<th align="center">资产</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">偏风险资产</td>
<td align="center">股票</td>
<td align="center">房地产信托</td>
</tr>
<tr>
<td align="center">偏保守资产</td>
<td align="center">长期政府债券</td>
<td align="center">防通胀债券</td>
</tr>
<tr>
<td align="center">兼有风险和保守的资产</td>
<td align="center">公司债券</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">无风险资产</td>
<td align="center">短期政府债券</td>
<td align="center"></td>
</tr>
</tbody>
</table>
<h1>评价</h1>
<p>一开始读的时候,还以为都是一些常见的投资建议,并没有期望能从本书中学到很多新见解。然而,随着阅读的深入,我发现本书中还是有很多干货的。比如,书中就明确地对「投资」和「投机」进行了定义和区分,而且目前来说,我还是比较认可书中的定义的。
另外,本书还总结了常见的各个大类资产,对于复习这些信息还是很有用的。</p>
<h1>和我的关系</h1>
<p>加强了我对一些常见资产的认知,最重要的是帮助我理清了投资和投机的区别。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>游戏 v.s 现实2020-05-16T00:00:00-06:002020-05-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-05-16:/weekly-blog/Game-vs-Reality/<p>游戏和现实的比较</p><p>我平时是比较喜欢玩一些策略或模拟养成游戏的。这些游戏都是尽量在模拟现实社会中的各种情况,来营造一种真实的感觉,从而带给玩家一种无法在现实社会中实现的快感。
我常常在想,为什么在现在这些游戏已经变得如此复杂的情况下,玩家们还是能够完美胜利呢?
要知道,一些复杂的策略游戏可以复杂到单纯的操作界面就可以说是眼花缭乱了。</p>
<p>后来我才意识到,游戏相比于现实,其实难度还是小了好几个数量级的。
我认为主要有以下两个不同,导致了游戏的复杂度是永远无法和现实世界比拟的:</p>
<ol>
<li>量化</li>
<li>预知</li>
</ol>
<p>游戏的一大特色,就是能够把所有的概念都量化出来,比如人物角色的生命值、魔法值,策略游戏中的军队数量、战斗力,养成类游戏中别人的好感度、人物的经验值等等。
当这些概念全部量化出来之后,玩家就能非常容易地理解自己所处的状态,以做出最好的决策。
然而,在现实社会中,根本没有这样的量化体系。
我们只能以非常直观的感官来评价周围的环境,比如目标是考试95分以上,我需要付出多少努力?我想要去google工作,我又需要付出多少努力和时间?这些问题都是无法量化的而且没有即时的反馈,我们非常容易就迷失在生活的迷雾中。</p>
<p>游戏和生活另一个本质的差别就是,再复杂的游戏本质上是可预知的。很多策略游戏中引入了大量的随机性,但是却永远无法抹除可预知性。比如,一些策略游戏中,玩家知道在未来的某一个时间点,我需要建造一些建筑来提高自己的实力,而这些建筑又需要各种前置建筑。
在提前知道这些信息之后,玩家能从一开始就做出最合理的安排。
而现实世界却不是这样的,我们无法预知十年、五年甚至一年以后的事情。
我们只能走一步看一步,永远无法做出全局最优的决策。
当然,有很多前人留下的经验可以传授,但是这些经验却都是孤立的、具有较强的个人偏差。</p>
<p>和游戏相比的,现实世界是无法量化且无法预知的,这决定了这两者之间的本质区别。
也正因为如此,现实世界才变得如此精彩纷呈,不是一个简单的套路或策略就能赢得胜利的。
正因为无法量化的特点,现实需要我们学会更加合理理性的看待自己,看待世界。「know yourself」是我至今最喜欢的一句话。
在现实世界中,真正能做到的「know youself」的又有几人?</p>
<p>无法预知的另外一层意思就是,未来充满的了希望。游戏中的进程总是可以预知的,而现实却不是这样的。
有太多的事情是我们无法掌控的,更多的事情是我们不知道的,但是这些事情或多或少都会影响我们的现在和未来。
如果,现实是可以预知的,并且能从一开始就做好最优的全局规划,那现实世界会变得非常单调和无聊。</p>用概率论的眼光看待世界2020-05-10T00:00:00-06:002020-05-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-05-10:/weekly-blog/Probability/<p>用概率论的眼光看待世界</p><p>我曾经在之前的文章(<a href="http://zhouyichu.com/words/Attribution/">正确的归因
</a>)中提到了正确归因的重要性。今天,我想从概率论的角度来看待归因这件事。</p>
<p>这个世界是如此的复杂,虽然事情的本质基本上都是可以用「因果律<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>」来解释的,但是,这个世界已经复杂到没人能够完全掌握所有的信息并且做出正确的因果推断了。比如,一个高中生平时努力学习,
并不一定能够保证高考一定能考出好成绩。「考出好成绩」这个结果受到太多因素的影响,「平时努力」只是其中一个权重比较大的影响因素而已。与其把这个世界看成是简单的因果律问题: </p>
<div class="math">$$
\text{「平时努力」} \rightarrow \text{「考出好成绩」}
$$</div>
<p>我们其实应该把它看成是一个概率问题:</p>
<div class="math">$$P(\text{考出好成绩}\vert \text{平时努力}) > P(\text{考出好成绩}\vert \text{平时不努力})$$</div>
<p>这个世界没有什么理论或天理保证,你的努力一定会收到回报,所有的一切不过都概率而已。有些简单的事情,它的概率被非常少的影响因素所影响,因此表现得像是因果律一样: 我做到了A事件,就一定会触发B事件。这其实可以理解为:</p>
<div class="math">$$
P(B\vert A) \approx 0.99999
$$</div>
<p>但是,更多的事情是如此的复杂,被太多的因素所影响,你能所掌握的也许只是众多影响因素的中很少的一部分。还是高考的例子,作为学生我们所能做的就是「平时努力学习」,「考试时调整心态」等有限的几个事情。而最终能够影响考试成绩的因素却远不止这些,比如「当年的高考政策」,「当年的改卷政策」等等。</p>
<p>另一方面,这些事情被如此多的因素所影响着,而我们个人能改变的只是其中很好的一部分,这说明其实在很多时候,我们所能做出的对概率的提升其实是很有限的,毕竟我们只能改变很少的一部分影响因素.</p>
<p>如此看待这个世界,不仅仅会让自己的变得更加平和,更加能帮助自己正确的归因。
很多事情,其实并不一定是你做错了什么,只是刚好这次概率结果落在了其他的区间里。
这也在告诉我们,一个好的行为模式、好的思维方式、极高的智商并不代表你就一定能够成功,因为这个世界的概率化的,不是简单的因果律。</p>
<p>如此看待这个世界,可以给我们不少的启示:</p>
<ol>
<li>我们平时所有的努力都只是在增加取得成功的概率,并不一定能够保证成功。</li>
<li>失败并不代表着自己的方式和方向是错误的,也许仅仅只是自己这次运气不好。</li>
<li>一定要学会正确的归因,到底自己的行为是增加了还是降低了想要做的事情的成功概率。</li>
<li>这个世界有太多的事情使我们无法掌握的,我们需要放平心态,坦然接受这个世界所产生的的所有结果。</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>虽然存在很多争议,但是我认为在彻底推翻因果律之前,它依
然是人类认识世界的最重要的手段。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>痛苦不等于难2020-05-09T00:00:00-06:002020-05-09T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-05-09:/weekly-blog/Something-Pain-not-Hard/<p>有些事只是痛苦,但不难</p><p>有些事情,其实做起来只是很痛苦,但它不难。
我发现,在我过去的生活经验中,我常常把这两者不做区分。
在做一件事情的时候,如果感受到了痛苦,就自动得出这件事是一件很难的事情的结论。
后来,我才慢慢发现,其实这两者还是有很大区别的。</p>
<p>有些事情,做起来总是很痛苦的,但是这未必就说明它超出了你的能力范围,未必就是一件很困难的事情。
比如,写论文这件事。每当我需要写作论文的时候,总是会有一种莫名的痛苦的感觉,老实说,我宁愿去多跑几组实验或者重构一下代码。但是,作为一个博士生、科研从业者,写论文这种基本业务是无法躲避的。
当我认真开始写作的时候,其实发现自己并不是写不出来,真正有料的东西其实早就在脑海中了(不然也不会开始写论文,而是在继续跑实验了),我需要做的就是将其组织成文字。
这个过程,由于生疏或经验不足,感到手下有了千钧之力,难以下笔。因而产生了一种「写论文是一件很难的事情」的错觉。其实并不是这样的,它只是让我感到痛苦,因为我并没有太多写论文的经验,但是它其实并不难。科研论文都是有着一定的范式的,按照范式去写,并不是一件很困难的事情。</p>
<p>我觉得,理解了「痛苦」和「困难」之间的区别,对正确判断一件事对自己的影响还是很重要的。
当你做一件事情感到的痛苦的时候,说明你并不喜欢这件事,而且你对这件事可能很生疏,并没有太多的经验。但是这件事并没有超出自己的能力范围,认真去做还是可以做好的。完成这件事,会增长自己最此类事件的经验。
当你做一件事情感到困难的时候,我认为这才是可以真正提高的自己的时候。你会感到困难,说明这件事超出了你的能力范围。做好这件事情,可以大大扩展自己的能力范围,增加自己未来的竞争力.</p>
<p>说了这么多,那么,该如何学会区分这两类不同的事情呢?
其实,我也没有什么太好的方法。我的判断方法其实很朴素:</p>
<ul>
<li>如果一件事其实你知道怎么做才能去完成它,但是又不想去做,那这就应该是一件令你痛苦但不难的事情。</li>
<li>如果一件事你甚至不知道该如何开始着手的话,那对你来说,这就是一件困难的事情。</li>
</ul>
<p>所以,下一次,当你再次面对一件令你踌躇的事情的时候,可以先听下来,好好思考一下。这件事到底是令你感到痛苦还是它是一件真正困难的事情。
认清这件事情的本质之后,才能坦然面对这件事情。</p>里程碑2020-03-28T00:00:00-06:002020-03-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-03-28:/weekly-blog/Milestone/<p>人生需要里程碑</p><p>人们常说生活需要仪式感,我认为这是对的。
一种生活中的仪式感能够标定我们当前的状态,就像是荒野上的一个里程碑,告知我们已经出发了多久了,目前处于什么样的状态。
我已经连续三周宅在家里了,生活日常变得更加简单和随意了。
这样的感觉很不好,总觉得生活失去了方向感。
后来才意识到,我原来生活日常中的各种具有仪式感的事情都因为被宅在家里而消失了。
失去了具有仪式感的事情,生活就像失去了重心,变得东倒西歪了。</p>
<p>那些具有意识感的的事情,那些具有里程碑意义的事情,能够让我们清晰的意识到自己所处的状态,减少对未来的不确定性的评估。</p>
<p>举两个我生活中的例子。
第一个例子是关于计算机科研的。当我们完成了一个数学模型的构建之后,我需要用代码将其实现并进行很多实验来验证模型的有效性。
每一次的实验时间可能长达几个小时到几天不等,在如此长的时间内,如果你的代码只是在跑模型,而没有任何log状态输出的话,那种等待将是一种煎熬。
因为你不知道你的程序是什么的状态,也许它陷入了死循环的状态;也许它陷入了死锁的状态;也许它只是在正常的运行。
对我来说,这种不确定性是无法忍受的。因此,我每次在写代码的时候,都会输出大量的log来记录和追踪模型的运行情况。
这些输出的log其实就像是路标或里程碑一样,不断地告知我目前模型的运行状态是什么样的。
第二个例子是我每天都测体重和体脂,时刻关注自己的这两个指标有助于我理解和掌握自己的身体状态。
很多人都是在意识到之前就变得肥胖了,这正是因为他们没有足够清晰的的路标和里程碑告诉他们,他们走错了方向。
当他们意识到的时候,可能就已经太晚了。
两个例子中的log、体重和体脂就是我在科研和身体管理上的两个路标或里程碑。
他们帮助我很好的掌控了自己所处的状态。</p>
<p>如果把这种仪式感、里程碑的事情推广的人生之路上,我觉得也是合适的。
我常常在想,为什么很少有人能够真正完成儿时的梦想,为什么那么多人追求财富自由,却很少有人做到。
当然,这其中的原因有很多,我觉得自己又发现了一个技术上的原因。
那就是,生活的道路并没有具有里程碑意义的事情,或者说,我们都没有给自己建立具有足够里程碑意义的事件来让自己感知到、意识到自己所处的状态。
比如说,大家都想着要财富自由,可是又有多少人真正思考过以下的问题:</p>
<ul>
<li>什么样的生活状态才算是财富自由?</li>
<li>而要维持这样的状态,又需要多少钱?</li>
<li>要达你心目中的财富自由的状态又需要经过哪些中间状态?</li>
</ul>
<p>大部分人都是一心只想最终的终点,却忽略了终点是什么样的,中间过程中的里程碑是什么样的。
这就像是在一片荒芜的沙漠中寻找水源,没有任何标识,没有任何可观测的参照物。在这样的状态下,能够找到绿洲就是个运气事件了。
然而,如果你有地图、指南针和足够清晰的参照物,那么你找到绿洲的概率就会加大,就不再是一个随机事件了。</p>
<p>我们的人生就是需要这样的参照物,而且这样的参照物只能自己通过学习前人的经验和自己的思考去建立,别人是无法帮助你的。
因为,每个人想要到达的终点是不一样的,中间经过的里程碑也是不一样的。
但是重要的是,我们需要这样的里程碑意识,才能在一个长期的过程中(人生)指导我们朝着正确的方向前进。</p>在家工作的体会2020-03-21T00:00:00-06:002020-03-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2020-03-21:/weekly-blog/Work-From-Home/<p>在家办公的体会</p><p>自3月13日川普宣布美国进行国家紧急状态之后,美国终于算是开始认真对待这次的冠状病毒疫情了。
我们学校也算是响应国家的号召,马上切换到了网上教学模式,所有学生都不推荐去学校了。
我也因此开始了足不出户的工作和研究。
搞计算机研究的一个好处就是,只要有一台笔记本电脑、有网络,我们就能开展工作。我们的工作并不会受到办公条件的太多影响。</p>
<p>在这篇文章里,我想说说在家办公的体会。</p>
<p>首先,是在时间规划上的改变。
在正常的生活状态下,我是比较注意区分工作时间和生活时间。
我通常会用一天之中的不同事件作为一个锚点来区分不同的状态。
比如,健身这一个事件通常被我当做是一个一天中的一个锚点事件。
在一天的工作之后,我会去健身房运动一下,同时在心理上和生理上都进行转换,从工作状态切换回生活状态。
为了减少出门的机会,我现在放弃了所有健身房的健身计划,只是窝在自己的小公寓里。
在目前的状况下,我几乎24小时都被封闭在自己的小小公寓之中。
我最初的感觉就是像是失去了对时间的掌控力,我的习惯在这段时间里被完全打破,有一种很不适应的感觉。在失去了所有的锚点之后,所有的时间似乎变得同样的重要,但是其实他们并不是的。</p>
<p>其次,是心理状态上的改变。
这次的在家办公使得我所有的事情都是在我的小小公寓里处理的。
理论上说,这其实没什么问题。尤其是干计算机这一行的,在哪写代码不是写?
但实际上,我觉得影响还是很大的,尤其是心理上。
最近一周以来,我自我感觉自己的思维没有以前那么活跃了,不管是写代码还是思考科研上的问题,进度其实都很慢。
我想这主要是还是因为一直处于一个小空间里,心理上比较压抑导致的吧。</p>
<p>面对这种大环境的改变,我觉得我们能够做的只能改变自己对这种大环境的反应。
这个世界上有太多的事情我们无法掌控,我们能够掌控的只有自己对外部事件的反应。
这次的这次疫情更加让我坚定了这个想法。
能够打败我们的,只有我们自己,而所谓的外部环境的变化,是我们无法掌控的因素,一味的抱怨、焦虑是没有什么帮助的。
我们能够做的,之后尽快让自己接受新的环境变化,然而做出适当的改变以适应新的环境。</p>
<p>具体到这次的疫情,在刚开始几天的混乱之后,我又慢慢开始找到了在这样的环境下的生活节奏了。
首先,我寻找到了新的锚点事件,从而讲自己的时间规划重新建立了起来,以这些锚点为轴心,让自己的生活变得有序。
其次,我也会找一些时间出门散步。在美国,并没有什么强制封锁的禁令,所以我还是可以出门的。由于盐湖城本身也算是一个地广人稀的地方,路上行人本来就没有多少,所以,其实这个时候出门散散步,并不是一件风险很大的事情。</p>完成目标的技巧2020-03-07T00:00:00-07:002020-03-07T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-03-07:/weekly-blog/Technologies-to-Achieve-Targets/<p>制定和执行目标的技巧</p><p>最近几年,我每年都会给自己制定一系列的年度计划,期待自己在不断努力中走向更好的状态。
一个显著的现象是,我发现我每年的计划,总有那么几个失败了,或者在年中的时候就直接放弃了。
我也在不断反思问题到底出在哪了,为什么我总是无法保质保量的完成年初制定的所有目标呢?
我的思考总结如下.</p>
<p>在很多时候,我们都会在事情开始的时候表现出足够的热情、动力和执行力;但是,随着时间的推移,真正把事情完成的人又是少数。
为什么会这样呢?
我想这主要是因为当人的热情消退之后,很快就恢复到了原来的状态,早先的那些豪言壮志都在日常中消退了。
我自己也存在这种情况,比如我每年给自己的设定了一堆的目标,但是,实际最终真正完成的没有几个。
经过那么多年的体会,我渐渐体会到了几个可以避免这种情况的简单易行的方法:</p>
<ol>
<li>做减法。很多目标我们无法达成,一个主要原因是我们订立的目标太多了,导致我们的精力分散在不同的目标执行上,拖慢整体的进度。所以,一个比较好的方法是,不要太过高估自己的能力,在一段时间内,只专注在有限的几个目标上。
我比较喜欢的一句话就是<strong>人们常常高估自己一年能做的事情,而低估十年能够做的事情</strong>。
所以,我们可以给自己的那些目标按照重要程度重新排个序,在一定时间内,只针对几个最重要的目标进行努力。</li>
<li>
<p>要有耐心。在我们兴致勃勃地制定年度计划(月度计划)的时候,我们是多么希望这些目标第二天就能全部达成。但是,实际情况是,我们需要一步一步地、慢慢地去完成这些计划和目标。这些目标是不可能一蹴而就的,所有的目标都是一点一点渐变而来的,不要期望能够短期内就完成一个长期的目标。
所以,在这种时候,保持耐心,坚持初心才是最好的选择。</p>
</li>
<li>
<p>只确立自己可以掌控的目标。关于制定的目标,我还有一个重要的体会,那就是我们不应该给自己设定那些自己无法掌控的目标。比如,对于一个高中生来,他的目标就不应该是「考上清华北大」,因为这个目标是否达成的判定实际并不属于这个高中生,而是取决于当年的高考题目、阅卷标准和清华北当年的分数线;再比如我自己,作为一个博士生,我的目标应该是「在顶会在发表论文」,但是这个目标比之前的高考的那个目标更加模糊。一篇论文能否被录取,不仅仅取决于论文本身的质量,而且还取决于审稿人、当年会议的主席等等。一旦我们的目标因为非自身的原因没有达成,会给自己造成很大的挫败感。
所以,我认为,一个合理的目标应该是它的判定标准应该完全<span class="math">\(100\%\)</span>取决于我们自己。
这样,我们能够非常客观的量化我们自己的目标,也能轻松分析目标失败的自我原因是什么,然后才能在接下去的时间里提高自己。
回到上面的例子中,关于高考,我认为一个比较合适的目标可以是:「通过认真复习,保证自己会做的题不能做错」;关于论文的目标,我认为一个比较合适的目标可以是: 「认真写作,将一个故事的各个方面都讲清楚」
至于能不能考上清华北大、能不能被顶会接受,这些只是我们的目标的衍生效果而已。</p>
</li>
<li>
<p>关注结束而不是开始。这是最近的一个体会,每当我们开启一个新目标的时候,总是处于亢奋的状态。然而,这其实是然并卵的。一个目标是否达成与你如何开启这个目标是没有太大的关系的,真正关系到目标是否达成的是这件事结束的时候。因此,我们可以把自己的注意力转移到事情结束的时候而不是开始的时候。
毕竟,一个人的成就取决于他完成了哪些事情,而不是开始了哪些事情。</p>
</li>
</ol>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>我为什么不喜欢「寄生虫」2020-02-29T00:00:00-07:002020-02-29T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-29:/weekly-blog/Why-Do-I-Dislike-Parasite/<p>我为什么不喜欢「寄生虫」</p><p>在今年的奥斯卡上,「寄生虫」无疑是最大的赢家,各种奖项拿到手软。
然而,在这篇文章中,我想说的是,我其实并不喜欢这部影片。
我并不是什么专业的影评人,但是就这部电影的主题我想谈谈自己的感受。</p>
<p>首先,这部电影的拍摄技巧、细节是值得肯定的,很多地方的处理确实值得上成为一部佳作。然而,我不喜欢它的原因在于,它传递出了我认为并不好的信号。</p>
<p>我第一个不喜欢的信号是,它传递出了一种仇富的信号。我并不觉得这是一种值得鼓励的行为。
没错,这个世界确实存在着巨大的贫富差距,但是只是单纯的放大、强化不同阶层之间的敌对情绪,我认为这并不是一个好的解决方式。放大的敌对情绪的后果只能是发生暴力革命,然后进行所谓的「均贫富」。然而,此类的事情在全世界的历史上已经发生了无数次了,结果是怎么样呢?「均贫富」之后依然还是会分层,依然会出现贫富差距。
解决不同阶层之间的矛盾,不应该只是通过各种手段放大这种矛盾,或者只是简单的「均贫富」。
我一直认为,在一个健康的社会里,上下层的层级是不停流动的。有智慧的人,顺应了社会的需要,做出了有意义的事情,他自然就获得了社会的回报,获得了大量的财富;相对的,即使你一开始是上层人士,但是过着骄奢淫逸,你对社会毫无价值,社会自然会慢慢将你的财富夺走,将你打入下层阶级。
如果只是单纯的强调阶级之间的敌对情绪,我认为这样的方式是有害无益的。</p>
<p>对比去年的奥斯卡最佳影片「绿皮书」,我觉得就比今年的这部「寄生虫」处理的好。
「绿皮书」的结尾就暗示了不同种族之间的大融合结局,而不是简单的敌对。</p>
<p>这部电影传达出的第二点我不喜欢的信号就是它把电影中的富人描写得太过单纯、太过傻白甜了。现实社会中的上层人士哪有这种人?他之所以能成为一个社会的精英人士,一定有他过人的地方,不可能就这样被主角一家四口骗得团团转。
反过来说,如果主角一家四口真有电影中表现得那么机智和精明的话,我也不认为他们会处于住地下室的境地。
总的来说,这两家人的设定都是为了剧情服务的,但是他们表现出的特质并不符合他们所处的阶层。
我认为真正的事业成功人士,绝不可能是那么容易忽悠的。
所以,我们不应该被这部电影所误导,认为所谓的有钱人就是「人傻钱多」的。他们之所以能成功,一定是由他们的成功之处的。</p>
<p>当然,我们的社会是需要不同的声音的,如果只有一种声音,那么这个社会就危险了。所以,尽管我并不喜欢这种电影,但是我并不否认这是一部优秀的影片。奥斯卡的奖项也算是实至名归。但是,我希望观众在观看这部电影的时候,要记住这仅仅是一部电影,现实世界中的事情是两回事。</p>认命2020-02-22T00:00:00-07:002020-02-22T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-22:/weekly-blog/Accept-Fate/<p>人要学会认命</p><p>随着年龄的增长,越来越觉得「认命」的重要性。
之前,各种学校的教育和励志书籍都告诉我们,努力是可以战胜命运的,所谓的人定胜天。
然而,事实真是如此的吗?
这里有个很简单的悖论: <strong>既然可以「人定胜天」,那么为什么那些灌输给我们这些观念的人没有「胜天」呢?</strong>
答案其实很简单,我们是无法战胜「命」的。</p>
<p>每个人的出身其实很大程度上已经决定了每个人的「命」,他的成长过程塑造了自己的性格、品行和眼界。成人之后做的一系列决策都会受到这些因素的影响,从而形成了自己的「命」。
我认为「命」其实已经决定了这个人一生能够取得成就的上限了。
但是,这个上限比我们想象得要高远得多。</p>
<p>人们常说「小富靠运,大富靠命」,其实说得就是这个道理。如果一个人没有能够拥有成功和财富的命,即使他依靠运气或别的什么原因,取得了一些成就,但很快就会恢复到原来的状态。
看看那些国内外中彩票大奖的人就知道了,他们依靠运气一下子就得到了一笔巨额的财富,但是没过几年,他们又都折腾成了穷人。</p>
<p>所谓的「命」,其实就是一个人的能力、气度、思维方式。而这些方面的养成,真的是和出身非常相关的。父母的教育、学校的培养,周围环境的影响都默默影响了一个孩子的性格成长。而且,这些能力、气度、思维方式一旦养成,其实是不太容易在成年之后改变的。这些东西从长时间来看,决定了一个人一生的高度。
我这里所谓的「出身」并不一定是指一定要出身在大富大贵的家庭中,而是指拥有一个良好的家庭环境,能够养成一个比较好的思维方式。</p>
<p>既然「命」已经决定了人的一生,那么我们为什么还要努力呢?
我认为努力还是必要的,因为,即使拥有良好的出身,也需要后天的努力将这些优势转化为实际的东西,比如财富、比如社会地位。
我认为,努力可以理解为两个层面努力:</p>
<ol>
<li>通过自身的努力,利用自己的思维方式、能力取得一些列具体的成就,比如高考考个好学校、工作去个好公司等等。</li>
<li>不断打磨提升自己的品德、思维方式、气度等方面。虽然我之前说过,这些方面其实很大程度上是在成长过程中已经定型了的,但是通过后天自己的有意识地提高也不是没有可能的。只是,难度很大。</li>
</ol>
<p>要想突破自己所处的阶层,我认为首先要「认命」,要认识到自己和精英士之间的差距,只有首先承认差距的存在,才能慢慢缩小这个差距。
所谓的「认命」,就是要认识到自己的不足,降低自己心中的期望,不要给自己设定一个不切实际的目标。
人与人之间的差距,有时候真的不是一代人就能够追上的。那些出身比你好的,其实比你还要努力。</p>
<p>最近几年,我时刻牢记的一句话就是: 「尽人事,顺天命」.</p>谋定而后动2020-02-15T00:00:00-07:002020-02-15T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-15:/weekly-blog/Plan-and-Move/<p>想清楚自己的目标是什么</p><p>在做研究的时候,我常常遇到两种截然相反的状态:</p>
<ol>
<li>不知道接下去该干什么</li>
<li>闷着头干一通非常凌乱但是没什么用的事情</li>
</ol>
<p>这两件事看起来是矛盾的两件事,其实这反映出了同样一个很重要的问题: <strong>我其实并不知道自己真正想要的是什么</strong>.</p>
<p>第一种情况很符合相应的问题,我并不知道自己想要的是什么,所以不知道接下去该做什么。这种情况其实很好处理,那就是坐下来,从大方向重新思考手头的问题,重新构建解决问题的步骤,然后自然就能分析出解析出接下去该干什么了。</p>
<p>第二种情况看似和「我不知道自己真正想要的是什么」没有联系,毕竟我不仅知道下一步该干什么,而且还是不间断的一通猛干。
然而,真实的情况是,往往在这种情况下,不仅真正的问题没有解决,自己还会走入歧途而不可自拔。
比如在设计实验的时候或写代码的时候,你突然觉得某一种实验似乎很有趣,然后不经深入分析就开始动手去实现,在花了大量精力去实现之后,才发现其实这组实验没什么意义,不是已经被其他实验证明了的,就是实验本身并不能说明任何结论。
又比如,在设计学习机器学习模型的时候,我们需要根据实际的认为设计新的损失函数或者更新策略,这种时候,我往往会尝试各种可能的损失函数的组合,以此来找到效果好的一种。
这些做法其实都是低效和无意义的。
我看似做了很多事情,但是对于整个研究项目的进度来说,其实是非常慢,甚至还是会拖慢整个进度。</p>
<p>那么为什么会这样呢? 很简单,就是我之前说的,<strong>其实我并不知道自己真正想要的是什么</strong>。
对于研究来说,我们不应该马上动手去做,而是应该思考,我的行动应该取得什么样的结果。
比如,在设计新的模型的时候,我们首先需要明确我们的目标是什么,要把这个目标以数学的语言严格的描述出来,有什么的目标函数、有什么样的约束条件。当我们将这些具体的东西都写下来之后,我们自然就能排除一大堆不适合的选项,从而从数量级上提升我们的研究效率。
这是我从我老板身上又学会的一点。
我们进行讨论的时候,他常常会试图把我面对的问题以数学的语言来描述,形成一个正式的优化问题,而不是那种泛泛而谈的问题。
当把一个问题严谨的描述出来之后,我们才能真正看清、理解我们想要的是什么。</p>
<p>回到我们的日常生活中,其实何尝不是这样呢?
大部分时候,我们不是不知道该干什么,而是被大量的琐碎的事情所淹没。
吴军老师在「硅谷来信」中也曾经提到过这种状态,他称之为「伪工作者」。这些「伪工作者」,不仅从他们自己的角度来看,他们很忙;从第三方的角度来看,他们同样很忙碌。但是,当验收任务的时候,却没有太多的进度。</p>
<p>在我看来,打破这种困境有两种策略:</p>
<ol>
<li>减少工作的数量,将工作数量减少到三个以内。</li>
<li>谋定而后动,从大量想要做的事情中,筛选出真正重要的事情。</li>
</ol>
<p>这两种策略其实本质是一样的,就是首先要弄清楚「<strong>自己真正想要的是什么</strong>」,确定了目标之后,才能有的放矢,以直线的方式向目标前进。</p>中央帝国的哲学密码2020-02-08T00:00:00-07:002020-02-08T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-08:/reading-list/Philosophy-History-of-the-Central-Empire/<p>「中央帝国的哲学密码」读书笔记</p><h1>摘录</h1>
<blockquote>
<p>当西方世界将人与自然的关系确定为哲学的根本问题时,中国人却始终在政治与人的框架中反复震荡,至今没有跳出窠臼</p>
<p>天人合一的哲学体系不仅彻底解决了皇帝的合法性问题,还由于它是信仰的而不是思辨,对社会思想产生了巨大的束缚,让中国人在两千年的是时间内,丧失了用逻辑与验证事实的能力。</p>
</blockquote>
<h1>综述</h1>
<p>本书主要阐述了中国两千多年的哲学思想变迁史。
主要分为了以下几个大的阶段:</p>
<ol>
<li>汉代: 罢黜百家,独尊儒术</li>
<li>魏晋: 玄学</li>
<li>南北朝: 佛道儒相爱相杀</li>
<li>隋唐: 思想解放,各种宗教、思想并存</li>
<li>宋: 思想禁锢,回归古文,崇尚理学</li>
<li>明: 心学</li>
<li>清: 实学</li>
</ol>
<p>在这些阶段中,所谓的中国哲学体系其实一直都是依附于政权的,谁的理论能够给统治者带来权威性,哪个理论就会变成主流。</p>
<h1>结构和细部</h1>
<h2>前言: 两千年往复的学术之殤</h2>
<ul>
<li>
<p>中国的大一统哲学体系是从汉代开始的</p>
<div class="admonition note note">
<p class="admonition-title">Note</p>
</div>
<p>对于这个观点我表示存疑, 难道不是周代吗?</p>
</li>
<li>
<p>这个大一统哲学体系的基础包含了三个方面:</p>
<ul>
<li>不是从逻辑上,而是从信仰上,将皇帝和宇宙真理联系一起. 皇帝是天的意志在人间的代表</li>
<li>宇宙真理是用儒教构造出来的. 汉代儒教借用了先秦儒家的礼法,采用了儒家经典,却又将阴阳家的宇宙观和法家的权术结合进来,形成了一套包容天地万物的理论</li>
<li>汉代建立的完善的教育体系和选官体系,只有接受了这套理论的人才能进入官僚体系.</li>
</ul>
</li>
<li>
<p>天人合一的哲学体系不仅彻底解决了皇帝的合法性问题,还由于它是信仰的而不是思辨,对社会思想产生了巨大的束缚,让中国人在两千年的是时间内,丧失了用逻辑与验证事实的能力。</p>
</li>
<li>
<p>西汉之后的中国哲学可以分为两个大周期</p>
<ol>
<li>从西汉到魏晋南北朝</li>
<li>从宋代一直持续到现在</li>
</ol>
</li>
<li>每个周期中又分为: 建立起、庸俗期、反抗期和变异期</li>
</ul>
<h2>第一部: 集权洗脑术: 政教合一体系的建立(公元前202-公元200,西汉到东汉)</h2>
<h3>汉高祖的皇帝危机(公元202-公元前141)</h3>
<ul>
<li>集权帝国哲学的首要问题是皇帝的合法性。</li>
<li>叔孙通提出利用礼仪制度来加强臣民对皇帝权威的认知</li>
<li>通过礼仪维持的皇帝权威没能延续太久</li>
<li>儒教的早期人物: 陆贾 贾谊</li>
<li>
<p>陆贾</p>
<ul>
<li>著作: 新语</li>
<li>统治者需要根据宇宙的规律来治理国家</li>
<li>所谓宇宙的规律就是「仁义」</li>
<li>仁义的本质是「无为」</li>
<li>理论框架还比较粗粗,只是结合儒家和道家阐述了需要根据宇宙规律来治理国家</li>
</ul>
</li>
<li>
<p>贾谊</p>
<ul>
<li>同样强调「仁义」</li>
<li>贾谊的「仁义」本质是「礼法」</li>
<li>汉文帝信奉黄老之术,没有重用贾谊</li>
</ul>
</li>
</ul>
<h3>皇帝神化运动(公元141-公元87)</h3>
<ul>
<li>
<p>黄老之术</p>
<ul>
<li>做到无为就对人民有利,对人民有利就是好皇帝,好皇帝就不会被赶下台</li>
<li>黄老之术无法指出刘氏皇帝的必然性</li>
</ul>
</li>
<li>
<p>汉初最重要的哲学书籍是「公羊传」
-「公羊传」只是「春秋」的注释
-「公羊传」的作者相信,孔子编纂的「春秋」中的每一个字都隐藏着人世间的道理,所谓「微言大义」
-「公羊传」的作者认为一本「春秋」涵盖了世间的真理。有点类似与「古兰经」和「圣经」。</p>
</li>
<li>
<p>天人合一理论</p>
<ul>
<li>人类社会的规律和老天爷的运行规律是合一的, 人类生活的目的就是遵从天的意志</li>
<li>皇帝是天在人间的代表, 是天选定的,不容置疑。</li>
<li>一整套完整的理论来解释世界万物</li>
</ul>
</li>
</ul>
<h3>汉代圈养的知识圈(公元前87-公元23)</h3>
<ul>
<li>罢黜百家的后果就是,后代学生再也接触不到其他的政治哲学</li>
<li>同时,儒教内部形成了大量的学术门阀,争夺权力</li>
<li>儒教思想全面渗透整个政府机构,甚至利用儒教书籍进行判案</li>
<li>中国从此舍弃了秦朝的判例法,进入了维持了2000年的宗法时代</li>
</ul>
<h3>谁是真经?(公元前53-公元36)</h3>
<ul>
<li>
<p>石渠阁会议</p>
<ul>
<li>调和儒教内的各种学派,调和的目的是为了加强中央政府的正统性</li>
<li>形成了一系列的文件,形成了由皇家主持的正统哲学体系</li>
</ul>
</li>
<li>
<p>汉朝的考古学界发现了一批战国时期保留下来的经书,称为古文经</p>
</li>
<li>古文经派与今文派产生了巨大的分歧</li>
<li>古文派却无法在当前的政府中获得一席之地,因此他们转而支持王莽,希望通过改朝换代的方式,为自己某得政治地位</li>
</ul>
<h3>文人打架与皇帝和泥(公元36-公元200)</h3>
<ul>
<li>古文派、今文派还有谶纬派在朝堂上相互争斗</li>
<li>白虎观会议: 白虎通义<ul>
<li>对于科学和自然的认识</li>
<li>对于人类社会的讨论</li>
<li>对政治的讨论</li>
</ul>
</li>
<li>不管的是在朝还是在野的学者,都已经无法跳出五经的框架了</li>
<li>王充<ul>
<li>机械论者</li>
<li>我只相信我看到的东西,其余一切都是虚妄的</li>
<li>擅长提出质疑,却无法提出自己的理论</li>
<li>对当时的各家学派都进行了驳斥</li>
</ul>
</li>
<li>
<p>郑玄</p>
<ul>
<li>古文和今文的集大成</li>
<li>对大部分的儒家经典都进行了注释</li>
<li>统一了当时的整个经文系统</li>
</ul>
</li>
<li>
<p>经学在东汉末期、曹魏初期得到了统一,然而又很快消亡了。</p>
</li>
</ul>
<h2>第二部:哲学嬉皮士: 以自然的名义反叛教权(公元166-公元316)</h2>
<h3>乱世文人报脚难(公元166-公元220)</h3>
<ul>
<li>东汉降低了对文人的待遇,朝廷官位被大家族把持,而不是文人</li>
<li>文人学者转而拉帮结派,评议朝政</li>
<li>由于文人失去了政治上的上升通道,一次你一部分文人开始转而研究玄学</li>
<li>这是经学瓦解的过程,但不是玄学建立的过程</li>
</ul>
<h3>一切都是「无」(公元220-公元260)</h3>
<ul>
<li>所谓玄学,是一种质疑精神,一种方法论,对五花八门的现象提出质疑、辩论,恢复人的思考能力</li>
<li>品评人物是玄学的一个主题</li>
<li>跳出了「天人合一」的框架,重新构建了一个新的框架来解释世界。<ul>
<li>用思辨的逻辑去解释世界</li>
<li>玄学没有具体的理论,思辨的过程就可以理解为玄学</li>
</ul>
</li>
<li>注重辩论的技巧</li>
<li>典籍: 「周易」、「老子」、「庄子」</li>
<li>王弼+何晏<ul>
<li>创立的玄学的第一个代表性理论: <strong>贵无论</strong></li>
<li>「无」是包含了一切的一个概念</li>
</ul>
</li>
</ul>
<h3>放诞俗世做酒仙(公元249-公元316)</h3>
<ul>
<li>
<p>嵇康: 魏晋时期最具反抗精神的文人</p>
<ul>
<li>通过掌握自然的规律,就可以过一种将名教调和于自然的生活</li>
<li>人之所以受到束缚,是因为脱离了自然;想要恢复自由,必须争破这个名教之网</li>
<li>提出「越名教而任自然」</li>
</ul>
</li>
<li>
<p>三理: 魏晋时期思辨玄学的最高成就</p>
<ul>
<li>声无哀乐论</li>
<li>养生论</li>
<li>言尽意论: 语言能否百分之百的将人的情感描绘出来</li>
</ul>
</li>
</ul>
<h3>被收编的嬉皮士(公元266-公元316)</h3>
<ul>
<li>晋朝统一之后,重新开始推崇汉代的儒学,系统通过统一思想来维持帝国的稳定</li>
<li>崇有论: 希望士大夫回到汉代的儒家学说上,积极倡导人们应该积极入世</li>
<li>西晋产生了享乐主义:<ul>
<li>代表作:「列子」</li>
<li>推崇桀纣</li>
</ul>
</li>
</ul>
<h2>第三部:当皇权遭到拒绝: 三教的竞争与妥协(公元316-公元960, 东晋到五代)</h2>
<h3>长不大的道教,思辨的佛教(公元前2-公元316年)</h3>
<ul>
<li>道家:一个哲学流派,他们的学术并不与政治和社会直接挂钩。</li>
<li>道教:是一宗宗教,强迫教徒必须接受一整套它的世界观</li>
<li>道教开始是画符,然后是炼丹。</li>
<li>葛洪之后,它一直是服从中央权威的管理的,称为上层人士的宗教</li>
<li>印度的种姓制:<ul>
<li>婆罗门(教士阶级)</li>
<li>刹帝利(国王和武士)</li>
<li>吠舍(商人阶级)</li>
<li>首陀罗(底层人口)</li>
</ul>
</li>
<li>印度上层为了避免下层的反抗,制造了轮回观念</li>
<li>佛教的创新: 提出了跳出轮回的观念</li>
<li>大乘佛教纷繁复杂,体系庞大,慢慢形成了各种不同的小派系。派系之间的相互辩论引出了思辨的思维方式</li>
</ul>
<h3>南朝: 政治资源争夺战(公元317-公元589)</h3>
<ul>
<li>佛教在南宋时期被提高到了和儒教同级的地位上</li>
<li>佛儒的三次争论<ul>
<li>白黑论</li>
<li>达性论</li>
<li>夷夏论</li>
</ul>
</li>
<li>佛教在南朝开始广泛发展之后,开始占用过多的社会资源</li>
</ul>
<h3>北朝: 入笼之鸟(公元317-公元589年)</h3>
<ul>
<li>佛道进行了多次的论战</li>
<li>魏太武帝拓跋焘进行了第一次的大规模灭佛运动</li>
<li>皇帝之所以灭佛,只是因为佛教不听话,而一旦佛教徒听话之后,皇帝立刻又发放通行证</li>
<li>北周武帝进行了第二次灭佛</li>
</ul>
<h3>隋唐: 从现代边缘坠落(公元581-公元960)</h3>
<ul>
<li>隋唐时代中国的佛教已经开始脱离印度原来的佛教教义了,开始自我发挥了。</li>
<li>整个唐朝是中国历史最不强调意识形态的时期</li>
<li>唐代的科举非常多元化,各科都有.</li>
<li>儒教在唐代被完全边缘化了,佛道两教却处于强势地位。</li>
<li>
<p>中国的佛教徒从唐朝开始自我发挥,发展出了更加简明的教义</p>
<ul>
<li>世界万物都是苦, 悟道成佛是唯一的选择</li>
<li>所有人都能成佛</li>
<li>打开佛性可以是一种顿悟,不需要一级一级修炼</li>
</ul>
</li>
<li>
<p>古文运动</p>
<ul>
<li>在唐宋八大家的倡导下,唐代文风从韵文时代变味了散文时代</li>
<li>文章从此变得更加有逻辑性和可读性</li>
<li>韩愈是古文运动的领袖,且极度反对佛教和道教,希望能够回到儒教治国的传统上来</li>
<li>韩愈提出了儒教的修炼过程: 正心、诚意、修身、齐家、治国、平天下</li>
</ul>
</li>
<li>
<p>唐武宗再次开始了灭佛行动</p>
</li>
</ul>
<h2>第四部: 叛逆的害人者,重建神权政治(公元960-公元1506年,宋到明)</h2>
<h3>复古主义和实用主义(公元960-公元1127)</h3>
<ul>
<li>在宋代,唐代的自由式科举被更加严格的和充满了限制的课本式科举取代了</li>
<li>王安石主持的改革使得政府只会选择那些通读经文的人,而排斥其他思想的人。唐代的自由主义被彻底摧毁了。</li>
<li>王安石被贬谪之后,反对派采用了朱熹编著的四书五经,中国历史从此进入了八股文时期</li>
<li>整个北宋时期,社会在两种思潮中不停摇摆:<ul>
<li>实用主义: 以更加现代的手法治理国家, 抛弃了形而上的东西</li>
<li>复古主义: 恢复古代大同世界和君臣大义,重新回到政教合一</li>
</ul>
</li>
<li>王安石和司马光的斗争就是保守主义和实用主义的斗争</li>
<li>苏轼: 向往黄老之术</li>
</ul>
<div class="admonition note note">
<p class="admonition-title">Note</p>
</div>
<p>在一个过分强调意识形态的社会里,人们的思想只会越来越窄化</p>
<ul>
<li>宋朝也是第一个开始对出版业进行控制的朝代</li>
</ul>
<h3>存天理,灭人欲(公元960年-公元1200年)</h3>
<ul>
<li>道学系统的谱系: 宋初三先生--> 张载、周敦颐-->程氏兄弟-->朱熹</li>
<li>道学系统在南宋末年成了统治性思想</li>
<li>宋代理学哲学:<ul>
<li>这个是世界是由「天理」这种宇宙真理所创造的,「天理」就是世界的根本</li>
<li>人类社会也是「天理」创造的,所以人类也受天理的约束</li>
<li>人类想要实现自我价值,就必须放弃过于强烈的自我意识,优先学习这个「天理」</li>
</ul>
</li>
</ul>
<h2>第五部: 世俗哲学兴起: 洗脑术的没落(公元1368-公元1911)</h2>
<h3>第十八章 用"心"反叛束缚(公元1368-公元1529)</h3>
<ul>
<li>在明朝,科举不再是选拔人才的方式,而是皇帝笼络人心的方式</li>
<li>心学:<ul>
<li>强调人类应该服从于自己的内心,摆脱心外的束缚</li>
<li>传承: 陆九龄兄弟-->陈献章</li>
</ul>
</li>
<li>明代的学术界发生了严重的分化:<ul>
<li>一部分人彻底放弃思考,以科考为目的来学习</li>
<li>另一部分人则放弃了官场,坚持自己的民间学术立场</li>
</ul>
</li>
</ul>
<h3>神学散去,实学到来(公元1644-公元1911)</h3>
<ul>
<li>王夫之: 中国大一统哲学的最后代表人物</li>
<li>黄宗羲: 将政治学从哲学中独立出来<ul>
<li>天下不应该是皇帝的私产</li>
<li>大臣和君主是一种共同治理的关系, 大臣的负责对象不是皇帝,而是天下百姓</li>
<li>法律是用来服务人的,而不是用来治人的</li>
</ul>
</li>
<li>
<p>顾炎武</p>
<ul>
<li>将各个学科从大一统理论中分离出来</li>
<li>开创了中国的实学</li>
</ul>
</li>
<li>
<p>哲学家们开始痛定思痛,反思从汉代以来的大一统哲学体系</p>
</li>
<li>哲学家们开始具体分析每一个问题</li>
<li>清代的学者对各种古代典籍进行了重新的校订和整理</li>
</ul>
<h1>评价</h1>
<p>这是我读的郭建龙先生的第三本书,我已经充分掌握了郭先生的写作模式了。
他的书一般都是虎头蛇尾的,刚开始的一些章节有较多的干货,也有一些可以让人深思的想法。但是,后半段书更加像是流水账,把各个朝代的思想体系大略讲解了一遍。这对于我这种对中国哲学史一窍不通的人来说,其实还是蛮不错的,算是入门书籍。
但是,我想对于那些对中国古典哲学有一定了解的人,应该很难从这本书中的获得太多的新的见解。</p>
<h1>和我的关系</h1>
<p>中国从没没有变过,所谓的「新中国」其实一点都不新,依然靠着一套僵硬的意识形态由上至下的统治。</p>
<p>对于我自己来说,做人做事不应该被意识形态所束缚,而应该以解决问题的思路处理事情。过多的考虑什么能做,什么不能做,只会束手束脚。</p>原则驱动的生活方式2020-02-08T00:00:00-07:002020-02-08T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-08:/weekly-blog/Principle-Driven/<p>我的原则驱动式的生活方式</p><p>读博士这几年来,我发现自己渐渐开始习惯了原则驱动式的生活。
原则驱动的生活方式让我感到生活有了方向感和目标感,而不是随波逐流,被生活推着往前走。</p>
<p>所谓「原则驱动」的生活,就像是字面的意义一样,生活中的每一步决策都是按照一定的原则进行判断的,有点像是贪心策略,但这是一个非常复杂的贪心策略,且是实时变化的。</p>
<p>目前经过我自己验证过的且正在实行的原则包括了:</p>
<ol>
<li><strong>任何工作都要进行优先级排序。</strong>这是最基本的一个工作原则了,它能够保证工作有条不紊的展开,不会因为临时的琐碎小事而分散了自己宝贵的注意力。具体来说,可以用<a href="https://wiki.mbalib.com/wiki/%E6%97%B6%E9%97%B4%E2%80%9C%E5%9B%9B%E8%B1%A1%E9%99%90%E2%80%9D%E6%B3%95">四象限法</a>来对每天需要完成的任务进行权重分配。</li>
<li><strong>要有耐心</strong>. 这是我认为人这一生最需要掌握的一个品质。人生就是一段长跑,要有耐心,要相信未来一定会比现在更好。属于自己的时代一定会到来的.</li>
<li><strong>接受一个观点的时候,尽量收集这个观点的正反方所有的论述,再做出最终的决策。</strong> 这条原则能够保证自己的思想不会陷入某种偏执之中,保证自己思想的独立性。</li>
<li><strong>少即是多</strong>,这条原则是告诉我自己,不要高估自己的精力和能力。在一段时间内,自己能够保质保量完成的事情其实并不多,所以,不要给自己增加不必要的负担,这样反而会影响自己的正常发展。整个2019年,我就是因为忘记了这个原则,导致一整年都没有太多的产出.</li>
<li><strong>保持总结和规划</strong>。这是保证自己生活拥有目标感的基本原则。生活是变化多端的,不可能永远保持不变。我们的心境、想法、目标都有可能发生重大的改变,在这种时候,我们就需要定期对自己的进行评估和总结,重新制定下一阶段的行动。</li>
</ol>
<p>这些原则其实没有什么了不起,我们可以在很多其他的文章中看到这些原则。
但是,真正重要的是,其实不是了解和阅读这些原则,真正重要的是,如何能够实践这些原则?
实践这些原则的过程,其实就是体现了这些原则本身。
比如,我们不可能一下子完全实践这些原则,我们需要一个逐渐改变自己的过程,这个时候,就需要我们实践<strong>要有耐心</strong>这个原则。我们需要明白,一口吃不成一个胖子,我们实践这些原则的过程是需要时间去慢慢体会的。
既然是慢慢改变,那么我们就需要实践<strong>优先级排序</strong>和<strong>少即是多</strong>的原则,选择对你来说最重要的原则开始培养自己。
在逐条时间这些原则的过程中,需要自己思考,这条原则到底是对的还是错的,是适合自己的还是不适合自己的,这就是第三条<strong>搜集正反观点</strong>的原则。
最后,我们还需要实践最后一条原则<strong>保持总结和规划</strong>来审视自己是否真正实践了这些原则。</p>
<p>通过这几年的实践,这几条原则已经内化为我的思维模式和生活习惯了。
我想我会一直保持这些原则过完我的一生的,而且,在我之后的人生旅途中,一定会不断增加新的原则来指导我的生活。
这些原则在短时间内未必是百分百正确的,但是当我们把时间拉成,从人生的角度来看的,我认为这些原则是投入产出比最高的行动原则。
如果能一生都践行这些原则,我想,我至少不会是一个失败的人。</p>不要做预测2020-02-01T00:00:00-07:002020-02-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-01:/weekly-blog/Do-not-Predict/<p>不要预测,而要随机应变</p><p>今年是我开始读博士的第四年,自我感觉自己的做事和思考的方式进行了多次的迭代。
每过一段时间,我就会产生一些新的感悟和思考,从而刷新自己的思维习惯。
在过去这四年里,我认为自己主要的变化有:</p>
<ol>
<li>学会了控制自己的情绪,控制自己的注意力</li>
<li>学会了以全局的眼光看待自己和别人,不会因为一时的起起落落而影响自己的判断</li>
<li>学会如何高效合理的管理好自己的精力,从原始的「管理时间」切换为「管理精力」</li>
</ol>
<p>对于现在的我来说,正在努力改进的方面有:</p>
<ol>
<li>正在努力扭转自己的思维,确保自己每时每刻都能以第三者的身份来审视自己</li>
<li>学会处理异常的情况,避免因为计划被破坏影响自己的状态</li>
</ol>
<p>而最近我又有了一些新的感悟,我想要将其好好分享一下。</p>
<p>做过科研的人,可能都会有这样的感觉,你最终写成论文的成果往往和最开始做这个项目的时候的初衷并不是完全一致的。
甚至有时候完全是南辕北辙的东西。
为什么会这样呢?
我认为最主要的原因其实是因为我们无法对未来做出<strong>准确的预测</strong>。</p>
<p>科研这件事本身就是在探索各种未知,因此我们能够发现什么,下一步该如何进行其实都是处于未知的状态。
而我过去的思维总是想要做好预测,能够明确地规划好下一步该做什么。
但是,事实往往并不和我的预测一致。
经常遇到的问题是,设计好了实验,写好了代码,一旦实验完成我就可以开始着手写论文了。
然而,事实是,实验结果往往和我的预期不一致。明明自己的模型看起来很正确,可是为什么实验结果就是不好呢?
在这种时候,我往往会变得非常纠结和焦虑,整个人都处于非常不好的状态。
其实,这种情绪是不必要的也是错误的。
预期的结果和实验结果不一致,一定是我的预期或模型是错误的,实验结果不可能是错误<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<p>我觉得在思维上我需要作出改变,不要试图对未来做出预测,而是学会「随机应变」。
要认识到,自己的理论和事实不一致的时候,一定是理论出了问题。这种时候,没必要焦虑,继续修改理论就可以了。</p>
<p>推而广之,生活中的很多事情都是超出自己的预期的。当一些突发情况发生之后,我们要学会「随机应变」,不能拘泥于过去的各种规划和计划。
善于接受改变的人才能更好的顺应这个世界。</p>
<p>那么,具体如何做呢?其实我也不知道。
但是我自己从年初开始,就非常注意自己的用词,我会尽量避免「应该」这种词语的使用。
「应该」说明了我心中已经有了一件事情的主观想法或主观预测,我在拿它和我遇到的事实进行比较,其实这种时候,我就已经在进行预测了。
所以,我现在比较注意自己的用词,虽然这种做法非常低级和原始,但是根据行为心理学的理论,我们自己的行为也能够慢慢改变的自己的心理。
所以,我希望能够通过这种小手段来慢慢改变自己静态的思维方式,以更加动态的思维来看待这个世界。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>当然这里的前提一定是实验的设计和实现不存在bug。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>事实和结论2020-02-01T00:00:00-07:002020-02-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-02-01:/weekly-blog/Fact-and-Conclusion/<p>学会区别事实和结论</p><p>最近在听吴军博士的「硅谷来信」的栏目,这是他在得到上开设的专栏,其中有一期的内容让我记忆深刻,我觉得有必要写一点东西来好好思考和分析一下。</p>
<p>其实,那期来信的主要内容我记得不是很清楚了,但是让我印象深刻的是如下这个故事。
我们从小的教课书告诉我们,在文艺复兴时期的布鲁诺因为支持日心说而被教会处以火刑而死,而布鲁诺也被认为是坚持真理而教会迫害的典型。
然而,真实的情况是,前后两件事实之间并没有很强的因果关系。
在真实的史实中, 事实有以下两点:</p>
<ol>
<li>布洛诺确实支持日心说</li>
<li>教会确实以火刑处死了布鲁诺</li>
</ol>
<p>但是,这两件事之间未必有因果关系。</p>
<p>布鲁诺被教会处死的原因是因为他反对当时的经院派哲学和神学,支持日心说只是他思想的一部分<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。
教会也不是因为日心说而要处死他。
当时的日心说其实并不是主流思想,远不到能够动摇教会统治的基础,教会也对这种说法不屑一顾。
日心说仅仅作为一种学术模型而存在,也并没有引起社会的广泛关注。
布鲁诺被处死的原因其实是因为他揭露了很多教会的丑闻和他的泛神论思想。
然而,这个故事在后来的流传过程中,很多其他重要的事实被滤去了,只留下了两点:</p>
<ol>
<li>布鲁诺支持日心说</li>
<li>布鲁诺被教会处以火刑而死</li>
</ol>
<p>而听众和读者能够很自然地在这两件事之间建立起因果关系。</p>
<p>这种「断章取义」的事情发生的频率其实比我们想象的要来得大,但我却经常还是陷入了这种思维陷阱里面。
尤其是以前的接受的教育中,这种跳跃式的结论其实应该不少,而这些已经内化为我的思想之中。我觉得要真正破除过去遗留下的错误认识还需要花费很多的时间。</p>
<p>除了要修正自己过去的认知,更重要的是要在未来避免这种错误。
那么该如何避免这种思维陷阱呢?
我认为这就需要我们不能随便下结论,要学会区分<strong>事实和结论</strong></p>
<p>在日常的研究工作中,我经常会和我的老板单独讨论。在这个过程中,他经常会指出我用词的错误,我经常会胡乱使用conclusion这个词。
每当我用词不当的时候,他都会指出,我所说的不是conclusion,而只是一个statement或者claim。
经过严格逻辑证明的才能称为conclusion,其他所有的都只是一种陈述。</p>
<p>我很庆幸我能够经受这种严谨的科学思维训练,能够让我以更加全面的视角来看待这个世界。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://zh.wikipedia.org/wiki/%E7%84%A6%E7%88%BE%E9%81%94%E8%AB%BE%C2%B7%E5%B8%83%E9%AD%AF%E8%AB%BE">Wiki:布鲁诺</a> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>第三者2020-01-18T00:00:00-07:002020-01-18T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-01-18:/weekly-blog/Third-Party/<p>尝试以第三者的角度来观察自己和这个世界,会有不一样的体验。</p><p>「第三者」这个名字有点标题党的感觉了,但是实际上我想说的「第三者」和两性关系没有任何关系,此处的「第三者」是指,我觉得我们应该养成以第三者的视角来看待自己和看待世界。</p>
<p>为什么我们需要第三者的视角?
道理其实很简单,就是那句俗话: <strong>当局者迷,旁观者清</strong>
当我们深陷一件事之中的时候,往往会窄化我们的视角,自动过滤掉可能的选项,让自己的思维进入一种死胡同。</p>
<p>关于第三者视角,我觉得可以分为两个方面:</p>
<ul>
<li>首先,我们需要学会以第三者的视角来看待自己, 接受自己</li>
<li>其次,我们需要学会以第三者的视角来看待别人, 接受别人</li>
</ul>
<p>关于第一点,我是深有体会的。以前每每制定计划的时候,都会制定严格的标准,会按照大家推崇的<a href="">SMART</a>原则制定计划。
但是,在实际操作的情况中,总会发生无法达成目标的情况。
在这种情况下,我总是会产生一种自我苛责的情绪,会产生一种焦虑感。
另外,很多情况下,我的时间安排有时候会被各种意外情况所打破,导致当天(周)的目标无法达成。这种时候,我也会产生一种焦虑感。之所以产生焦虑感,其实就是因为我陷入了一种「小巷思维」,在我的眼中只有前进(达成目标)和后退(没有达成目标)两种情况。
然而,如果以第三者的角度来看,其实我面对的是广阔的草原,并不是只要前进和后退两种状态。
当我尝试以第三者的角度来看待自己的时候,突然发现了一个不一样的自己。
其实,真实的自己不是一成不变的,不是永远精力充沛的,不是每次都能完成目标的。
他会劳累、他会厌倦、他会逃避。</p>
<p>第三者的视角告诉我,我不应该一直以一种静态的眼光来看待自己的,要学会接受一个动态的自己。人生本来就是一条起起伏伏的曲线,接受它,拥抱它,而不是强行把它想象成一条没有波动的直线。</p>
<p>在来谈谈以第三者的角度来看待别人。我们之所以需要这样做,是因为在一件事情中,如果我是利益相关的一方的话,其实很难完全看清一件事的真相。最近在我身上发生的一件事其实很能说明这个问题。</p>
<p>这个月初,我室友搬走了。我需要找一个新室友,通过各种渠道最终找到了一个新室友。然而,让我没想到的是,这个新室友到了之后,说是他只想短租,而不是长租。当时我不爽了,为什么最开始不提前说只是短租,现在到了公寓了,才说要短租。
而且,这位新室友是直接从国内过来的,到的时候已经是晚上了,我总不能说不接受短租,然后赶他走吧……
虽然他暂时住了下来,但是我还是有些不爽的,只是短租的话,他某种程度上消耗了我的机会成本。
后来冷静下来,试图从第三方的角度来分析这件事,发现,其实真心没必要因为这件事影响自己的情绪。首先,我之前的招租广告其实并没有明确说只想找长租的,因此,他默认是短租,而我默认是长租,其实都是陷入了各自的思维误区。在这个问题上,我也有一定的责任。其次,作为刚从国内来的留学生,我觉得还是需要保持最大的接受度的。任何一个人漂洋过海地过来,都不容易。这种时候,是最需要别人帮助的时候,我没必要太过挑剔。
这么一想,其实我就释然了。
短租就短租吧,这并不是什么大事。</p>
<p>这个例子告诉我,当你是利益相关的时候,其实很难看清楚一件事的原貌的。就像上篇博文「<a href="http://zhouyichu.com/weekly-blog/Where-one-Stands-Depends-on-Where-One-Sits/">屁股决定脑袋</a>」中的提到的一样,在这种情况下,我在自己不知情的情况下让自己的屁股决定了自己的脑袋。
看来,要破除「屁股决定脑袋」这种误区的另外一种方式,是可以尝试以第三者的角度来分析事情。</p>「中央帝国的军事密码」读书笔记2020-01-12T00:00:00-07:002020-01-12T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-01-12:/reading-list/Military-History-of-the-Central-Empire/<p>「中央帝国的军事密码」读书笔记</p><h1>摘录</h1>
<blockquote>
<p>所有战争都是典型的零和游戏</p>
</blockquote>
<h1>综述</h1>
<p>本书描述了中国古代两千多年的战争模式的变迁历史。战争的三要素天时地利人和,本文着重关注于影响战争的地理因素。</p>
<h1>结构和细部</h1>
<h2>前言</h2>
<ul>
<li>战争最关键的因素是地理</li>
<li>中国的军事战略演化可以分为五个时代:<ul>
<li>关中时代: 春秋战国到秦汉</li>
<li>分裂时代: 以长江为中心</li>
<li>失衡时代: 游击战、运动战</li>
<li>中原时代: 北方的闪电战</li>
<li>帝国时代: 大迂回战术</li>
</ul>
</li>
</ul>
<h2>第一部: 关中时代(公元前771-公元189年,秦到东汉)</h2>
<h3>得关中者得天下(公元前771年-公元前221年)</h3>
<ul>
<li>秦国的统一过程可以概括为: 扎根关中,先取四川,同时拥有关中和四川;占据上游,再从北、中、南三路依次打击中原。</li>
<li>防护关中平原的四个最重要的关塞: 函谷关、武关、大散关和萧关</li>
<li>商鞅通过变法,将秦国变成了战争机器<ul>
<li>在地方上推行中央集权制度</li>
<li>控制粮食流通渠道,限制人口自由流动</li>
<li>实行军爵制</li>
<li>鼓励移民</li>
</ul>
</li>
<li>秦国能够统一的军事要素<ul>
<li>封闭的关中地区,有利于防守,形成了稳定的大后方</li>
<li>同时获得关中和四川之后,有了足够的生产力来保证粮草供应</li>
<li>商鞅变法将秦国变成了战争机器</li>
</ul>
</li>
</ul>
<h3>西楚霸王: 不懂地理之困(公元前209-公元前202)</h3>
<ul>
<li>西楚之地一马平川,无险可守</li>
<li>刘邦通过明修栈道、暗度陈仓偷袭三个关中王,完整获得了关中和四川</li>
<li>楚汉争霸中,项羽虽然赢多输少,但是由于缺乏战略眼光,很多重要要地都丢给了刘邦,导致最终的失败。</li>
</ul>
<h3>汉武帝的塞上曲(公元前133-公元169年)</h3>
<ul>
<li>汉匈战争最大的收获是打通了河西走廊,使得汉朝与西域有了稳定的联系,为丝绸之路打下了基础</li>
<li>汉匈战争的结局是两败俱伤</li>
<li>消灭了匈奴其实没有实质性的收获,因为总会出现其他民族</li>
</ul>
<h3>光武帝: 中原反击战(公元8-公元36年)</h3>
<ul>
<li>光武帝之前,中国的统一战争都是从关中开始的</li>
<li>沿着长江逆流攻入四川</li>
<li>结束了关中时代</li>
</ul>
<h3>总结</h3>
<p>从秦国统一中国开始,中国地理重心一直是关中+四川的组合,关中和四川四面围山,易守难攻而且是产粮基地。谁同时占有了关中和四川,就拥有了当时中国最大的后勤基地。从关中可以打击整个中原地区,从四川沿着长江顺流而下,可以直接打击湖北地区。利用这个基地向外打击,成为了当时基本的军事思路。秦国、刘邦统一的过程就是遵循这个思路。</p>
<p>但是,到了东汉初年,经过200多年的开发,长江水道已经变得成熟。沿着长江逆流而上进入四川成为了可行的方案。关中+四川的组合优势变得越来越弱。光武帝最终由东到西完成了统一战争。</p>
<h2>分裂时代(公元189-公元589年)</h2>
<h3>隆中对: 开创分裂时代的大战略(公元189-公元219)</h3>
<ul>
<li>隆中对: 提出了从南道北的统一战略</li>
<li>张竑是第一个提出占据江东和荆州,从南到北的大战略</li>
<li>曹操: 北方战略,先统一北方再进行南攻</li>
<li>孙策: 江东战略,先统一江东,再顺江而上进攻北方</li>
</ul>
<h3>隆中对战略的失败: 武侯伐岐山的是是非非(公元220-公元234)</h3>
<ul>
<li>东吴的江东战略和诸葛亮的隆中对战略都依赖于对于荆州的占领,因此荆州的归属问题成为双方争夺点</li>
<li>失去了荆州支撑的蜀国,只能依靠四川偏安一隅。诸葛亮多次北伐,却依然无法突破地理的限制。</li>
</ul>
<div class="admonition note note">
<p class="admonition-title">Note</p>
</div>
<p>一个好的后勤基地:</p>
<ol>
<li>必须是高产的粮食基地</li>
<li>必须有良好的机动性,能够快速出击</li>
<li>必须是易守难攻的
但是某种程度上,2和3是相互矛盾的。因此,诸葛亮设计的战略是需要同时占有四川和荆州才能做到的。四川易守难攻,是粮食基地;荆州四通八达,是出击的好位置</li>
</ol>
<h3>西晋: 北方反击战(公元234-公元280)</h3>
<ul>
<li>西晋之后,四川不再是易守难攻之地,随着大量的西部道路被发现,北方可以更加方面的进攻四川</li>
<li>四川在三国之后已经不再是易守难攻之地了,但是依然是北方进攻南方的关键节点。</li>
<li>北方政权一旦控制了四川,就可顺江而下攻取两湖地区</li>
<li>南方缺乏足够的战略纵深</li>
</ul>
<h3>东晋时期的南北争霸(公元280-公元581)</h3>
<ul>
<li>统一中国北方的新模式: 利用山西高原山地来统一北方</li>
<li>山西:<ul>
<li>地势较高,被称为中原的屋脊</li>
<li>易守难攻</li>
<li>但是缺乏粮食产出</li>
</ul>
</li>
<li>前赵、后赵崛起的过程:<ul>
<li>从山西开始,占领河北,取得粮食基地</li>
<li>然后攻占洛阳、长安两京</li>
</ul>
</li>
<li>南方易攻的原因在于,一旦攻克南京,整个南方就沦陷了,缺乏足够的战略宗盛</li>
<li>而北方拥有众多的战略要地,失去一个,其他地区仍然可以继续抵抗</li>
</ul>
<h3>南朝: 长江混沌战(公元307-公元581)</h3>
<ul>
<li>南朝最重要的两个战略地点: 建康和荆州.</li>
<li>要稳定建康,必须稳定苏州地区,苏州是建康的粮仓。</li>
</ul>
<h2>失衡时代(公元384-公元907, 隋到唐)</h2>
<h3>北朝: 从黄河到长江(公元384-公元589)</h3>
<ul>
<li>在中国历史早期,中国文明以黄河流域为主,不同政权大都是以崤山和黄河为界的东西对立</li>
<li>后来随着长江流域的发展,东西对立逐渐变成了南北对立</li>
<li>东西魏的对立是中国历史上最后一次的东西对立</li>
</ul>
<h3>唐代建国: 关中的最后辉煌(公元589-公元622)</h3>
<ul>
<li>李渊是最后一位利用关中-四川的地理优势统一全国的人</li>
<li>山西地理优势+河北的粮仓成为了后续统一全国的策略</li>
</ul>
<h3>安史之乱: 缺乏制高点的叛乱(公元622-公元763)</h3>
<ul>
<li>唐代的长安处于一个非常尴尬的地位。当时的中国的经济中心已经转移到了江淮一带,长安附近产出的粮食已经无法满足首都的庞大人口了。</li>
</ul>
<h3>藩镇的群狼策略(公元763-公元820)</h3>
<ul>
<li>藩镇无法推翻中央政府,中央政府也无力管制藩镇</li>
</ul>
<h3>黄巢: 最漫长的长征(公元859-公元907)</h3>
<ul>
<li>唐代时期中国的经济中心已经转移到了东部</li>
<li>东部地区的缺乏足够的形胜之地进行防御,因此战争策略从守城战转变为运动战</li>
<li>黄巢开创了一种新的作战风格: 不需求根据地,以快速行军为基础,不断寻找政府的薄弱处攻击,直到在经济上拖垮政府</li>
</ul>
<h2>中原时代(公元907-公元1279, 五代到宋)</h2>
<h3>十六州忧思(公元936-公元1125)</h3>
<ul>
<li>宋朝的首都开封是一个经济富裕但是无险可守的地方</li>
<li>为了防卫无险可守的首都,终宋一代,宋代一直被冗兵、冗官拖累着</li>
</ul>
<h3>西北争夺战(公元982-公元1085)</h3>
<ul>
<li>西夏战争对于北宋的拖累远超辽国</li>
</ul>
<h3>变换的北方防线(公元1115-公元1208)</h3>
<ul>
<li>金国是一个军事强国,但是文化弱,人口少,即使在战场上能够快速攻城略地,但是无法维持长期的有效统治.</li>
<li>金国的国家特点注定了它只能采用闪电战,快速攻占首都迫使皇帝投降的战术</li>
</ul>
<h2>帝国时代(公元1179-公元1911)</h2>
<h3>成吉思汗眼中的世界(公元1179-公元1449)</h3>
<ul>
<li>蒙古社会全民皆兵,下级对上级保持了绝对的忠诚</li>
<li>蒙古人擅长于大迂回战术</li>
<li>蒙古在吞并西藏的时候,接受了藏传佛教。藏传佛教从此成为蒙古的国教</li>
<li>蒙古最终以最不擅长的消耗战消灭了南宋</li>
<li>元代的疆域对现代中国的疆域有着极其深刻的影响,现在的很多南方疆界都是在元代划定的。典型的例子是西藏和云南。</li>
<li>吞并南宋时,蒙古人的扩张也已经到了强弩之末</li>
</ul>
<h3>清帝国的新疆域(公元1618-1911)</h3>
<ul>
<li>明朝是在内忧外患中失败的</li>
<li>清政府的统治是所有时代中制度最为完善的一个朝代</li>
<li>现代中国的版图都是在清朝时期奠定的</li>
<li>蛮族一般都是臣服,很难完全被中央政府控制,而清政府却在蒙古推行了一套旗人制度,将蒙古分为八旗二十四部,这些骑部互相合作,又互相监督.</li>
</ul>
<h1>评价</h1>
<p>后期就像是流水账, 深度不够。
例子: 朱元璋的统一过程只是一笔带过,由南向北的策略没有深入剖析.
朱元璋和陈友谅之战提都没有提到。</p>
<h1>和我的关系</h1>
<p>学习到的战争模式:</p>
<ol>
<li>抢占优势地位,从优势位置开始向外辐射,统一全国</li>
<li>如果无法抢占优势地位,那么就要想办法不让别人占得优势地位</li>
<li>面对优势对手,可以采取运动战。不求一城一地的得失,不断运动,哪里弱就攻击哪里,直到在经济上拖垮对手</li>
</ol>避免屁股决定脑袋2020-01-11T00:00:00-07:002020-01-11T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-01-11:/weekly-blog/Where-one-Stands-Depends-on-Where-One-Sits/<p>「屁股决定脑袋」是人们常常会犯的一个思维误区,本文试图从个人的角度对这个问题进行阐述,提出可执行的避免方案。</p><h1>前言</h1>
<p>之前我在<a href="http://zhouyichu.com/words/Summary-2019/">2019年的年度总结</a>中提到了,在整个2019的一年中,我最大的感悟之一是,大部分人(包括我自己)都是屁股决定脑袋的,并且我希望自己在新的2020年,能够尽量降低自己的屁股决定脑袋的倾向。
然而,这真的是一件非常困难的事情,一不小心就会落入屁股决定脑袋的思维陷阱中而不自知。</p>
<p>我希望通过本文理清自己对「屁股决定脑袋」这个问题的理解和解决方案。</p>
<h1>定义</h1>
<p>我认为,所谓的「屁股决定脑袋」描述的是一种人类的思维模式,这种思维模式往往会导致人们选择性的接受一部分事实,然而做出决策。 而这种筛选信息的过程可以分为主动和被动两种不同的情况:</p>
<dl>
<dt>被动</dt>
<dd>一个人看问题的方式受到他所处位置的限制,他的位置限制了他的视野,而他自己却没有意识到自己的决策和判断其实是受到他所处位置的限制的。</dd>
<dt>主动</dt>
<dd>一个人会主动选择站在对自己有利的一面进行决策和判断,即使他知道自己是错的,他也会坚持自己的利益。</dd>
</dl>
<p>在我们大部分人身上经常发生的是第一种被动的情况,自己的思维被我们所处的位置所限制了,而我们还不自知。
第二种主动的情况经常会发生在一些大型组织身上(当然个人身上也是会发生的),比如各国政府、大型公司。一个典型的例子就是,2019年的香港问题,国内媒体和国外媒体呈现出两种非常不同的论调和事实。这就是典型的「屁股决定脑袋」。他们追求的不是事实真相,而只是想要创造对自己有利的舆论。
我无法对这种情况做出价值判断,因此此处不做讨论。</p>
<p>我希望自己改进的是第一种情况,因为在第一种情况中,我们会不知不觉地做出错误的判断。
关于第一种情况,一个极端一点的例子就是一个关于乞丐的笑话:</p>
<blockquote>
<p>有一天一个乞丐意外获得了一大笔遗产,有人问这个乞丐,他发财之后最想做什么
乞丐回答: 他要马上去买一个金碗来乞讨</p>
</blockquote>
<p>这当然是一个极端的例子,但足以说明问题。虽然日常生活中,我们不可能犯这样的错误,但是有时候,我们也只是仅仅比这个乞丐好了一点点而已。
比如,当我们在新闻中看到有关劳资矛盾、豪车车祸的新闻的时候,我们都会下意识的直接跳到结论: 一定是资本家又在剥削工人了、一定又是富豪醉驾扰乱交通了。
为什么我们可以在不知道具体事实经过的情况下,就直接得出这样的结论,这主要是因为我们总是会把自己代入弱势的一方,把我们的屁股坐在弱势的一方,从弱势的一方进行思考。</p>
<h1>方案</h1>
<p>理解了什么是「屁股决定脑袋」,那么我们该如何避免这样的思维误区。
其实,这说起来很容易: <strong>独立思考</strong>。但是,这做起来又十分困难。
怎么样才能做到<strong>独立思考</strong>呢?
<a href="https://www.zhihu.com/question/19649898">知乎</a>上的一个高分回答列出了一下几点:</p>
<ul>
<li>质疑</li>
<li>找论据+找立场</li>
</ul>
<p>然而,我认为这依然是不够的。
首先,我完全同意,对于一个决策或论点,我们都需要有提出质疑的习惯。
只有提出了质疑,才能推动我们进一步的思考。
其次,我们依然需要尝试列出当前问题的论据和这个论据的立场。
但是,仅仅到这里,我认为依然是不够的的。
我觉得最重要的其实是要<strong>主动去寻找、思考与我们判断相反结论的论据和立场。</strong>
对这些「反对派」的论据和立场进行分析之后,我们才能真正摆脱「屁股决定脑袋」的误区。
这里的理由其实也很简单,因为我们<em>总是能够找到支持自己论断的论据的。</em>
我们的大脑在认定一个结论之后,会自动寻找支持这个结论的证据而自动忽略反对这个结论的证据。
这也就是凯撒曾经说过的: 人们只会看到自己想看到的东西.
为了避免这种情况,我觉得最有效的方式需要<strong>主动</strong>去寻找、分析与自己相左的想法和观点。
只有看到一个问题全部方面,才能帮助我们做出最合适的判断。</p>「中央帝国的财政密码」读书笔记2020-01-05T00:00:00-07:002020-01-05T00:00:00-07:00Flyawaytag:zhouyichu.com,2020-01-05:/reading-list/Finanical-History-of-the-Central-Empire/<p>「中央帝国的财政密码」读书笔记</p><h1>摘录</h1>
<blockquote>
<p>任何一个后进国家从一种模式向另外一种模式转化时,都不能避免官商经济的发展。</p>
<p>未来在国内,是一个新闻报道空间逐渐被压缩的时代,如果继续做下去,可能只会消耗个人生命</p>
<p>当战争向着长期化发展时,谁第一个反应过来,从掠夺式财政政策走向可持续的生产式财政,谁就会成为受益者</p>
</blockquote>
<h1>综述</h1>
<p>本书描述了中国古代两千年的财政制度的变迁历史。
总体而言,中国的历朝历代始终围绕着三大底线来设计财政政策:</p>
<ol>
<li>国有企业</li>
<li>土地公有制</li>
<li>政府垄断货币发行权</li>
</ol>
<p>整个中国的财政历史就是政府和百姓之间的金融博弈过程。
在这个过程中,不管是政府和百姓都开发出了各式各样的金融对策来解决他们的问题。</p>
<h1>结构和细部</h1>
<h2>前言: 一部新视角小的中国财政史诗</h2>
<p>中国经济的三大底线:</p>
<ol>
<li>国有企业</li>
<li>公有土地制度</li>
<li>政府垄断货币发行权</li>
</ol>
<p>这所谓的三大底线,其实是中央政府的三大敛财手段</p>
<p><strong>中国历史的财政逻辑</strong></p>
<ul>
<li>中央政府通过建立庞大的官僚体系来管理地域辽阔的帝国,而中央政府控制地方官吏的最重要的手段就是财政,除了中央政府,其余机构无权收税,也不能给官员发放工资。</li>
<li>
<p>官员成为了中央政府豢养的统治工具。</p>
</li>
<li>
<p>从汉代开始出现国有企业,汉武帝将盐铁收为国家经营</p>
</li>
<li>从唐代开始出现土地国有制,农民只是国家终生的租客。</li>
<li>宋代开始发行纸币——国家垄断货币发行权</li>
</ul>
<p><strong>集权财政的三大周期</strong></p>
<ul>
<li>第一个周期<ul>
<li>始于秦汉,结束于南朝。</li>
<li>中央集权为主,诸侯制为辅</li>
<li>土地私有制</li>
<li>税收采取土地税</li>
<li>逐步出现国有企业、国家金融垄断</li>
</ul>
</li>
<li>第二个周期<ul>
<li>从北魏开始,结束于南宋</li>
<li>完全的中央集权制度和科举制</li>
<li>土地公有制: 国家分配和回收土地</li>
<li>税收采用租庸调制度</li>
</ul>
</li>
<li>第三个周期<ul>
<li>从辽金开始,结束于明清</li>
<li>土地制度重回私有制</li>
<li>建立了具有无限控制力的集权模式</li>
<li>税收以土地税为主</li>
<li>放弃了不稳定的货币体系</li>
</ul>
</li>
</ul>
<h2>引子: 汉武帝 两千年帝国财政的教科书(公元前133年到公元前87年)</h2>
<ul>
<li>汉武帝是中国集权财政模式的开创者</li>
<li>为了应对庞大的军事支出,汉武帝垄断了自然资源,开办国有企业</li>
<li>政府为了维稳,必须多收税;要多收税,必须建立企业和金融垄断;而国有企业和金融垄断会破坏经济的发展,经济发展停滞之后,又会影响政府维稳,从而造成王朝垮台</li>
<li>必要的恶: 为了管理庞大的官僚体系,政府必须建立国有企业获得利润</li>
</ul>
<h2>探索中的集权帝国(秦到南朝,公元前221年-公元589年)</h2>
<h3>秦代: 中央帝国的诞生(公元前221年-公元前141年)</h3>
<ul>
<li>楚汉之争并不是皇位的争夺战,而是两种理念的战争: 诸侯模式还是大一统帝国</li>
<li>鲁国: 初税亩: 实现土地私有化</li>
<li>魏国: 李悝变法<ul>
<li>温和的变法</li>
<li>不破坏原有的社会秩序</li>
</ul>
</li>
<li>秦国:<ul>
<li>商鞅变法<ul>
<li>在地方推行郡县制</li>
<li>控制粮食流通的渠道,限制人口自由流动,农民无法擅自离开土地. 每个人都被标准化。</li>
<li>实行军爵制,将整个社会生活同军事挂钩: 秦国成为完美的战争机器</li>
<li>鼓励其他各国移民</li>
</ul>
</li>
<li>统一进程结束之后,没有能够及时转换统治制度,依然采用战时模式,民力被压榨干了。</li>
</ul>
</li>
<li>汉代<ul>
<li>文帝:<ul>
<li>买卖爵位、放弃土地税,让百姓休养生息.</li>
<li>最大程度减少政府的开支.</li>
<li>小政府的典范,也使得人们意识到建立一个大帝国是可行的。</li>
</ul>
</li>
<li>景帝:<ul>
<li>中央和地方的博弈中,地方逐渐占据上风</li>
<li>通过战争,景帝消灭了诸侯势力,彻底掌握了全国的财政权</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>汉代: 皇帝的财政僵局(公元前141年-公元前33年)</h3>
<ul>
<li>大一统中央集权帝国的死穴: 不可避免的财政扩张<ul>
<li>经济的繁荣使得官僚集团开始变得臃肿,皇室开始扩建后宫</li>
<li>战争极大的加大了财政的负担</li>
</ul>
</li>
<li>武帝为中央帝国建立了模板<ul>
<li>农业税税率不高</li>
<li>垄断工业的国有企业</li>
<li>垄断金融体系,发行货币</li>
<li>使得中国古代的工商业无法得到完全的发展</li>
</ul>
</li>
<li>
<p>垄断货币发行权</p>
<ul>
<li>为政府榨取财富提供的快捷通道</li>
<li>被后世历朝历代沿用</li>
</ul>
</li>
<li>
<p>汉昭帝时期经济开始复苏</p>
</li>
<li>武帝晚年已经放弃了穷兵黩武的政策,开始休养生息</li>
<li>汉昭帝、汉宣帝放弃了奢华的宫室和礼仪</li>
<li>农业革命: 农耕+大规模使用耕牛</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
</div>
<p>这是中央集权政府绕不开的体制弊端?</p>
<h3>一个幻想家的财政实验(公元前33年-公元25年)</h3>
<ul>
<li>王莽改革是一次儒家原教旨的乌托邦实验</li>
<li>王莽改革的核心:<ul>
<li>土地所有制改革: 取消土地私有制</li>
<li>货币制度改革</li>
<li>加强政府垄断</li>
</ul>
</li>
<li>王莽是被儒家分子蛊惑进行改革的</li>
</ul>
<h3>穿越朝代的制度惰性(公元25年到公元189年)</h3>
<ul>
<li>此时的东汉政府的官僚机构已经非常冗余而庞大,行政效率非常低下</li>
<li>政府上层开始被几个大家族所把持</li>
<li>政府为了筹措资金,开始大规模卖官鬻爵</li>
</ul>
<h3>魏晋南北朝: 战争时期的财政竞争(公元189年-公元589年)</h3>
<ul>
<li>三国: 财政为王<ul>
<li>整个三国史就是财政史</li>
<li>曹魏正式因为创立了屯田制,拥有高效的后勤系统</li>
<li>其他军阀都是掠夺为主,而曹魏则是屯田制</li>
<li>屯田制:<ul>
<li>和平时期: 低效</li>
<li>战争时期: 唯一的有效组织方式</li>
</ul>
</li>
</ul>
</li>
<li>看不见的战场<ul>
<li>完善的财政系统是司马氏最终胜出的关键</li>
<li>晋朝灭蜀、灭吴的大将都是深刻理解财政的人才<ul>
<li>邓艾</li>
<li>羊祜</li>
<li>杜预</li>
</ul>
</li>
</ul>
</li>
<li>西晋:<ul>
<li>晋武帝的土地政策由于各种世家大族之间的矛盾而与最终流产</li>
<li>八王之乱彻底颠覆了晋朝的政府</li>
</ul>
</li>
<li>
<p>东晋:</p>
<ul>
<li>黄白籍制度: 重新进行土地清查</li>
</ul>
</li>
<li>
<p>南朝</p>
<ul>
<li>清查户籍</li>
</ul>
</li>
</ul>
<h3>小结</h3>
<p>秦汉早期是一段实验时期,统治者们试图建立一套制度来管理一个庞大的帝国。秦国创建了郡县制,加强了中央对地方的掌控力。汉继承了秦的郡县制,早期采取了宽松的经济政策,让民间的经济力量自由发展。但是到了汉武帝时期,由于和匈奴大规模战争的开展,汉武帝发现政府的自由主义财政政策无法满足大帝国的军事和官僚支出。因此,他开始引入一整套垄断体系来解决政府的财政问题。
但是,垄断体系虽然在短时间内解决了战争经费的问题。但是,这也造成了政府参与经济活动,使得社会无法正常的、自然的发展。
当官僚机构和经济勾结时,社会慢慢就结块和硬化了,形成了士族阶级。
他们既掌握了公权力,也参与社会经济活动,严重干扰了正常的经济活动发展。
这成为后续几百年的巨大社会问题。历朝历代都无法彻底解决。</p>
<h2>财政失控的繁荣帝国(北朝到南宋,公元386年-公元1279年)</h2>
<h3>唐德宗: 吝啬皇帝感慨悲歌(公元779年-公元805年)</h3>
<ul>
<li>唐肃宗<ul>
<li>向商人收取重税,抑制了商业的发展</li>
<li>设置了大量的临时官员来从民间收取税收,导致了大量冗余的官僚机构</li>
<li>将国库转为皇帝的私库,进一步破坏了唐代的财政制度</li>
<li>货币贬值</li>
<li>建立国有企业</li>
</ul>
</li>
<li>唐代宗<ul>
<li>加强专卖制度</li>
<li>加强土地税</li>
</ul>
</li>
</ul>
<div class="admonition note 思考">
<p class="admonition-title">Note</p>
</div>
<p>任何一种制度的建立,都需要考虑两个方面:
1. 新制度带来的收益
2. 执行新制度带来的成本
在设计制度的时候,决不能只考虑带来的收益,还需要考虑因此而产生的管理成本</p>
<ul>
<li>唐德宗<ul>
<li>两税法改革</li>
<li>废除酒类专卖</li>
<li>错误估计了削藩的时机</li>
</ul>
</li>
</ul>
<h3>一千多年以前的土地革命(公元386年-公元618年)</h3>
<ul>
<li>北方战乱,五胡乱华。但正是因为战乱,导致了北方的各个政府能够抛却一切历史包袱,重新整理整个国家的户籍数据,实行土地国家公有制。</li>
<li>
<p>公有制形式:</p>
<ul>
<li>每户的幼儿成年时都可以获得政府分配的土地</li>
<li>老人去世之后,政府收回土地进行再分配</li>
</ul>
</li>
<li>
<p>隋朝的繁荣其实是「国富民穷」的表现</p>
<ul>
<li>隋文帝建立了高效的抽税系统,将民间的资源集中到政府手中</li>
<li>民间的财货其实远没有表面上的那么繁荣</li>
</ul>
</li>
</ul>
<div class="admonition note">
<p class="admonition-title">思考</p>
</div>
<p>原来土地公有制不是近现代才有的,土地公有制在中国历史其实是源远流长的。</p>
<h3>唐代: 最简单的财政,最复杂的问题(公元618年-公元907年)</h3>
<ul>
<li>唐太宗晚期的财政状况其实已经失控,本质上与隋炀帝没有太大的本质区别<ul>
<li>历史上对他英明的推崇表现出了百姓对圣君的渴望</li>
<li>失控的财政没有导致帝国奔溃是因为唐代的征税机制远没有隋代那么严密,政府的征税机器没有对民间经济造成巨大的破坏</li>
<li>大量的财富余留在民间,才造成了所谓的贞观之治</li>
</ul>
</li>
<li>唐朝实行的授田制——一种土地公有制<ul>
<li>一个人出生之后从政府处获得土地,毕生从事农耕,并上交税收,人死后,田地由政府回收再分配</li>
<li>租庸调<ul>
<li>租: 在政府分配的田地上耕作,向政府交纳收成。</li>
<li>调: 家庭手工业税,根据地方产出的不同,向政府交纳不同的手工业产品</li>
<li>庸: 所有男丁每年为政府服力役二十天</li>
</ul>
</li>
</ul>
</li>
<li>终唐一朝,财政问题始终困扰着政府</li>
</ul>
<h3>宋代: 改革之殤(公元960年-公元1100年)</h3>
<ul>
<li>
<p>宋代的财政制度</p>
<ul>
<li>中央直接派遣官员到地方收税,地方官员无权处理税收事务</li>
<li>形成了干强枝弱的局面</li>
<li>财政官员的地位提升,独立于行政体系之外</li>
<li>此种制度非常成功,直到宋朝灭亡,地方官僚都无法与中央抗衡</li>
<li>建立了严密的国有企业,大部分奢侈品和民生用品均是官营</li>
</ul>
</li>
<li>
<p>宋代的包袱:</p>
<ul>
<li>冗兵</li>
<li>冗官</li>
</ul>
</li>
<li>
<p>范仲淹改革:</p>
<ul>
<li>针对对象: 冗兵,冗官,冗费,行政效率低下</li>
<li>财政应该量入为出,而不是量出为入。 政府的职责是发展经济而不是加强税收</li>
<li>政府不应该直接参与经济活动</li>
<li>主要问题不是财政收入不足,而是政府规模快速膨胀。</li>
</ul>
</li>
<li>
<p>王安石变法: 从节流 --> 开源</p>
<ul>
<li>基本主线: 加强中央集权</li>
<li>想法很理想,但是由于政府官僚效率低下,最终失败了</li>
</ul>
</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
</div>
<p>任何一次改革的成败,不只是方法和方向的问题,还涉及到了执行力的问题。
尤其是在一个庞大的组织体系中,如何平衡各方的利益,在稳定的执行环境中推进改革才是最重要的。</p>
<h3>纸币: 温水煮青蛙的游戏(公元993年-公元1100年)</h3>
<ul>
<li>交子:<ul>
<li>铁本位</li>
<li>只在四川使用</li>
</ul>
</li>
<li>为了支持与西夏的战争,政府开始在没有保证金的情况下,大量印制交子</li>
</ul>
<h3>金融大奔溃(公元1100年-公元1279年)</h3>
<ul>
<li>宋徽宗贬谪了大量能臣</li>
<li>宋徽宗贪图享受</li>
<li>蔡京将交子推广到全国,且是在没有准备金的情况下</li>
<li>南宋的吉荣体系继续失控,大幅的通货膨胀</li>
</ul>
<h2>最完美的集权机器(辽金到清 公元907年-公元1911年)</h2>
<h3>元代: 大蒙古的财政危机(公元1206年-公元1368年)</h3>
<ul>
<li>色目人为蒙古管理财富,通过放贷来增值</li>
<li>蒙古人也把西方的白银引入了中国</li>
<li>蒙古采用色目人的建议,开始采用包税制</li>
<li>元代纸币以银为储备</li>
</ul>
<h3>明代: 最严密的集权皇朝(公元1368年-1644年)</h3>
<ul>
<li>大明宝钞<ul>
<li>完全没有准备金制度,所有纸币都是不可兑换的</li>
<li>发行数量不做限制</li>
<li>快速贬值</li>
</ul>
</li>
<li>银本位<ul>
<li>民间自发对抗中央的错误金融政策</li>
<li>保护了民间的经济</li>
</ul>
</li>
<li>明代闭关锁国,没有意愿和海外进行贸易<ul>
<li>外商把货物运到中国,但是不能自由贸易,只能交给政府,作为贡品运往北京</li>
<li>朝廷则会赏赐使者大量钱财</li>
</ul>
</li>
</ul>
<div class="admonition note note">
<p class="admonition-title">Note</p>
</div>
<p>难道这就是所谓的「万国来贺」的真相?!</p>
<ul>
<li>
<p>明代继承了元代的三级政府机构</p>
<ul>
<li>三级金字塔式的行政结构有利用中央集权的统治</li>
<li>明清进一步完善了科举制。一个副作用是逐渐消灭了大家族的垄断地位,彻底打算了社会板结</li>
</ul>
</li>
<li>
<p>张居正</p>
<ul>
<li>一条鞭法<ul>
<li>大大简化了征税手续</li>
<li>牢牢地把握住了一个根本: 土地</li>
<li>从征收实物变成了征收银两,确定了以货币为税的原则</li>
</ul>
</li>
<li>并没有做出发展经济的尝试,只是榨干了社会的税基</li>
</ul>
</li>
</ul>
<h3>清代: 挣扎在传统与现代之间(公元1636年-公元1911年)</h3>
<ul>
<li>
<p>征税的改革</p>
<ul>
<li>新增人丁永不加赋</li>
<li>摊丁入亩: 放宽了对人口流动的限制,促进了工商业的发展</li>
<li>火耗归公</li>
</ul>
</li>
<li>
<p>银本位的金融体制</p>
<ul>
<li>比较稳定,不会出现大幅波动</li>
</ul>
</li>
<li>
<p>清朝的财政收入</p>
<ul>
<li>地丁税</li>
<li>火耗银</li>
<li>出卖功名</li>
<li>盐业专卖</li>
<li>关税</li>
</ul>
</li>
<li>
<p>清朝前期通常保持着收入大于支出的状态</p>
</li>
<li>白莲教战争,耗光了康乾几十年的财富积累</li>
<li>1840年的中英战争虽然战败,但是也打开了中国的大门。中国的工商业就此起步</li>
<li>真正让清朝重创的是太平天国运动</li>
</ul>
<h1>评价</h1>
<p>总体感觉不够深入,分析的比较浅显。
而且明显感到头重脚轻,对汉唐的分析比较深入,而对后来的朝代则比较放松了。</p>
<h1>和我的关系</h1>
<p>目前我认为比较好的制度:</p>
<ol>
<li>府兵制: 加强平时的训练</li>
<li>中央政府控制地方的财政</li>
<li>土地公有制: 前提是政府效率足够,能够掌握全国的户籍情况</li>
<li>将官僚体系维持在一个合适的规模,不能无限制的增长</li>
</ol>2019年度总结2019-12-30T00:00:00-07:002020-01-03T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-12-30:/words/Summary-2019/<p>2019年年度总结</p><h1>前言</h1>
<p>2019过去了,又到了一年的整理和回顾的时候了。</p>
<h1>事业</h1>
<h2>科研</h2>
<p>科研方面,今年中了两篇长篇。过去两年的研究终于开花结果。</p>
<ul>
<li><strong><a href="https://www.aclweb.org/anthology/S19-1#page=38">Beyond Context: A New Perspective for Word Embeddings</a></strong>
<em>Yichu Zhou</em> and Vivek Srikumar. Proceedings of the Eighth Joint Conference on Lexical and Computational Semantics (* SEM 2019)</li>
<li><strong><a href="https://www.aclweb.org/anthology/K19-1042.pdf">On the Limits of Learning to Actively Learn Semantic Representations</a></strong>
Koshorek, Omri, Gabriel Stanovsky, <em>Yichu Zhou</em>, Vivek Srikumar, and Jonathan Berant. In Proceedings of the 23rd Conference on Computational Natural Language Learning (CoNLL), pp. 452-462. 2019.</li>
</ul>
<p>今年下半年的时候,顺着embedding的研究,我又开启了一个新的研究问题。</p>
<h2>会议</h2>
<p>今年参加了NAACL2019,同时也做了第一场的oral talk。
在这里我要特别感谢我的advisor——Vivek Srikumar教授。
在我做oral talk的前一天晚上,他还特地抽出时间来和我在现场再做了一个模拟。</p>
<p><img alt="Oral Talk" src="http://zhouyichu.com/images/NAACL2019.JPG"/></p>
<h1>生活</h1>
<h2>读书</h2>
<p>今年基本延续了去年的阅读管理体系。
全年阅读了40本,然而,今年的阅读体验是最近几年来的最差的。
我反思了一下,我发现,今年的阅读过程失去了方向感。
在过去几年,我会时不时地进行一些主题阅读。但是,今年完全没有这方面的规划,选择的书籍杂而低质。
可以归结为两个原因:</p>
<ol>
<li>失去了主动阅读的精神</li>
<li>阅读的过程没有进行筛选环节</li>
</ol>
<p>阅读不仅仅是拿起书就读这么简单,这也可以是一个系统工程,需要做好的良好的规划。</p>
<h2>健身</h2>
<p>今年健身的主题是继续增重,我今年的最高峰体重达到了80kg,相应的体脂也达到了历史最高点。
2019年的最后两个月我一直都在全力减脂,体重从巅峰的80kg快速降到了目前的73kg;体脂也从最高的26%降到了现在的22%<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<h2>每周一文</h2>
<p>「每周一文」计划是今年的一个败笔。
今年一共发布了57篇博文,然而,其中属于「每周一文」系列的只有30篇。
依然记得年初的时候,信心满满地定下了这个计划,然而,现在年底了,我只收获了30篇。
其中最大的因素我归结为: <strong>惯性的懒惰</strong>.</p>
<p>「每周一文」计划彻底破产是在年中的时候,那时候事情比较多,既要参加会议、准备Oral Talk,还要帮助女朋友搬家。
一时断更了博文。结果,整个下半年我再也没有重新开始写作。</p>
<h1>感悟</h1>
<h2>剪枝</h2>
<p>关于剪枝的问题,其实我应该是了解的。在<a href="http://zhouyichu.com/words/Summary-2016/">2016的年度总结</a>的时候,我就已经意识到了剪枝目标的重要性。
但是,万万没想到3年后的2019,我依然犯了同样的错误。
今年的最大的失败在于,我把有限的精力分散到了太多的地方。
结果,没有一件事是真正保质保量完成的。</p>
<p>关于这一点,其实没什么好说的,我需要做的就是收缩精力,把精力投入到当前最重要的事情上面。</p>
<h2>中立</h2>
<p>作为一个科学从业人员,我们首先的要做到的就是保持中立客观的态度进行研究。
不能用屁股决定脑袋。然而,这件事做起来远远要比说起来难。
我一直以为自己是足够中立的,然而事实并非如此。
今年很多事实都证明了,我只是又一个屁股决定脑袋的人而已。
从下半年开始,我就开始不断告诫自己,不能把自己看成是一个局内人,需要把自己当成是一个观察者。
观察的结果只取决于观察到的事实而不是自己的喜好。</p>
<p>保持绝对的中立其实是非常难的,大部分时候都是在无意识的情况下就变成了屁股决定脑袋的人。
只有在进行复盘的时候,才意识到自己的思维方式其实是存在着问题的。</p>
<p>希望能在新的2020年,能够养成一个客观评价的思维体系。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>今年我开始使用Fitbit的Aria 2作为自己的体重、体脂测量工具,因此,此处的体脂数据和去年不具有可比性. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>西方哲学史第十章 作为一个体系的唯理论 读书笔记2019-10-27T00:00:00-06:002019-10-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-10-27:/reading-list/Filosofihistorie-10/<p>「西方哲学史」第十章读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>不同种类的政府都可能有好的一面和坏的一面,但关键是要有信仰自由、思想自由和言论自由。</p>
<p>实体: 我理解为在自身内通过自身而被认识的东西。形成实体的概念,可以无须借助于他物的概念。</p>
</blockquote>
<h1>综述</h1>
<p>本章描述了笛卡尔唯理论的两位继承者: 斯宾诺莎和莱布尼茨.</p>
<h1>结构和细部</h1>
<h2>斯宾诺莎</h2>
<p>斯宾诺莎属于古典唯理论学派: 人类理性有能力借助于公理和演绎推理而获得绝对确定的洞见。</p>
<p><strong>实体和属性</strong>
四种获得知识的途径:</p>
<ol>
<li>通过传闻获得知识,自己没有亲身经历 --> 不确定的</li>
<li>通过直接的亲身经验而获得的知识 --> 感官会欺骗、误导</li>
<li>借助于逻辑推理而获得的知识 --> 出发点是固定的,无法获得新的知识</li>
<li>直接的直觉 --> 最重要的途径</li>
</ol>
<p>人的本质是生活和保存生命的意志</p>
<p>笛卡尔和斯宾诺莎都是把数学作为出发点,但是,他们也有不同之处:</p>
<ol>
<li>笛卡尔专注要找到的绝对的公理,不关注演绎过程</li>
<li>斯宾诺莎则更加关注演绎推理本身,注重构造一个庞大的推理体系</li>
</ol>
<h2>莱布尼兹</h2>
<ul>
<li>莱布尼兹设法被机械论世界观和目的性宇宙的观念调和起来。<ul>
<li>机械论说了世界的表层现象</li>
<li>在深层次上,这个世界是有目的的</li>
</ul>
</li>
<li>
<p>世界的底层元素: 单子</p>
<ul>
<li>单子具有不同的等级,单子构成了一个等级序列,彼此之间相互不影响</li>
<li>上帝为这些单子编制程序,使他们和谐的共存</li>
</ul>
</li>
<li>
<p>我们所处的世界是所有可能的世界中的最好的:</p>
<ul>
<li>为了现存的所有社会问题提供了合法性</li>
<li>为现在的社会形态提供了合法性</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>这一章的内容是上一章内容的延伸,试图为机械论进行修补,使其与上帝可以和谐共存。</p>「给忙碌者的天体物理学」读书笔记2019-10-26T00:00:00-06:002019-10-26T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-10-26:/reading-list/Astrophysics-for-People-in-a-Hurry/<p>「给忙碌者的天体物理学」读书笔记</p><h1>给忙碌者的天体物理学</h1>
<h1>摘录</h1>
<blockquote>
<p>宇宙没有义务让你理解</p>
<p>物质和能力的存在弯曲了围绕它们的空间和时间结构.</p>
<p>除了物理定律之外,其他的都只是个人观点</p>
</blockquote>
<h1>综述</h1>
<p>这是一本介绍天体物理学的小册子,从不角度以通俗易懂的语言向普通大众阐述了目前人类对宇宙的认知。
这本书向我们解释了什么是暗物质、暗能量,为什么我们认为宇宙是在不断膨胀的。</p>
<h1>结构和细部</h1>
<h2>The Greatest Story Ever Told</h2>
<ul>
<li>普朗克时期: 大爆炸之后时间间隔从<span class="math">\(t=0\)</span>到<span class="math">\(t=10^{-43}\)</span>.</li>
<li>大爆炸之前,宇宙的四种基础作用力还是统一的</li>
<li>四种基础作用力:<ul>
<li>决定放射性衰变的弱核力</li>
<li>把原子核束缚起来的强核力</li>
<li>使得分子结合在一起的电磁力</li>
<li>把大团物质聚集在一起的引力</li>
</ul>
</li>
<li>碳基分子的复杂多样性要远超其他元素组合出来的分子结构</li>
</ul>
<h2>On Earth as in the Heavens</h2>
<ul>
<li>物理定律的普适性</li>
<li>我们对定律的信心,取决于测试和验证条件的范围。</li>
</ul>
<h2>Let There Be Light</h2>
<ul>
<li>宇宙直到大爆炸后38万年都是不透明的</li>
<li>宇宙微博背景辐射(CMB)是人类观测宇宙发展的探针</li>
</ul>
<h2>Dark Matter</h2>
<ul>
<li>暗物质,不与电磁力产生作用的物质,但是他们却产生了宇宙中大部分(<span class="math">\(80\%\)</span>)的引力.</li>
<li>暗物质就是「失踪的质量」</li>
</ul>
<h2>Dark Energy</h2>
<ul>
<li>暗能量是宇宙的膨胀力,是它导致了宇宙用于处于不断膨胀的状态中</li>
</ul>
<h2>The Cosmos on the Table</h2>
<ul>
<li>氢是最轻和最简单的元素,原子核内只有一个质子。</li>
<li>宇宙中超过90%的原子都是氢</li>
<li>氦是宇宙中第二简单和第二丰富的元素</li>
<li>锂是宇宙中第三简单的元素,锂不够稳定,会被每一个已知的核反应所破坏</li>
<li>碳元素能够合成很多种分子,其种类要比其他所有不含碳的分子的综合还要多</li>
<li>碳氧是我们所知生命的主要成分</li>
<li>在宇宙中,碳比硅丰富十倍</li>
</ul>
<h2>On Being Round</h2>
<ul>
<li>珠朗玛峰的高度差不多已经达到了地球山峰的极限了,如果再高,它下面的岩层就会被自身的重量压垮。</li>
<li>宇宙在所有方向上都在膨胀</li>
<li>从我们所在的位置,能够方向离我们最远的天体正在以光速离我们而去,他们发出的光永远也无法到达地球。</li>
</ul>
<h2>Invisibale Light</h2>
<ul>
<li>按照从低能、低频到高能、高频的顺序来填满整个电磁波谱: 无线电波、微波、红外线、可见光、紫外线、X射线和伽马射线</li>
</ul>
<h2>Between the Planets</h2>
<ul>
<li>小行星带: 木星和火星之间</li>
<li>柯伊伯带:布满彗星的带状环形区域,位于海王星轨道之外</li>
<li>月亮的直径是太阳直径的400分之一,但它到地球的距离,也是它和太阳距离的1/400,从而使得太阳和月亮在天空中看起来一样大</li>
</ul>
<h2>Exoplanet Earth</h2>
<ul>
<li>每种元素,每种分子都以唯一的方式吸收、发出、反射和散射光。</li>
<li>让光通过光谱仪,我们能够发现被称为化学指纹的特征。</li>
</ul>
<h2>Reflections on the Cosmic Perspective</h2>
<ul>
<li>我们既不高于也不低于自然,我们属于自然</li>
</ul>
<h1>评价</h1>
<p>整本书的篇幅不大,但是语言比较通俗易懂。
对于像我这样的门外汉来说,是比较友好的。</p>
<h1>和我的关系</h1>
<p>和我之前想象的一样,宇宙中仍然存在着很多谜团。
人类对于宇宙的认知还处在一个非常粗浅的状态。
不过,这本书也同时解释了为什么如果存在外星人,那大概率可能是碳基生命。
因为宇宙中最丰富的元素就是氢、氦、碳、氧。碳和氧的活性是最高的,能和大部分元素都发生反应。所以,如果有其他地外生命的话,大概率是碳基的。</p>
<p>对我自身来说,我只能说这本略微补充了我原本不多的,关于宇宙的知识。</p>
<p>书中内容给我最深刻的感受就是,人类是渺小的,同样也是傲慢的。自古至今,人类的傲慢充斥着方方面面,想当然地认为人类是最高级的生命形态、想当然地认为地球是第一无二的,想当然地认为太阳是独一无二的。
然而,事实一次又一次地告诉我们,人类是渺小的、普通的、微不足道的。
如果宇宙整体拥有意识的话,也许从人类诞生到人类灭亡,这个宇宙级的意识也许都不会意识到人类存在过。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>人类社会没有对错2019-10-26T00:00:00-06:002019-10-26T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-10-26:/words/No-Right-and-Wrong-in-Humanity/<p>人类社会不存在对与错</p><p>读博这几年的生活,我主要是在和各种数学模型、各种具体的形式化的问题打交道。
处理这些问题最大的一个优势就在于,它们是存在明确地对与错的。
模型的好坏,可以用具体在数据上的表现来衡量;具体任务的评价也可以用固定的评价方式来衡量。
处于这样的一个世界,一切都显得很确定。一切问题都可以最终被定性为「好」的和「不好」的,「对的」和「错误」的。
即使有些问题很复杂,但是通过讨论和论证,这些问题最终都会被正确地解决。</p>
<p>可惜的是,我们的世界不仅仅是由物理世界组成的,我们人类自身也是这个世界的一部分。
正如我之前在<a href="http://zhouyichu.com/words/Second-Order-Chaos/">二级混沌系统</a>中所指出的那样,有人存在的地方,本质上是一个二级混沌系统,你永远无法对其作出「对」与「错」的判断,因为不像物理世界,人类世界没有一个独立的,可供参考的模板。
对于人类对人类自身的研究来说,人类同时扮演着观察者和被观察者的角色。
好与坏的定义,也是由人类来决定的。
这样的定义其实毫无意义。</p>
<p>目前的人类社会广泛的接受了天赋人权、自由与民主等理念,人们普遍认为这些理念是「对」的。然而,这些理念真的是「对」的吗?
从来没有有物理定律告诉我们,生命是平等的;也从来没有物理定律告诉我们,民主和自由就是人类政治形态的最「正确」的形式。
它们之所以是「正确」的,是因为人类需要它们是「正确」的。
这一切,说到底都只是人类自身的臆想罢了。</p>
<p>目前人类之所以普遍接受的这些理念,我认为原因有二:</p>
<ol>
<li>人类的生产力发展到了一定的阶段,一个更加民主和自由的社会能够最大化社会产能,最小化内部消耗。</li>
<li>在历史的某些关键节点上,支持这些理念的人赢得了战争,从而将他们的理念推广到了全世界。</li>
</ol>
<p>然而,我认为人类最大的悲哀就在于,会为了这些根本没有正确答案的事情不断内耗,不断消耗本就不多的资源。</p>
<p>对于我个人类来说,我无力改变这个嵌在人类基因中这个自毁的特点。我只能改变自己的思维方式,千万不要把科学思维中对于「对」与「错」的追求带入人类社会。
学会接受人类社会中出现的一切现象,不要盲目地做出「对」与「错」的判断。</p>博客迁移2019-10-19T00:00:00-06:002019-10-19T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-10-19:/words/Upgrade/<p>博客系统迁移</p><p>距离上一次写博文已经已经快1个本月了,这段时间需要处理的事情比较杂,一直没顾得上。
而且,近期我自己的阅读和思考的时间也偏少,没有太多可以写的东西。
现在这些杂事已经考一段落了,在今年接下去的时间里,我会尽量恢复之前每周一文的进度。</p>
<p>在这段没有写作的时间里,其实也不是什么都没干的。
我把我的整个博客写作系统重新进行了改版,从基于JS的<a href="https://hexo.io/">Hexo</a>换到了基于Python的<a href="https://blog.getpelican.com/">Pelican</a>。
其实,这次更新我在很久以前就想开始的了。
其中,最主要的原因就是<a href="https://hexo.io/">Hexo</a>的效率问题。
由于<a href="https://hexo.io/">Hexo</a>不是增量式编译的,每次编译时都要把全部的文件都生成一遍,因此随着博文数量的增加,<a href="https://hexo.io/">Hexo</a>编译一次的时间越来越长。
目前我有260多篇博文,<a href="https://hexo.io/">Hexo</a>编译一次需要超过8分钟,这简直是不能忍的。
我是打算一直将这个自己的博客维护下去的,这么低效的编译是不可接受的。
因此,我打算彻底放弃<a href="https://hexo.io/">Hexo</a>。</p>
<p>经过一番调研之后,我最终选择了基于Python的<a href="https://blog.getpelican.com/">Pelican</a>。
Pelican同样支持markdown语法,而且也是静态博客系统。
我自己也比较熟悉Python,将来如果出现了问题,我还能想办法自己解决。
另外,<a href="https://blog.getpelican.com/">Pelican</a>的一些特性我也是非常喜欢的。
首先,是它的编译速度,同样数量的博文,Hexo需要超过8分钟,而Pelican只需要16秒就能完成编译输出。效率上简直天差地别。
其次,<a href="https://blog.getpelican.com/">Pelican</a>中有一个<a href="https://github.com/cmacmackin/pelican-cite/tree/07c61b42697a1234ca39d6f19c2e6488453383c7">pelican-cite</a>插件,该插件可以在网页博文中模拟出论文引用的格式,作为一个科研工作者,我是非常喜欢这样的特性的。</p>
<p>当然,这样的博文迁移不是没有代价的,可以看到,现在的博客主题和之前比较是属于比较难看的。
另外,目前的博客系统还有一个问题,那就是它目前还不能支持中文的站内搜索。</p>
<p>不过,尽管有些小缺点,但是最主要的效率问题还是解决了。
博客丑就丑一点吧。</p>西方哲学史第九章 信仰和信念 读书笔记2019-08-31T00:00:00-06:002019-08-31T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-31:/reading-list/Filosofihistorie-9/<p>西方哲学史第九章 信仰和信念 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>综述</h1>
<p>本章的主要说明了笛卡尔和维科的思想。
本章的核心是怀疑和信仰。
其中尤其是笛卡尔的思想影响深远,他想要建立的演绎系统也成为了后世的一大哲学流派。</p>
<h1>结构和细部</h1>
<h2>笛卡尔: 有条理的怀疑</h2>
<ul>
<li>在哲学中有无数的冲突,唯一确定的方法是演绎的数学方法</li>
<li>但是,如何为演绎体系找到绝对正确的前提?</li>
<li>有条理的怀疑:把我们在逻辑上有可能怀疑的一切命题过滤掉,从而找到逻辑上无可怀疑的命题. 目的是找到演绎体系的前提</li>
<li>有条理的怀疑的目的不是要怀疑什么是合理的或不合理的,而是确定什么是逻辑上可能怀疑的。</li>
<li>笛卡尔怀疑的过的知识<ul>
<li>传统哲学理论: 过去的哲学家之间有很多冲突的地方</li>
<li>我们的感官: 我们的感官有可能出错,我们感官是否出错的标准是另外一个感官</li>
<li>逻辑论证: 一段逻辑论证的正确与否是靠另外一段逻辑论证,形成循环论证.也就说是,逻辑论证本身也没有坚实的前提。原则上,我们也可以怀疑逻辑论证。</li>
</ul>
</li>
<li>不能怀疑的对象: 怀疑者自身--<strong>我思故我在</strong></li>
</ul>
<p><strong>上帝和唯理论</strong></p>
<p>有效洞见的标准不是经验的支持,而是观念对我们的理性显得清晰而明白</p>
<p><strong>机械论 灵魂与肉体</strong></p>
<p>机械论无法解释我们的经验感官和精神现象。
唯物主义一元论: 霍布斯
心物二元论: 笛卡尔
心物平行轮: 斯宾诺莎</p>
<h2>维科: 一个模式的历史</h2>
<ul>
<li>我们只能对自己创造的东西拥有清晰和确定的知识</li>
<li>自然界是上帝创造的而不是人类,只有上帝才能充分和完整地理解自然界。</li>
<li>我们可以描绘自然过程、阐明物理现象,但是我们绝不可能理解自然为什么会有这样的行为</li>
<li>人文学科和自然学科有着重大的区别, 人文学科中人既是观察者也是参与者(二级混沌系统);而自然科学人仅仅是观察者</li>
<li>我们只有利用移情作用获得对历史的洞见。</li>
<li>维科设法提出一种不同于演绎和归纳的认识论方法。</li>
<li>历史包含了三个主要时期:<ul>
<li>神的时代: 人类对一切自然现象充满敬畏,认为这些都是神谕.政府的形式也是神权政治</li>
<li>英雄的时代: 强大的长老成为氏族的首领。社会分化造成了奴隶制。</li>
<li>人的时代: 被压迫的人意识到贵族和自己没有什么区别,每个人都是平等的。</li>
</ul>
</li>
<li>每个文化和时代都是特别的,第一无二的。新的生活方式比先前的生活方式既不更好,也不更坏,他们只是不同而已。</li>
<li>维科否认存在着绝对的审美原则</li>
</ul>
<h1>评价</h1>
<p>本章的内容终于回到的纯粹的哲学讨论上面了,笛卡尔的思想描述的很多,对他思想的解析也很到位。尤其是对于他怀疑论的产生过程有着详细的描述,让我的理解不仅仅停留在「我思故我在」的片面之上。</p>
<h1>和我的关系</h1>
<p>维科对自然科学和人文科学进行了区分,他认为人类只能对人造物进行完整的理解,大自然是上帝的造物,因此人类无法对自然进行完整的理解。
我不是很同意这个想法。我和他的想法正好相反,正因为我们是观察者,我们的观察结果不会对自然产生扰动,因此我们才能得出正确的结论。
而人文学科中,人类本身既是观察者也是参与者,得出的结论也会作用于观察物本身,使得结论失效。
因此,人文学科才是那个无法被真正理解的事物,而大自然是可以被完全理解的。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月31日写作并发表</li>
</ul>人类的悲哀2019-08-31T00:00:00-06:002019-08-31T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-31:/words/Sadness-of-Humanity/<p>在很多的动漫和文学作品中,经常会表现出这样的思想: 人类是一种邪恶的、需要的被拯救的物种。故事中常常会出现超越人类的存在,来对人类进行灭族。
其实,当年看这些作品的时候,我是真的无法理解为什么作者会思考这样的主题。
同样的,当年阅读「三体」的时候,我也无法理解三体组织中所谓的降临派,为什么会有人希望外星文明来消灭自己的种族呢?</p>
<p>然而,最近的一些思考让我渐渐开始理解这样的思想了<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。
越是思考,越是发现人类的阴阳两面。
对于大的组织来说,行动和口号永远是阴与阳的两面,一面光芒万丈,一面阴暗诡谲。
任何一个组织都会为了自己的私利,而扭曲事实,煽动不明所以的群众。
远的如二十四史,这些史书中又有哪部不是后来的朝代为前代修的?哪一代的历史不会因为政治宣传原因而被扭曲?
近的如现代各国之间的报道,那一国不会为了宣传自己的思想而进行选择性报道?</p>
<p>作为一个小老百姓,我发现我看到的、我听到的东西都是无法百分百的确信。这让我产生了一种无法言说的一种悲哀感,人类真是一种悲哀而又虚伪的生物。</p>
<p>而之所以会发生这样的现象,我认为这不是一个组织、一个人的原因。而是我们人类本身的特点所导致的。在<a href="http://zhouyichu.com/words/Characteristic-of-Human/">人类最显著的特点</a>中就提到过,人类这些令人的讨厌的特质来源于人类特有的生物构造——<strong>思维独立</strong>。</p>
<p>正因为思维独立,所以我们需要交流的媒介,我们需要媒体,我们需要史书 …</p><p>在很多的动漫和文学作品中,经常会表现出这样的思想: 人类是一种邪恶的、需要的被拯救的物种。故事中常常会出现超越人类的存在,来对人类进行灭族。
其实,当年看这些作品的时候,我是真的无法理解为什么作者会思考这样的主题。
同样的,当年阅读「三体」的时候,我也无法理解三体组织中所谓的降临派,为什么会有人希望外星文明来消灭自己的种族呢?</p>
<p>然而,最近的一些思考让我渐渐开始理解这样的思想了<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。
越是思考,越是发现人类的阴阳两面。
对于大的组织来说,行动和口号永远是阴与阳的两面,一面光芒万丈,一面阴暗诡谲。
任何一个组织都会为了自己的私利,而扭曲事实,煽动不明所以的群众。
远的如二十四史,这些史书中又有哪部不是后来的朝代为前代修的?哪一代的历史不会因为政治宣传原因而被扭曲?
近的如现代各国之间的报道,那一国不会为了宣传自己的思想而进行选择性报道?</p>
<p>作为一个小老百姓,我发现我看到的、我听到的东西都是无法百分百的确信。这让我产生了一种无法言说的一种悲哀感,人类真是一种悲哀而又虚伪的生物。</p>
<p>而之所以会发生这样的现象,我认为这不是一个组织、一个人的原因。而是我们人类本身的特点所导致的。在<a href="http://zhouyichu.com/words/Characteristic-of-Human/">人类最显著的特点</a>中就提到过,人类这些令人的讨厌的特质来源于人类特有的生物构造——<strong>思维独立</strong>。</p>
<p>正因为思维独立,所以我们需要交流的媒介,我们需要媒体,我们需要史书。然而,在这个过程中,就可以发生很多人为篡改的事情。为了某个目的,我们可以有意识的修改交流的媒介,可以修改史书,可以选择性报道,可以站在不同的立场进行报道。
而所谓的真相,其实没有真相,只有立场。</p>
<p>三年前,我刚来美国的时候,在饭桌上和一个即将拥有两个博士学位的师兄聊天。我认为随着人类科技的继续发展,当超过一定阈值之后,人类一定能够摆脱各种约束,没有任何自然力量能使人类灭亡。
而这位的师兄的观点是,人类迟早是会灭亡的。
当时如此乐观的我,当然是不会同意这样的观点。
然而,三年之后,我发现这样的设想未必不会成真。
而且人类未必是灭亡于大的自然灾害或者外星文明的攻击,而是毁灭于自己的手中。</p>
<p>人类相互理解沟通的成本太大了,两个种群,两种思想之间的碰撞最终一定会演变为流血冲突,而人类又掌握了越来越强大的核武器。
只要出现一个掌权的疯子,那么人类就完了。
虽然这是小概率事件,然而<a href="https://zh.wikipedia.org/wiki/%E6%91%A9%E8%8F%B2%E5%AE%9A%E7%90%86">墨菲定律</a>告诉我们,再小的概率,终有一天它也会发生。</p>
<p>至此,我发现我对人类的未来感到悲哀。然而,身处其中,没有一个人能改变这个趋势。哪怕是世界上最有权力的人,也无法改变这样的游戏规则。
这样的游戏规律是人类自身的基因所谓决定。
也许人类的最终终点就是灭亡吧。</p>
<h1>更新日志</h1>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>理解不等于同意 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>西方哲学史第八章 文艺复兴与现实政治 读书笔记2019-08-24T00:00:00-06:002019-08-24T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-24:/reading-list/Filosofihistorie-8/<p>西方哲学史第八章 文艺复兴与现实政治 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>综述</h1>
<p>本章的重点在于文艺复兴时期的政治思想。
其中,主要说明了三个人的观点:
- 马基雅弗利
- 约翰 阿尔特湖修斯
- 霍布斯</p>
<h1>结构和细部</h1>
<h2>马基雅弗利: 作为权术的政治</h2>
<ul>
<li>人是自私自利的,人的物欲、权力欲是无限的</li>
<li>好的国家: 在不同的自私利益之间维持平衡的国家</li>
<li>坏的国家: 不同自私利益在其中发生冲突的国际</li>
<li>政治的目的不是好的生活,而是维持稳定, 任何别的东西都是手段——包括道德和宗教</li>
<li>现存的法律和道德并不是绝对和普遍的,而是由统治者建立起来的某种东西</li>
<li>君主的道德核心: 确保社会中的稳定</li>
<li>唯目的论: 目的的正当证明手段的正当。手段是权术性质的,是无关道德的,是超越道德评价的。</li>
</ul>
<h2>基于契约的政治和基于自然法的政治</h2>
<ul>
<li>约翰 阿尔特湖修斯<ul>
<li>契约论: 不同的契约构成了社会上的不同的群体</li>
<li>主权总在人民之中,不在个人会中,而在有机的共同体之中</li>
<li>人民把权力交给国王和官员,其条件是他们信守他们那部分契约</li>
</ul>
</li>
</ul>
<h2>霍布斯: 个人和自保</h2>
<ul>
<li>有必要建立一个可以确保和平与秩序的政府</li>
<li>国家的特点在于所有合法的武力都集于一身。</li>
<li>武力集中于国王还会议会这不重要,重要的是要有一个具有武力的实体行使国家主权</li>
<li>自保是每个人的本能</li>
</ul>
<h1>和我的关系</h1>
<p>本章介绍的这三个人有着自己不同的政治思想。
他们之所以形成他们的思想主要还是要和他们生存的时代背景相关。
这一章,给我的启发包括以下几点:
1. 一个人无论多伟大,总是被他所处的时代所限制
2. 主义、人权等都是口号而已,真正重要的,也是唯一的目标是保持社会稳定和发展。</p>一个国家,一种思想2019-08-24T00:00:00-06:002019-08-24T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-24:/words/One-Country-One-Thought/<p>中国的政治模式始终没有变过,一直都是「一个国家,一种思想」的模式。</p><p>最近一段时间,一直在阅读黄仁宇的「万历十五年」。
这真是一本被严重低估的书。
再次翻开它的时候,都能让我加深对这个世界的理解。</p>
<p>曾经觉得中国一直是一个政教分离的国家,不管是古代还是现代。
宗教在中国的政治影响力总是很小的。
然而,仔细阅读「万历十五年」之后,渐渐发现,中国自古以来不仅仅是一个政教合一的国家,而且政教结合的太过紧密,以至于让我们都以为中国的政治只有政治。</p>
<p>这里所说的教,未必是一种特定的宗教,而是中国古人所发明的一整套礼仪规范。
每一代王朝都会采用孔孟之道作为统治思想,所有官吏选拔制度都是基于此的。
中国古代所有的知识分子都是在类似的思想框架下成长起来的,笃行孔孟之道。
这难道不也是一种宗教吗?</p>
<p>原来我对这种以「礼」治天下的方式是嗤之以鼻的,总觉得这是一种很可笑的整理方式。
然而,「万历十五年」告诉我,这是治理一个庞大帝国不得不采取的方式。
中央政府在古代的通信手段下,其实对地方的掌控能力是微乎其微的,一切都要靠地方管理来治理。
中央政府不可能与闻地方上的一切事物。
那么中央政府该如何管理庞大的帝国呢?
中央政府能抓住的点只有礼仪,通过礼仪使得地方官吏和中央政府保持一致。
而皇帝的任务就是保证整个文官体系运作正常,利用礼仪管理手下的各种官吏。
历史已经证明,这套体系虽然低效,但是却能用来有效管理一个庞大的帝国。</p>
<p>回过头来看看现代的中国政治。
现代中国的管理的模式,其实依然没有跳出这样框架。
只不过现在的统治工具从「礼仪」变成了「社会主义」。
其统治模式一直都没有变过,抓住一种思想要点,就抓住了全国的统治基础。
至于这种所谓的「思想基础」是什么,其实无关紧要。重要的是,需要一种统一的思想来维持国家的稳定和发展。哪怕这种思想仅仅只会在一个理想社会中成为现实。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月24日写作并发表</li>
</ul>制度在人2019-08-17T00:00:00-06:002019-08-17T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-17:/words/What-Matters-Is-the-People/<p>制度、主义真没有什么大的差别。 所谓自由、人权都是口号而已。 他们只是被人们推到前台的遮羞布。 真正决定性因素还是在于执行的人。</p><p>最近的发生的一系列事情让人很痛心,我不禁在想,这个世界到底是怎么了。</p>
<ul>
<li>香港的和平抗议游行演变为了暴力冲突,而且还在不断升级中.那些抗议的年轻愤青们只是干扰正常的公共秩序。更加令人可笑的是,他们的标语中竟然还有着不少的错别字……</li>
<li>美国连续发生了三起大规模枪击案,而特朗普政府选择的措施却是下架射击游戏,而不是加强枪支管理。</li>
<li>美国富豪爱泼斯坦离奇死在狱中,明眼人一看就知道绝对是被人灭口的。</li>
</ul>
<p>我发现,我曾经认为是美好制度的自由主义其实不过如此。
后来,我突然明白了,其实这些所谓的制度、所谓的意识形态都只是工具而已,真正重要的是执行的人。</p>
<p>就在几年前,我还是一直认为,自由主义总比集体主义要更优越,至少在当前的时代背景,自由主义能加能促进快速发展。
然而,在美国生活得越久,越是发现,自由过了头也绝不是什么好事情。</p>
<p>就拿美国的枪支管理举例,在连续三次大规模枪击事件之后,美国民众开始大规模购枪防身,他们已经不再信任警察了。
而特朗普政府却把锅甩到了射击类游戏上面,而不是过于宽松的枪支管理条例。
难道他们看不出来民众大规模囤枪是一种恶性循环吗?枪支越多,发生大规模枪击案的概率越大。
他们绝不是白痴,连我都能看得出来的事情,他们却看不到?
大家都知道,这背后都是美国强制协会的影响。他们打着自由主义的旗帜,其实只是不想自己的利益受到损害。
我不是一个禁枪主义者,但是至少我认为当下合理的措施应该是加强枪支的管理,而不是甩锅到游戏上面。</p>
<p>「未来简史」中曾经提到,冷战之后似乎是自由主义的胜利。然而这是真的吗?这足以说明自由主义的优越性了吗?
这也许还存在着另外一种可能性,那就是前苏联的制度太过落后,显得所谓的自由主义很强大。
对手太弱,反而显得自己很强大。</p>
<p>黄仁宇在「万历十五年」中其实就进行分析了。</p>
<blockquote>
<p>他把人们口头上公认的理想称为"阳", 而把人们不能告人的私欲称为"阴"</p>
</blockquote>
<p>他的这一句话点出所有制度、所有主义的本质。
这个世界永远存在着两套规则,一套是明面的,一套的私下的。
而真正左右着世界的,其实是那一套私下的,不可能明说的"阴"。
自由主义就是美国的"明",而枪支协会的私利就是不可明说的"阴".</p>
<p>古今中外,莫不如是。</p>
<p>所以,其实制度、主义真没有什么大的差别。
所谓自由、人权都是口号而已。
他们只是被人们推到前台的遮羞布。
真正决定性因素还是在于执行的人。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月17日写作并发表</li>
</ul>人类最显著的特点2019-08-10T00:00:00-06:002019-08-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-10:/words/Characteristic-of-Human/<p>在看了那么多有关外星人的科幻小说之后,我一直在思考,人类文明的发展模式到底只是一种特殊情况,还是所有可能出现的文明中的一种普遍情况。</p><p>在看了那么多有关外星人的科幻小说之后,我一直在思考,人类文明的发展模式到底只是一种特殊情况,还是所有可能出现的文明中的一种普遍情况。</p>
<p>我之所以会思考这个问题,是因为在上一篇博文<a href="http://zhouyichu.com/words/Explore/">探索</a>中,我提到,人类社会因为其自身的发展模式的特点,无法集中全部的资源向外探索。
那时候,我就在思考,是什么样的特点,使得人类文明形成了现在的这个样子。</p>
<p>目前来说,我倾向于人类只是一种特殊情况。为什么?因为人类目前为止尚未发现任何一种外星种族,我们对未知的情况做出最坏的假设是最保险的做法。</p>
<p>人类文明最可能的特殊之处可能是:
<strong>每个个体的思维是独立的</strong></p>
<p>这个特点一直在我的脑海中徘徊,这点也许是人类文明繁荣的重要因素,但也可能是人类灭亡的原因。</p>
<p>说它们是人类文明繁荣的重要因素是因为,正因为每个个体都是独立的,拥有自己的独一无二的思想,人类文明的科技、艺术才能有那么快的发展。
许多不同思想之间的碰撞才能在短时间内探索出大自然的秘密,掌握科技的力量。</p>
<p>但是,也正因为每个个体的思维是独立的,当个体数量增长大一个非常巨大的量的时候,沟通的成本开始飞快的增长。
我们需要成立政府、成立各式各样的机构来管理每个个体都有自己想法的庞大群体;我们需要制定规则、道德、法律来维持群体的运转;我们还需要消耗大量的资源来消除群体内部发生的各种矛盾,比如战争。</p>
<p>在<a href="http://zhouyichu.com/words/Explore/">探索</a>中我就指出,作为一个文明整体,它的最佳策略应该是尽快的向外探索,占领更多的资源。
然而,因为人类本身个体思维独立的特点,我们资源的使用效率变得极其低下,无法最大效能的使用资源向外探索.
但我们真正掌握超空间技术向外探索的时候,也许宇宙已经被另外一种思维不独立但能够集中利用资源的种族占领了。</p>
<p>盐野七生在她的「罗马人的故事」中,曾经写到:</p>
<blockquote>
<p>没有自由,就没有发展;没有秩序,就没有可持续的发展</p>
</blockquote>
<p>虽然这句话是描述政治形态的,但是放在我们这个话题上也是很合适的。</p>
<p>尽管的独立的思维能够激发科技、文化的快速发展,但是独立的思维也难以为继可持续的发展。
对于政治来说,我们可以通过更改政府体制来解决问题;但是,对于人类文明来说,似乎这是一个误解的问题。</p>
<p>我们从一开始就在演化的路径上选择这一条分支,不管未来是征服宇宙还是被其他文明征服,我都只能在这条道路上一直走下去。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月10日写作并发表</li>
</ul>探索2019-08-10T00:00:00-06:002019-08-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-10:/words/Explore/<p>向外探索不仅仅是为了开拓,更是为了生存。</p><p>前几天在Youtube上面看到了一个关于小说「黄金原野」的解说视频。
老实说,很有感慨。</p>
<p>故事讲述了一对父女通过他们自己的生命,引导全人类探索太空,走出地球。
可惜,类似的事情会在现实中绝不会发生。
当权者绝不会花费那么多的资源,仅仅是为了救助一个普通的生命的。
但是,故事中向外探索的理念是我非常认可的。
<strong>不断向外探索,才是保持生存的最佳方式。</strong></p>
<p>在我们平时玩一些即时战略或者策略类游戏,很多情况下,这一类游戏都是有战争迷雾的,也就是说玩家一开始是看不到整体地图,也看不到敌人在哪的。
玩家需要不断向外探索,探明地图,探明资源,才能展开发展自己。
我觉得人类文明其实面对着同样的问题。</p>
<p>我们不能局限在一个小小的行星之上,宇宙那么大,一定存在着其他的外星文明。
如果不能快速向外探索,当其他星球杯其他外星文明占领的时候,人类只能被锁死在地球上,慢慢老去而死亡。</p>
<p>阿西莫夫曾经在他的「永恒的终结」的小说中,也表达过类似的思想。在他的小说中,人类文明点错了科技树,花费了上百万的时间,才发展出了超空间技术,开始向外探索。
结果,在那个时候,其他外星种族已经殖民了大部分的星球,人类在宇宙中已无立锥之地。最终被锁死在地球上.</p>
<p>如果把一个智慧种族看成是一个单一的个体,它最佳的生存策略就应该是不断向外探索,拓展自己的行动范围,最大程度的将自己的种族洒遍整个宇宙。</p>
<p>回过头看看人类的历史,其实也遵循着同样的规律。那些故步自封停止向外探索或者还未来得及向外探索的文明,最终都被其他向外探索的文明所征服,有些甚至整个种族被屠灭了。
尽管历史一再告诉我们这个道理,然而人类文明的发展从来不是以向外探索作为第一推动力发展的。
即使是在地理大发现时代,那也只是欧洲殖民者渴望黄金、渴望香料,渴望财富的驱动力下发展起来的。</p>
<p>在现代,当人类已经充分占领了地球之后,人们的注意力依然是如何提高GDP,提高自己的财富。地球已经被探索完成了,探索过程也就停止了。
其实没有多少人真正着眼于未来,着眼于探索未知。</p>
<p>作为一个文明整体,真正理性的做法应该是集中全部的资源向外探索,尽快离开地球,将自己的文明洒遍整个宇宙。
然而,由于人类文明本身的诸多限制,人类社会几乎是不可能投入大量资源去开发短期内无法产生回报的事业的。
说到底,贪心策略依然是人类根深蒂固的一种策略。
所以,在这个角度上,我是非常佩服Elon Musk的,他是那种少有的高瞻远瞩型,且富有行动力的人。</p>
<p>我写这篇文章并不是想说明人类是多么的不堪,多么没有前瞻性。
人类社会的发展模式自有其道理。
我只想通过这篇文章指出,我们不应该完全忽略向外探索的尝试。</p>
<p><strong>向外探索不仅仅是为了开拓,更是为了生存。</strong></p>
<h1>更新日志</h1>
<p>2019年8月10日写作并发表</p>西方哲学史第七章 自然科学的兴起 读书笔记2019-08-10T00:00:00-06:002019-08-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-10:/reading-list/Filosofihistorie-7/<p>西方哲学史第七章 自然科学的兴起 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>综述</h1>
<p>本章主要表述了文艺复兴时期各个学科的发展是如何影响哲学思想的。
其中的代表人物包括了个哥白尼、伽利略、牛顿等人。</p>
<h1>结构和细部</h1>
<h2>方法之争</h2>
<ul>
<li>十七世纪末,古典力学,这个各门实验科学的基础,被建立起来了。此时有三种思想活动:<ul>
<li>神学</li>
<li>哲学</li>
<li>自然科学</li>
</ul>
</li>
<li>演绎推理: 从某些前提触发,借助于某些演绎规则而达到被证明的命题<ul>
<li>并不能带来新知识</li>
</ul>
</li>
<li>归纳: 通过对特殊情况的有限观察,得出一般性的结论<ul>
<li>可能被拨到,但永远不能被完全确认</li>
</ul>
</li>
<li>假设-演绎法: 假说、演绎推理和观察的一种动态结合。
<img alt="reasoning" src="http://zhouyichu.com/images/reasoning.png"/><ul>
<li>假设: 通常用数学语言来表达,这是超越归纳的事情。</li>
<li>演绎出如果假设为真,就必定为真的那些命题</li>
<li>检验演绎出的命题是否为真, 演绎是演绎的一部分</li>
<li>如果一个假设得到充分的检验,而这些检验并不能否认这个假设,那它就成为一个理论</li>
<li>未来的观察将否认这个理论的可能性始终存在</li>
<li>研究过程成为一个永无止尽的螺旋</li>
</ul>
</li>
</ul>
<h2>天文学--哥白尼和开普勒</h2>
<ul>
<li>
<p>三种不同的经验</p>
<ul>
<li>一个人借助其亲身经验而发生的成长和教育<ul>
<li>儿童学习社会化的过程</li>
</ul>
</li>
<li>在科学中的系统观察的形式</li>
<li>设计一些实验进行观察,控制可变条件</li>
</ul>
</li>
<li>
<p>哥白尼和日心体系</p>
<ul>
<li>改变了人们的思维模式,让人们得以从中心以外的角度来观察宇宙</li>
</ul>
</li>
<li>开普勒和行星轨道<ul>
<li>开普勒希望寻找力学证明来解释行星轨道</li>
</ul>
</li>
</ul>
<h2>物理学--伽利略和牛顿</h2>
<ul>
<li>调和新的天文学理论和圣经<ul>
<li>通融理论: 圣经的语言和表述是经过通融以适应简单的无知的人们的需要</li>
<li>圣经永远不错,但是对圣经的诠释有可能是错的</li>
<li>伽利略认为科学理论应该成为我们诠释圣经的工具。</li>
</ul>
</li>
<li>伽利略<ul>
<li>唯理论者</li>
<li>对亚里士多德宇宙的结构和对旧的目的论自然观的消解</li>
<li>强调任何关于自然界提出的问题都必须用数学语言来表达</li>
</ul>
</li>
</ul>
<h2>作为主体的人</h2>
<ul>
<li>日心说还地心说?也许只是选取的坐标原点不同而已<ul>
<li>同一批观察数据,也许有多个理论可以解释</li>
<li>理论之间不一定是互斥的。</li>
<li>地心说--> 日心说, 不是对先前理论的证伪,而是一种「范式转换」,一种视角和前提的转换。</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>本章的内容比较简单,通过对各个学科发展的具体说明来阐述科学进步对哲学思想的改变。
其中的部分内容都是我之前自己思考过或者阅读过的内容。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月10日写作并发表</li>
</ul>歧视2019-08-03T00:00:00-06:002019-08-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-03:/words/Discrimination/<p>歧视这个问题在美国是一个令人「谈虎色变」的问题。
为了理解「歧视」这个问题的本质是什么,我还特意去查了一下关于「歧视」的定义,</p>
<p>维基百科上面总结的一个简化定义是:</p>
<blockquote>
<p>以多数代表全部,而忽略非多数者特质</p>
</blockquote>
<p>当我看到这个定义的时候,不禁在想,这难道不是每个人每天都在做的事情吗?
比如:</p>
<ul>
<li>以貌取人</li>
<li>HR找人按学历划标准</li>
</ul>
<p>我们人类的大脑天生就带有自动归纳、简化世界的被动能力。
正是这个能力才让我们能够处理这个复杂的世界。
然而,一旦这个能力能被运用在人的身上的时候,我们就出现了「歧视」。
我个人将其总结为: 归纳法+信息不完全=歧视</p>
<p>首先是归纳法。我们经常会在媒体上或生活中看到有关某一特定族群的报道,比如:</p>
<ul>
<li>黑帮成员大部分都是黑人</li>
<li>黑人的受教育水平比其他族群低</li>
<li>黑人从事科研工作的比例比较少</li>
</ul>
<p>因此,我们大脑在不知不觉中就会将这些信息<strong>归纳</strong>为「黑人都是不受教于的暴力分子」.</p>
<p>然后,当我们遇到一个黑人的时候,由于我们完全不了解这个人的背景信息,也就是说,我们的<strong>信息不完全</strong>。
而这个人最大的特征就是「黑」,因此我们的大脑自然而然就会将之前得出的结论应用到这个人身上。</p>
<p>这是一个普通人产生 …</p><p>歧视这个问题在美国是一个令人「谈虎色变」的问题。
为了理解「歧视」这个问题的本质是什么,我还特意去查了一下关于「歧视」的定义,</p>
<p>维基百科上面总结的一个简化定义是:</p>
<blockquote>
<p>以多数代表全部,而忽略非多数者特质</p>
</blockquote>
<p>当我看到这个定义的时候,不禁在想,这难道不是每个人每天都在做的事情吗?
比如:</p>
<ul>
<li>以貌取人</li>
<li>HR找人按学历划标准</li>
</ul>
<p>我们人类的大脑天生就带有自动归纳、简化世界的被动能力。
正是这个能力才让我们能够处理这个复杂的世界。
然而,一旦这个能力能被运用在人的身上的时候,我们就出现了「歧视」。
我个人将其总结为: 归纳法+信息不完全=歧视</p>
<p>首先是归纳法。我们经常会在媒体上或生活中看到有关某一特定族群的报道,比如:</p>
<ul>
<li>黑帮成员大部分都是黑人</li>
<li>黑人的受教育水平比其他族群低</li>
<li>黑人从事科研工作的比例比较少</li>
</ul>
<p>因此,我们大脑在不知不觉中就会将这些信息<strong>归纳</strong>为「黑人都是不受教于的暴力分子」.</p>
<p>然后,当我们遇到一个黑人的时候,由于我们完全不了解这个人的背景信息,也就是说,我们的<strong>信息不完全</strong>。
而这个人最大的特征就是「黑」,因此我们的大脑自然而然就会将之前得出的结论应用到这个人身上。</p>
<p>这是一个普通人产生「歧视」的基本过程。</p>
<p>其实,他本身也许没有任何歧视的思想,但是因为「信息不完全」,我只能调用我所有相关的背景知识,而相关的背景知识就是「黑人很坏很暴力」这样一个简单的结论。</p>
<p>那么,我们该如何破除这样的结论呢?</p>
<p>其他人都说,我们要独立的评价一个人,不能因为一些固有的印象影响对一个人的判断。
然而,这其实也是有成本的.
假如我遇到的人确实是属于那一类「很坏很暴力」的那一类,而我也因此受到了伤害,那么我该如何想呢?
我本将心向明月,怎奈明月照沟渠。</p>
<p>因此,我也没啥好的办法,我只能说应该两个方面都要有所进步。
被歧视的族权要努力改变其他人的印象,作为其他人要尽量做到独立判断一个人,不要因为刻板印象做出判断。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月3日写作并发表</li>
</ul>西方哲学史第六章 中世纪 读书笔记2019-08-03T00:00:00-06:002019-08-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-08-03:/words/Filosofihistorie-6/<p>西方哲学史第六章 中世纪 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>综述</h1>
<p>本章的主题是中世纪的哲学发展。
我怀着极大的热情开始阅读本章,结果被其中深奥晦涩的内容虐的体无完肤。
从本章内容中,我也认识到,西方人的傲慢、自我主义统统都是来源于基督教。
一神论、线性历史观等思想已经深入现代西方社会。
而这一切,都是来源于中世纪的哲学。</p>
<h1>结构和细部</h1>
<h2>基督教和哲学</h2>
<p>公元400年,日耳曼部落入侵罗马帝国,古代时期结束而中世纪时期开始。</p>
<p>基督教的感召是面向每个人的。它向每个人都宣示了希望。
在生活的终点,我们此世生活的苦难和不公会受到补偿。</p>
<p>基督教在传教过程中,有两种策略:
1. 天主教: 承认哲学传统也是由上帝创造的,基督徒需要对这个传统做正面的回应,而不能惧怕借助于哲学来表达基督教信仰。
2. 新教: 基督教就是真理,只有「圣经」才是真理,这个真理切不可被希腊哲学那样的异教传统所玷污。</p>
<p>第一种策略最终演变成了基督教神学,才成为基督教的护教学。
神学大约在公元300年到1200年之间占有主导地位,覆盖了中世纪的大部分时期。</p>
<p>基督教为哲学环境和思想环境注入了如下的新观点:
1. 一种以人类为中心的人类观
2. 一种线性的历史观
3. 一种把上帝当做一个位格和一个造物主的上帝观</p>
<p>希望哲学们多数把人类看做是天地中诸多造物中的一种,人当然是一种高级的造物,但是仍然不具有第一无二的地位。
但是,在基督教眼中,情况就不同了: 上帝是一个存在于这个世界之外的位格,而这个世界则是上帝为了人类能够被拯救而创造出来的。
宇宙相对于人和上帝来说是次要的。宇宙万物所围绕的中心,是人类在地球上为拯救而进行的斗争。
无论是从宇宙的角度还是价值论的角度,人类都是处于中心的地位。</p>
<h2>教皇和国王</h2>
<p>中世纪的主要治理制度是各种形式的封建制度。
从4世纪开始,世俗的王权和教会的权利彼此交织,逐步发展。
教会具有伦理诠释和宗教诠释的权力,人民因此就有了某个论坛对世俗统治者进行一种合法的批判。
中世纪的人民,因此被两个权威所统治。</p>
<h2>奥古斯丁: 信仰与理性</h2>
<ul>
<li>将基督教和新柏拉图主义结合在一起</li>
<li>人是万物的中心</li>
<li>人类需要上帝的指引才能找到幸福</li>
<li>灵魂是人之中的神性,而肉体则是罪恶之源。</li>
<li>统治者的权威并不是来自人民,而是来自上帝,公民有义务服从这些统治者,就像服从上帝一样。</li>
</ul>
<p><strong>驳斥怀疑论</strong></p>
<p>奥古斯丁驳斥怀疑论,他认为我们能够在一下四个领域找到确定的知识:
1. 怀疑:我们不能怀疑我们的怀疑,因为不能怀疑我们自己的存在。(这和笛卡尔的我思故我在非常相近)
2. 内省:不仅仅是我们怀疑的时候,我们在认识其他一切事物的时候,都能够主张我自己是拥有确定的知识的。
3. 数学:数学。
4. 逻辑:确定的逻辑原则也是无法被怀疑的。</p>
<p><strong>奥古斯丁哲学的核心</strong>: 个人灵魂及其精神生活比外部可感的事物更高级、更高贵,而纯粹的数学和逻辑形式,具有更高的地位。
我们内在的生活和纯粹形式就是宇宙中最本质、最实在的东西。
这可以作为信仰上帝的世俗理论支持。</p>
<p>古希腊人: 理智优先于意志
奥古斯丁: 意志优先于理性</p>
<p>奥古斯都的前定论: 所发生的任何事情都是由上帝前定了的。</p>
<h2>共相问题</h2>
<p>关键问题:
在多大程度上共相存在着:
- 共相是实在的人——实在论者
- 共相并不存在、仅仅是名称——唯名论者: 概念存在于个人的意识之中,但不是作为任何独立于个人意识的东西</p>
<p>柏拉图: 极端的实在论者。理性论认为理性的世界优先于现实世界存在
亚里士多德主张,共相存在于特殊事物之中。</p>
<p>经院哲学的三个时期:
1. 早期:从奥古斯都到1200年前后。
2. 鼎盛时期: 1200年前后到14世纪初期
3. 后期: 14世纪初到文艺复兴</p>
<h2>托马斯阿奎那: 调和与综合</h2>
<p>托马斯将亚里士多德的思想和基督教调和在了一起。
- 理性和信仰有一部分是重合的
- 基督徒高于非基督徒之处,在于通过启示而认识神法</p>
<h2>帕多瓦的马西略和奥卡姆的威廉: 从综合到怀疑论</h2>
<p>马西略:
- 社会是独立于教会的。
- 挑战了教会的权威,教会只是各种社会团体中的一个,不应该具有超然的地位
- 信仰和理性是分离的</p>
<h2>马丁路德: 意志主义和唯名论</h2>
<ul>
<li>信仰高于理性</li>
<li>两个政权都是上帝创建的:<ul>
<li>世俗政权: 为了维持社会中的公义和秩序,运用的是剑</li>
<li>宗教政权: 诉诸臣民和统治者两方面的良心,运用的是言语</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>阅读这一章的内容是我最痛苦的阅读体验,中世纪的很多思想在今天看来是多么的无知。
阅读完整章之后,我发现中世纪的哲学家就是典型的「拿着锤子,看啥都像钉子」。
他们努力协调各方的思想,包括古希腊哲学、理性主义等,想法设法地将这些思想融入进基督教的体系中,从而证实基督教就是真理。
西方人的自我为中心,自大的历史传统也许就是从基督教中来的。</p>
<h1>更新日志</h1>
<ul>
<li>2019年8月3日写作并发表</li>
</ul>「罗马人的故事1」读书笔记2019-07-31T21:01:16-06:002019-07-31T21:01:16-06:00Flyawaytag:zhouyichu.com,2019-07-31:/reading-list/Stories-of-the-Romans-1/<p>「罗马人的故事1」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">罗马人的故事 1</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">盐野七生</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2011-12</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787508630250</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<ul>
<li>向宗教寻求纠正人类行为准则的是犹太人</li>
<li>向哲学寻求纠正人类行为准备的是希腊人</li>
<li>向法律寻求纠正人类行为准备的是罗马人</li>
</ul>
<p>自由和秩序的并存,是人类永恒的课题之一
没有自由,就没有发展;没有秩序,也得不到持续的发展</p>
<p>善于从失败中学习,并在此基础上挣脱已有观念的束缚,提高自己,然后再重新站起来。</p>
</blockquote>
<h1>综述</h1>
<p>本书是「罗马人的故事」系列的第一册,详细介绍了罗马的从建国到统一意大利半岛的发展历程。
整个过程花费了500年的时间。</p>
<h1>结构和细部</h1>
<h2>王政时代: 国王终身制、不世袭、选举产生</h2>
<ul>
<li>罗慕路斯<ul>
<li>第一任国王</li>
<li>建立罗马</li>
<li>吞并萨宾</li>
</ul>
</li>
<li>努马<ul>
<li>第二任国王</li>
<li>终止战争</li>
<li>职业分工,建立工会</li>
<li>修改历法: 一年355天</li>
<li>宗教改革: 给神确立等级制度,确立政教分离的制度</li>
</ul>
</li>
<li>
<p>托里斯 奥斯蒂吕斯</p>
<ul>
<li>第三任国王</li>
<li>对外征战</li>
<li>对外扩张</li>
<li>征服同化阿鲁巴</li>
</ul>
</li>
<li>
<p>安库斯</p>
<ul>
<li>第四任国王</li>
<li>架起了台伯河上第一座桥梁</li>
<li>征服了台伯河河口的奥斯提亚,罗马直接和地中海连同</li>
<li>发展制盐业,提供了货币(盐)</li>
</ul>
</li>
<li>
<p>塔克文 普利库斯</p>
<ul>
<li>第五任国王</li>
<li>增加元老院人数: 100--> 200</li>
<li>排水开垦</li>
<li>被暗杀</li>
</ul>
</li>
<li>
<p>塞尔维乌斯 图里乌斯</p>
<ul>
<li>第六任国王</li>
<li>建造罗马城墙</li>
<li>制度改革,第一次人口普查</li>
</ul>
</li>
<li>
<p>塔克文</p>
<ul>
<li>第七任国王</li>
<li>暗杀前一任上台</li>
<li>被放逐</li>
<li>结束了王政时期</li>
</ul>
</li>
</ul>
<h2>共和时代</h2>
<p>共和时代: 执政官由市民大会选出,任期一年</p>
<ul>
<li>共和政体的创始人: 布鲁特斯</li>
<li>派出考察团前往希腊学习法制</li>
</ul>
<h2>希腊文明</h2>
<ul>
<li>起源于克里特岛,因为克里特岛比希腊更加接近于埃及。</li>
<li>克里特衰落以后,进入迈锡尼文明</li>
<li>多利亚人侵略,灭绝了迈锡尼文明</li>
<li>公元前800年左右,开始出现城邦国家,并开始想外殖民</li>
<li>殖民运动分为两个时期<ul>
<li>公元前9世纪末到前8世纪初,殖民对象主要是小亚细亚西岸</li>
<li>公元前8世纪中叶前后,殖民扩展到整个地中海</li>
</ul>
</li>
<li>希腊的殖民城市与宗主国之间联系非常松散</li>
</ul>
<h3>雅典</h3>
<ul>
<li>与公元前8世纪前后改为贵族政体</li>
<li>梭伦改革: 个人权利和所拥有的不动产成正比</li>
<li>庇西特拉图独裁统治雅典</li>
<li>克利斯梯尼再次进行了政治改革<ul>
<li>将雅典按照区域进行划分</li>
<li>一人一票制</li>
<li>组建内阁</li>
<li>陶片放逐法</li>
<li>直接民主政治</li>
</ul>
</li>
<li>雅典确立了人类史上第一个民主政体,一直延续到公元前5世纪。</li>
</ul>
<h3>斯巴达</h3>
<ul>
<li>种姓制: 斯巴达人-皮里阿西人-希洛人;人口比例1:7:16</li>
<li>两位国王,分别由两家名门望族世袭</li>
<li>军事国家、封闭。</li>
</ul>
<h2>共和时代的摸索</h2>
<ul>
<li>十二铜表法</li>
<li>保护人与被保护人的关系</li>
</ul>
<h2>凯尔特人入侵</h2>
<ul>
<li>凯尔特人占领罗马七个月</li>
<li>政治改革,「李锡尼发」:<ul>
<li>废除六人军事指挥政体,恢复二人执政官制度</li>
<li>共和国政府所有要职向平民开放</li>
</ul>
</li>
</ul>
<h2>罗马的政体</h2>
<ul>
<li>按收入的多少纳税</li>
<li>投票以百人队为单位</li>
<li>官职<ul>
<li>执政官<ul>
<li>每年选举</li>
<li>任期一年</li>
<li>最低年龄40岁</li>
</ul>
</li>
<li>独裁官</li>
<li>法务官</li>
<li>财务检察官</li>
<li>财务官</li>
<li>按察官</li>
<li>护民官</li>
</ul>
</li>
</ul>
<h2>罗马联盟</h2>
<p>五类国家:
- 罗马
- 旧拉丁同盟加盟国: 完全的平等的罗马市民权
- 自治城市: 无投票权的罗马市民权
- 殖民地: 战略要塞,完全平等的罗马市民权
- 同盟国: 完全自治,只需要提供兵力</p>
<p>虽然对不同的同盟国进行划分,可以有效降低他们相互联合的可能,利于稳定统治。
但是这也导致指挥系统效率低下,军队行动不够敏捷。</p>
<h1>评价</h1>
<p>这是整个系列书籍的第一册,基本算是罗马的「史前时代」。
他们从一开始就没有形成「家天下」的传统,而是以市民权为基础。
所有的重要职位,包括国王都是通过选举产生。</p>
<h1>更新日志</h1>
<ul>
<li>2019年7月31日写作并发表</li>
</ul>两条新闻2019-07-20T00:00:00-06:002019-07-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-20:/words/Two-News/<p>最近看到了两条新闻,比较有感触,想要写点什么。</p>
<p>第一条新闻是关于章莹颖案的,经过了两年的漫长审理,现在终于尘埃落定。凶手被判了无期,这是意料之中的。虽然我很期待能有个死刑的判决,但是这在美国几乎是微乎其微的概率。
相反,无期就意味着竖着进去,横着出来。
网上已经有人做过分析了,其实对于美国的国情来说,终身监禁要比死刑更好。</p>
<p>但是,在追踪整个案子的过程中,我确实有点无法理解美国人的思维逻辑。
在最后的量刑阶段,凶手的辩护律师竟然请出了凶手的父母、邻居、同学来证明凶手平时是一个和蔼可亲的,只是因为一个悲惨的同年才造成了他精神上的不稳定,以此来请求陪审团不要判死刑。
我至今无法理解其中的逻辑是什么。
一个人精神不稳定,会对其他社会成员造成危害。不管他精神不稳定的原因是什么,为了其他人的人生安全,难道不应该尽快处理吗?</p>
<p>美国人号称是一个讲人权、讲自由的地方,然而所谓的人权、自由却被滥用在了这种地方。
老实说,就这个案子来说,我觉得纯粹是浪费了大量资源去审理一个非常简单的问题。</p>
<p>当然,我相信美国的人权和自由也有其良好的一面,不然美国也不可能称霸世界那么多年。</p>
<p>第二条新闻是关于法国的非法移民事件。
500多名来自其他国家的难民占领了法国的戴高乐机场,打出了「法国不止属于法国人」的口号。
老实说,看到这条新闻的时候,我差点笑出声来。
这群人脑回路实在是清奇啊 …</p><p>最近看到了两条新闻,比较有感触,想要写点什么。</p>
<p>第一条新闻是关于章莹颖案的,经过了两年的漫长审理,现在终于尘埃落定。凶手被判了无期,这是意料之中的。虽然我很期待能有个死刑的判决,但是这在美国几乎是微乎其微的概率。
相反,无期就意味着竖着进去,横着出来。
网上已经有人做过分析了,其实对于美国的国情来说,终身监禁要比死刑更好。</p>
<p>但是,在追踪整个案子的过程中,我确实有点无法理解美国人的思维逻辑。
在最后的量刑阶段,凶手的辩护律师竟然请出了凶手的父母、邻居、同学来证明凶手平时是一个和蔼可亲的,只是因为一个悲惨的同年才造成了他精神上的不稳定,以此来请求陪审团不要判死刑。
我至今无法理解其中的逻辑是什么。
一个人精神不稳定,会对其他社会成员造成危害。不管他精神不稳定的原因是什么,为了其他人的人生安全,难道不应该尽快处理吗?</p>
<p>美国人号称是一个讲人权、讲自由的地方,然而所谓的人权、自由却被滥用在了这种地方。
老实说,就这个案子来说,我觉得纯粹是浪费了大量资源去审理一个非常简单的问题。</p>
<p>当然,我相信美国的人权和自由也有其良好的一面,不然美国也不可能称霸世界那么多年。</p>
<p>第二条新闻是关于法国的非法移民事件。
500多名来自其他国家的难民占领了法国的戴高乐机场,打出了「法国不止属于法国人」的口号。
老实说,看到这条新闻的时候,我差点笑出声来。
这群人脑回路实在是清奇啊,法国不是法国人的,还能是谁的?
虽然这么讲可能不人道,但是这件事不就是一群流氓跑到人家家里,然后非要来住下来不可吗?</p>
<p>可是,当我坐下来仔细思考这个问题的时候,其实这个问题一点都不好笑。
这是一个关于生存的问题。
这些非法移民如果不是迫不得已,也不会变成非法移民。他们要求的也许只是一片生存空间。
但是,当他们要求自己的生存空间的时候,却挤压了别人的生存空间。</p>
<p>这个时候,我意识到,自己属于一个强大的国家是一件多么重要的事情。作为一个出生于现代的中国人,我是幸运的。这个时代的中国正在快速崛起,我们赶上了一个好时代。
想象150年前的中国人,在其他国家的人眼中,我们这些黄皮肤、黑眼睛的人不就和今天这些非法移民一样吗?
从一个落后的地方来到一个繁华的地方,仅仅是为了生存下去。</p>
<p>这是一个无解的问题,至少到现在为止,我还没有发现什么好的解决方案。
我只能庆幸,现代中国是一个强大的国家。</p>
<h1>更新日志</h1>
<ul>
<li>2019年7月20日写作并发表</li>
</ul>论法不诛心2019-07-13T00:00:00-06:002019-07-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-13:/words/Crime/<p>上一篇博文<a href="http://zhouyichu.com/words/Violence/">暴力</a>中,我谈论了关于「暴力」的话题。这篇博文,我想说说我关于犯罪的想法。</p>
<h1>犯罪行为没有好坏之分</h1>
<p>我认为犯罪就像是程序系统中的「异常」,你可以尽全力消除它,但它永远无法被彻底消灭。
在必要的时候,你还是需要采取「抓捕」行动来捕获异常进行处理。</p>
<p>犯罪其实没有好坏之分(这个世界上没有好坏之分),不是做了坏事就是犯罪,而是破坏了社会运行的基本准则。
当你的行为影响到了社会的稳定,那你的行为就会被定义为犯罪。</p>
<p>比如,杀人抢劫这种行为,严重违反了社会的稳定性。如果不接受惩罚,更多的人会开始杀人抢劫,那么社会体系就会被破坏。
但是,这也不是说杀人抢劫这种行为就有好坏之分。
想想那些开国皇帝们,唐宗宋祖哪个人不是杀人如麻,死在他们手下的人何止千万?
为什么他们就不会因为「杀人抢劫」而被定义为坏人?
因为他们的「杀人抢劫」的行为其实是给社会带来的安定,他们平定了国家,给社会带来了秩序和稳定。</p>
<p>所以,判定一个行为是否构成犯罪,不是行为本身的好坏,而是看这个行为是否影响到了社会的稳定。</p>
<h1>犯罪行为必须严惩</h1>
<p>对于犯罪行为,一旦确实,我认为必须给予惩罚 …</p><p>上一篇博文<a href="http://zhouyichu.com/words/Violence/">暴力</a>中,我谈论了关于「暴力」的话题。这篇博文,我想说说我关于犯罪的想法。</p>
<h1>犯罪行为没有好坏之分</h1>
<p>我认为犯罪就像是程序系统中的「异常」,你可以尽全力消除它,但它永远无法被彻底消灭。
在必要的时候,你还是需要采取「抓捕」行动来捕获异常进行处理。</p>
<p>犯罪其实没有好坏之分(这个世界上没有好坏之分),不是做了坏事就是犯罪,而是破坏了社会运行的基本准则。
当你的行为影响到了社会的稳定,那你的行为就会被定义为犯罪。</p>
<p>比如,杀人抢劫这种行为,严重违反了社会的稳定性。如果不接受惩罚,更多的人会开始杀人抢劫,那么社会体系就会被破坏。
但是,这也不是说杀人抢劫这种行为就有好坏之分。
想想那些开国皇帝们,唐宗宋祖哪个人不是杀人如麻,死在他们手下的人何止千万?
为什么他们就不会因为「杀人抢劫」而被定义为坏人?
因为他们的「杀人抢劫」的行为其实是给社会带来的安定,他们平定了国家,给社会带来了秩序和稳定。</p>
<p>所以,判定一个行为是否构成犯罪,不是行为本身的好坏,而是看这个行为是否影响到了社会的稳定。</p>
<h1>犯罪行为必须严惩</h1>
<p>对于犯罪行为,一旦确实,我认为必须给予惩罚。
不管犯罪行为是处于什么样的理由,只要犯了罪,都必须接受惩罚。
古人常说的论法不诛心,就是这个道理。</p>
<p>最近大家很关注的<a href="https://zh.wikipedia.org/wiki/%E7%AB%A0%E8%8E%B9%E9%A2%96%E7%BB%91%E6%9E%B6%E6%A1%88">章莹颖</a>案,一直拖了两年,最近终于要宣判了。
让我无法理解的是,辩方律师竟然邀请了罪犯的同学、邻居来证明罪犯本人其实一个好人。
因为一个悲惨的同年,才造成他现在的变态心理。
我就想问一问,这和他的犯罪行为有什么关系?
他童年的不幸就可以成为伤害别人的依据了吗?
那么非洲那些难民的童年比你悲惨不知道多少,他们就可以肆无忌惮地杀人抢劫了吗?</p>
<p>我还是那个观点,违反了社会稳定的要求,那就必须接受惩罚。
不管是什么原因导致的犯罪行为。</p>
<p>之前阅读「<a href="https://book.douban.com/subject/30176554/">暗黑者</a>」系列的时候,小说中的一个比喻我觉得很贴切。
在一个种满盆栽的院落里,生长着很多的菊花。
其中一株菊花却长歪了,抢占了它身边其他菊花的阳光。
但是,它长歪了的原因却是因为它还在发芽的阶段被其他菊花的根系挤压了,导致它发芽之后长歪了。
但是,为了整个小院的整齐,我们还是必须把这株长歪了的菊花清理掉,尽管长歪并不是它的本意。</p>
<h1>避免出现「长歪了的菊花」</h1>
<p>我不否认,这个社会上其实有着很多上述例子中那株「长歪了的菊花」。
对于社会的管理者来说,如何避免出现这样「长歪了的菊花」就是他们最大的责任。
在一个越是动荡的社会里,这样的菊花就越多。
当这些菊花的数量超过了那些正常的菊花,那么那些正常的菊花就自动变成了「不正常」的菊花。
如果社会发展到了这一步,那么就该是到了改朝换代的时候了。</p>
<h1>更新日志</h1>
<ul>
<li>2019年7月13日写作并发表</li>
</ul>「微习惯」读书笔记2019-07-13T00:00:00-06:002019-07-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-13:/reading-list/Mini-Habits/<table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">微习惯</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Stephen Guise</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-11</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787210086741</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>建立习惯就好像骑自行车上陡坡,爬坡,到顶,下坡。刚开始,你必须用双腿最大力量蹬自行车,之后会渐渐变得轻松,但是你必须一直登到山顶,否则就会倒退回原地,让之前所有的进步付诸东流。</p>
<p>重复就是(潜意识)大脑使用语言。</p>
</blockquote>
<h1>综述</h1>
<p>这本小册子主要阐述了作者对于「微习惯」这个概念的理解和应用。
与其花费很大的努力去建立一个新习惯,不如从微习惯开始,逐步改变。</p>
<h1>结构和细部</h1>
<h2>微习惯是什么</h2>
<p>所有人都存在以下的事实:</p>
<ol>
<li>如果没有产出什么结果,再大的决心也毫无价值。</li>
<li>人总会习惯性地高估自己的自控力</li>
<li>哪怕是一点点行动,也比毫不作为强无数倍</li>
<li>相比某一天做很多事吗,每天做一点儿事的影响力更大。(积累的力量)</li>
</ol>
<p>结论: 小决心比大决心效果更好</p>
<ul>
<li>微习惯的定义: 强迫自己每天做的微不足道的积极行为<ul>
<li>运用少量的意志力强迫自己做一件事</li>
<li>完成第一个目标之后,很可能会继续 …</li></ul></li></ul><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">微习惯</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Stephen Guise</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-11</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787210086741</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>建立习惯就好像骑自行车上陡坡,爬坡,到顶,下坡。刚开始,你必须用双腿最大力量蹬自行车,之后会渐渐变得轻松,但是你必须一直登到山顶,否则就会倒退回原地,让之前所有的进步付诸东流。</p>
<p>重复就是(潜意识)大脑使用语言。</p>
</blockquote>
<h1>综述</h1>
<p>这本小册子主要阐述了作者对于「微习惯」这个概念的理解和应用。
与其花费很大的努力去建立一个新习惯,不如从微习惯开始,逐步改变。</p>
<h1>结构和细部</h1>
<h2>微习惯是什么</h2>
<p>所有人都存在以下的事实:</p>
<ol>
<li>如果没有产出什么结果,再大的决心也毫无价值。</li>
<li>人总会习惯性地高估自己的自控力</li>
<li>哪怕是一点点行动,也比毫不作为强无数倍</li>
<li>相比某一天做很多事吗,每天做一点儿事的影响力更大。(积累的力量)</li>
</ol>
<p>结论: 小决心比大决心效果更好</p>
<ul>
<li>微习惯的定义: 强迫自己每天做的微不足道的积极行为<ul>
<li>运用少量的意志力强迫自己做一件事</li>
<li>完成第一个目标之后,很可能会继续「额外环节」,大大减少了内心的抵触</li>
<li>能够形成惯性</li>
</ul>
</li>
<li>习惯的重要性</li>
<li>如何建立第一个微习惯<ul>
<li>建立习惯的时间因不同的习惯而变化,没有固定的时间</li>
<li>建立习惯就像是骑自行车爬坡,必须尽最大力登顶,否则就会退回原地,让之前所有的努力付之东流。</li>
<li>建立习惯的第一个信号: 抵触情减弱</li>
</ul>
</li>
<li>习惯形成的第一个信号是抵触情绪减弱</li>
</ul>
<h2>大脑的工作原理</h2>
<ul>
<li>重复就是大脑(潜意识)使用的语言</li>
<li>改变大脑的两个关键:<ul>
<li>重复</li>
<li>回报</li>
</ul>
</li>
<li>人类大脑内部负责行为变化和新习惯建立的机制<ul>
<li>上前额皮层: 管理长远利益和决策</li>
<li>基底神经节: 掌管习惯,可以高效率的重复同一个行为.模式探测器</li>
</ul>
</li>
</ul>
<h2>动力 v.s 意志力</h2>
<ul>
<li>动力驱动并不是一个可靠的建立习惯的方式<ul>
<li>动力驱动很难坚持重复行为</li>
<li>高动力时,可以轻松地做一件事;但是低动力时,需要消耗意志力去督促自己去做一件事。</li>
<li>一旦意志力消耗完了,你就很难继续做下一件事了。</li>
<li>动力是以人的感受为基础的,而人的感受并不可靠</li>
<li>人总有不再状态的时候,这种情况下,动力驱动很难发挥作用</li>
<li>心理学研究表明,人类在进行惯性行为的时候是不带情感的</li>
</ul>
</li>
<li>形成个人习惯的最佳策略: 利用意志力代替动力</li>
</ul>
<h2>微习惯策略</h2>
<ul>
<li>影响意志力的五个因素:<ul>
<li>努力程度</li>
<li>感知难度</li>
<li>消极情绪</li>
<li>主观疲劳</li>
<li>血糖水平</li>
</ul>
</li>
<li>微习惯的优势:<ul>
<li>微习惯需要非常少的实际努力</li>
<li>微目标能够减少感知难度, 「已经开始」带来的心理影响会让感知难度明显降低</li>
<li>微习惯不会产生负面情绪</li>
<li>微习惯只会产生非常少的主观疲劳</li>
<li>微习惯独立于血糖水平</li>
</ul>
</li>
<li>微习惯只是让你从舒适圈中跨出一小步, 并不会造成太多的不适感,又能保证尝试新事物</li>
</ul>
<h2>彻底改变的八个步骤</h2>
<ol>
<li>选择适合你的微习惯和计划</li>
<li>挖掘每个微习惯的内在价值</li>
<li>明确习惯依据,将其纳入日程<ul>
<li>非具体微习惯</li>
</ul>
</li>
<li>建立回报机制</li>
<li>记录与追踪完成情况</li>
<li>微量开始,超额完成</li>
<li>留意习惯养成的标志,习惯形成的标志有:<ul>
<li>没有抵触情绪</li>
<li>行动时无需考虑</li>
<li>变得无聊: 好习惯并不会让人兴奋,他们只是对你有好处</li>
</ul>
</li>
</ol>
<h2>微习惯策略的规则</h2>
<ol>
<li>绝不要自欺欺人</li>
<li>满意每一个进步</li>
<li>经常回报自己,尤其在完成微习惯之后</li>
<li>保持头脑清醒</li>
<li>感到强烈抵触时,后退并缩小目标</li>
</ol>
<h1>评价</h1>
<p>有一些事情不是简单的积累就可以了,它涉及到更多深入的思考,而深入的思考是需要一段时间的思考才可以做到。
书中的例子,每天写1000字,一年就能写出7本5万字的小说,基本是不可信的。
涉及到思维的事情,不是简单的数字叠加就能做到的。</p>
<h1>和我的关系</h1>
<p>虽然这本小册子一开始给我的感觉是没什么太大的价值,但是在阅读过程中,还是带给了我一些共鸣。
书中的很多的观点和我自己之前笃信的原则有很多契合的地方,比如:</p>
<ul>
<li>想要完成一个长期的目标,必须是小步迭代式的努力</li>
<li>行为本身也能慢慢改变思想</li>
<li>重要的事情一定要形成习惯,让复利效应重复发挥作者用。</li>
</ul>
<p>同时,本书也给了我一些我之前从未考虑到的思考点。其中最重要的一点就是关于习惯的触发方式。
在我之前的意识中,习惯的触发方式无非只有时间而已。
然而,这本书却让我意识到,习惯的触发点不仅仅是时间而已。
<strong>习惯的触发可以是一个行为、也可以不止一个触发点。</strong>
简单的几个例子:
- 每次上厕所都会看个视频或看个小说的习惯。 这是不定时的,通过事件触发而不是时间。
- 开车听有声书,这也是通过事件触发的习惯。</p>
<p>如果我们能够利用这些容易被忽略的触发点去完成一些需要长期做但又不是很重要的事情,那也是很不错的。</p>
<h1>更新日志</h1>
<ul>
<li>2019年7月13日写作并发表</li>
</ul>保持自己的节奏2019-07-13T00:00:00-06:002019-07-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-13:/words/Pace/<p>之前看到了这个视频<a href="https://www.bilibili.com/video/av23418031/">年轻人,别让任何人打乱你的人生节奏</a>,很有感触。
我非常同意视频中的观点,每个人都有每个人的节奏,不要让别人来打乱你自己的节奏。</p>
<p>看看我身边的人,有人有妻有儿却依然在读博士;有人比我年轻4岁,却和我同一年入学博士;我还没结婚,有人却已经离婚。
人生是没有时间表的,没有人规定必须在什么时间完成什么样的事情。
就像视频里说的那样:</p>
<ul>
<li>JK罗琳32岁时才出版哈利波特,之前她已经被拒绝了12次</li>
<li>马云35岁才建立阿里巴巴</li>
<li>摩根弗里曼52岁才开始大红大紫</li>
</ul>
<p>另外:
- 奥巴马48岁当上美国总统,而特朗普70岁当上美国总统。</p>
<p>所谓三十而立,我认为它已经不符合现代社会的理念和发展了。
我们不应该拘泥于所谓的传统,按照自己的节奏来运行自己的人生。
毕竟,当你最终闭眼的时候,你需要面对的永远只是自己。
能对你负债的,有且只有你自己。</p>
<p>人生最重要的一点就是要以自己喜欢的方式过完这一生。
人生只有一次,如果不紧紧抓住这次机会,活出自己的人生,那岂不是太过浪费这一生的时光。
人的这一生,如果不能按照想要的方式去过,那么在你临终之前,难道不会抱着巨大遗憾而离开这个世界吗?
这才是人生最悲哀的地方。</p>
<p>也许有些传统的人会认为这样的观点太过自私,而我认为要求别人按照的自己的想法生活的人才是最自私的。
每个个体都有权利去选择自己的人生,我们不应该用所谓的家庭亲情、社会惯例来约束别人的和自己的人生。</p>
<h1>更新日志</h1>
<ul>
<li>2019年7月13日写作并发表</li>
</ul>暴力2019-07-07T00:00:00-06:002019-07-07T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-07:/words/Violence/<p>人们常说,「暴力是无能者最后的手段」.
我不是很同意这句话。
我的观点很简单,<strong>暴力才是解决矛盾的最终方式</strong>。
我的理由很简单,如果我能毫不费力地从物理上将你消灭,那么为什么还会有矛盾?</p>
<p>历史上有着无数的例子,都统统证明了这个观点:
1. 秦国统一六国之后,采用一系列暴力手段来消灭其他六国的残存势力。车同轨、书同文、焚书坑儒等暴力手段,现在被无数人所诟病。但是,他们是否想到过,如果当年没有采取如此的暴力手段,现在的中国还有可能是一个统一的国家吗?
我认为秦国最大的功绩就是在于车同轨、书同文和焚书坑儒。利用暴力手段彻底解决了中文文明四分五裂的状态,将文字、文化归属到同一个体系中。
作为对比,想想当年罗马帝国的包容、中世纪欧洲各种战乱以及现在欧洲各国不断的问题摩擦、领土争端之间的关系。</p>
<ol>
<li>朱元璋的治国理念。朱元璋可以算是历史上的一个大猛人,即使在所有的皇帝中,他也算是一个猛人。他的治国理念很简单,不听话的都杀了。 不管你是功臣还是文官,只要不听话,他就杀。虽然名声不好听,但他的治国理念确实也产生了很强的效果,明朝的国力迅速恢复,中央集权进一步加深。
在当年明月的「明朝那些事」中有一个这样的例子,下面的官员为了行政处理上的便捷钻了一个制度上的小空子,这件事被朱元璋知道之后,直接下令所有涉案官员全部撤职这一案中,全国一半以上的官员全部被牵连 …</li></ol><p>人们常说,「暴力是无能者最后的手段」.
我不是很同意这句话。
我的观点很简单,<strong>暴力才是解决矛盾的最终方式</strong>。
我的理由很简单,如果我能毫不费力地从物理上将你消灭,那么为什么还会有矛盾?</p>
<p>历史上有着无数的例子,都统统证明了这个观点:
1. 秦国统一六国之后,采用一系列暴力手段来消灭其他六国的残存势力。车同轨、书同文、焚书坑儒等暴力手段,现在被无数人所诟病。但是,他们是否想到过,如果当年没有采取如此的暴力手段,现在的中国还有可能是一个统一的国家吗?
我认为秦国最大的功绩就是在于车同轨、书同文和焚书坑儒。利用暴力手段彻底解决了中文文明四分五裂的状态,将文字、文化归属到同一个体系中。
作为对比,想想当年罗马帝国的包容、中世纪欧洲各种战乱以及现在欧洲各国不断的问题摩擦、领土争端之间的关系。</p>
<ol>
<li>朱元璋的治国理念。朱元璋可以算是历史上的一个大猛人,即使在所有的皇帝中,他也算是一个猛人。他的治国理念很简单,不听话的都杀了。 不管你是功臣还是文官,只要不听话,他就杀。虽然名声不好听,但他的治国理念确实也产生了很强的效果,明朝的国力迅速恢复,中央集权进一步加深。
在当年明月的「明朝那些事」中有一个这样的例子,下面的官员为了行政处理上的便捷钻了一个制度上的小空子,这件事被朱元璋知道之后,直接下令所有涉案官员全部撤职这一案中,全国一半以上的官员全部被牵连,但是朱元璋却毫不犹豫,该杀的杀了,该流放的流放。
他用最简单、最直接的方式解决了问题,而且没有产生太多的后遗症。</li>
</ol>
<p>我相信这个世界上喜欢暴力的人毕竟是少数,大多数人还是不喜欢暴力的。
我自己虽然信奉「暴力是解决矛盾的最终方式」,但是生活中发生了矛盾,我从不诉诸暴力。
为什么呢?</p>
<p>因为在现代社会中,人与人之间的暴力水平其实是属于同一个层次的。
如果采取暴力行为解决矛盾的话,带来的结果是两败俱伤,会造成双输的结局。
换句话说,暴力行为的成本太大了。或者说,我掌握的暴力力量还不够大,不足以不留后患的将你完全消灭。
但是,需要注意的是,这里的前提是<strong>暴力水平属于同一个档次</strong>.</p>
<p>设想一下,我们是如何对待鸡牛羊这些动物的。
对于他们来说,面对我们人类的暴力行为,他们没有任何反抗的力量,双方暴力水平根本不在一个层次上面。
因此,我们可以毫无忌惮的对鸡牛羊进行大规模圈养、屠宰。
这难道不是暴力行为吗?正因为这样的暴力行为没有任何成本,人类才会肆无忌惮地在鸡牛羊身上使用。</p>
<p>回到之前的例子中,对于秦国来说,它是强大的国家机器,面对六国的残余势力,它完全可以不留后患地将他们全部消灭,这不会产生后遗症;朱元璋作为皇帝,拥有绝对的生杀予夺的权利,干死一批臣子同样不会有任何问题。</p>
<p>其实这种跨层次的暴力手段才是自然界中常态,人类社会内部产生的这种「战略平衡」暴力层次水平才是一种特殊情况。
在这种情况下,一些不明真相的人就会产生所谓的「圣母心」。以为这世间一切都可以通过所谓「和平」和「大爱」的方式来解决矛盾。这实在是太幼稚了。</p>
<p>「三体」中的黑暗森林就是这种思想体现的一个例子,「我毁灭你,与你何干?」
在真正的强者面前,是没有道理可讲的。
只有弱者才会试图讲道理,对于强者来说,我直接消灭你。</p>六月的两次旅行2019-07-06T00:00:00-06:002019-07-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-07-06:/words/Travels-in-2019-June/<p>整个六月份都是在不同的州奔波,主要去了两个城市: Minneapolis和Seattle.
本篇博文打算记述一下这两次的短期旅行。</p>
<h1>Minneapolis</h1>
<p>Minneapolis是六月初去的,主要是为了参加学术会议。
Minneapolis是Minnesota州最大的城市,刚好处于密西西比河的流域。
当时在参观当地的历史博物馆的时候得知,整个Minneapolis其实是通过生产面粉而发展起来的。
据说最鼎盛的时候,他们的产品能够几乎覆盖全世界的面粉市场。</p>
<p>我在Minneapolis一共待了一周的时间,当然主要时间还是在参加会议。
除此之外,我也在市区内逛了一下。
整体感觉很不错,感觉当地人的生活节奏并不是很快,是一种比较悠闲的环境。
在市中心的步行街逛街的时候,并没有拥挤匆忙的感觉。</p>
<p><img alt="minneapolis的密西西比河沿岸" src="http://zhouyichu.com/images/Minneapolis.JPG"/></p>
<p>上图是我在参观当地的历史博物馆时,在他们的观景台上拍的。历史博物馆的位置非常好,刚好可以看到整个密西西比河及其瀑布。</p>
<h1>Seattle</h1>
<p>第二次旅行是去Seattle, 是六月下旬去的。主要目的是帮助女朋友安顿下俩,她将要在Amazon正式开始工作了。</p>
<p>和Salt Lake City和Minneapolis比较起来,Seattle的感觉完全不一样。
市中心路小人多,楼高且密,有一种瞬间回到了南京的感觉。
毕竟Seattle有着全世界各大IT公司进驻,城市规划、人口都是其他城市无法比拟的。
走在路上,我总是觉得每一个人都是程序员。</p>
<p>除了拥挤以外,Seattle的气候要比Salt Lake City和Minneapolis都要好,最重要的原因是它靠海。
和女朋友在海边散步的感觉很不错,环境真的很好 …</p><p>整个六月份都是在不同的州奔波,主要去了两个城市: Minneapolis和Seattle.
本篇博文打算记述一下这两次的短期旅行。</p>
<h1>Minneapolis</h1>
<p>Minneapolis是六月初去的,主要是为了参加学术会议。
Minneapolis是Minnesota州最大的城市,刚好处于密西西比河的流域。
当时在参观当地的历史博物馆的时候得知,整个Minneapolis其实是通过生产面粉而发展起来的。
据说最鼎盛的时候,他们的产品能够几乎覆盖全世界的面粉市场。</p>
<p>我在Minneapolis一共待了一周的时间,当然主要时间还是在参加会议。
除此之外,我也在市区内逛了一下。
整体感觉很不错,感觉当地人的生活节奏并不是很快,是一种比较悠闲的环境。
在市中心的步行街逛街的时候,并没有拥挤匆忙的感觉。</p>
<p><img alt="minneapolis的密西西比河沿岸" src="http://zhouyichu.com/images/Minneapolis.JPG"/></p>
<p>上图是我在参观当地的历史博物馆时,在他们的观景台上拍的。历史博物馆的位置非常好,刚好可以看到整个密西西比河及其瀑布。</p>
<h1>Seattle</h1>
<p>第二次旅行是去Seattle, 是六月下旬去的。主要目的是帮助女朋友安顿下俩,她将要在Amazon正式开始工作了。</p>
<p>和Salt Lake City和Minneapolis比较起来,Seattle的感觉完全不一样。
市中心路小人多,楼高且密,有一种瞬间回到了南京的感觉。
毕竟Seattle有着全世界各大IT公司进驻,城市规划、人口都是其他城市无法比拟的。
走在路上,我总是觉得每一个人都是程序员。</p>
<p>除了拥挤以外,Seattle的气候要比Salt Lake City和Minneapolis都要好,最重要的原因是它靠海。
和女朋友在海边散步的感觉很不错,环境真的很好。</p>
<p>在Seattle的时候,我还观赏到了传说中的Gum Wall...</p>
<p><img alt="GumWall" src="http://zhouyichu.com/images/GunWall.JPG"/></p>
<p>这堵墙上贴满了嚼过之后的口香糖,我是无法理解这面墙是如何成为景点.....</p>
<p>另外,我们还去了华盛顿大学,校区确实很漂亮。各个建筑都充满了欧洲中世纪的风格。
确实不愧为全美最美校园。</p>耐心2019-05-18T00:00:00-06:002019-05-18T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-05-18:/words/Patience/<p>今年夏天,有同学要去外州实习,拜托我帮忙照顾她的花花草草。
于是,我开始了养殖盆栽的生活。</p>
<p>由于是新手,在一开始的时候,我一直无法掌握正确的浇水量。
第一次浇水的时候,一下子浇了很多,当时有点担心万一把这些花花草草搞死了怎么办。
后来发现,这些花花草草的反应其实是很慢的,现在进行的浇水要在很长时间之后才能反映出来。</p>
<p>这让我不禁想到,这其实是和漫长的人生是很像。
我们现在做的每一个决定,除了当下的作用之外,对后面的漫漫人生路都产生了深远的影响。
而且,这些影响也许要在很久之后才能显现出来。
我想,其中的本质就是<strong>没有即时反馈</strong>.</p>
<p>亿万年的进化,让我们的大脑更加倾向于做出拥有即时反馈的决策。
对于那些具有长远利益但是当下却没有什么收益的事情,我们会本能地排斥。
最典型的例子就是学习。
学习前人的知识其实是一件十分枯燥的事情,因为它没有即时反馈。
也因此,很多教学都鼓励要在实践中学习,为什么?因为实践的过程能够更快的产生反馈,让大脑相应的脑回路得到增强,学习效率也就提高了。</p>
<p>现代社会已经茹毛饮血的时代了,我们不需要时刻保持警觉。为了更好的在现代社会生存,我们需要学会培养自己的耐心,学会做出长远的规划。不能只被眼前的各种即时反馈蒙蔽了双眼。</p>
<p>一个典型的反面例子就是玩游戏。游戏的设计者在设计游戏的时候,通常都是通过一些得分、等级之类的能够一眼就看到当前状态的数字来产生反馈,不断刺激大脑,吸引大脑的注意力。
通过不断给出即时反馈 …</p><p>今年夏天,有同学要去外州实习,拜托我帮忙照顾她的花花草草。
于是,我开始了养殖盆栽的生活。</p>
<p>由于是新手,在一开始的时候,我一直无法掌握正确的浇水量。
第一次浇水的时候,一下子浇了很多,当时有点担心万一把这些花花草草搞死了怎么办。
后来发现,这些花花草草的反应其实是很慢的,现在进行的浇水要在很长时间之后才能反映出来。</p>
<p>这让我不禁想到,这其实是和漫长的人生是很像。
我们现在做的每一个决定,除了当下的作用之外,对后面的漫漫人生路都产生了深远的影响。
而且,这些影响也许要在很久之后才能显现出来。
我想,其中的本质就是<strong>没有即时反馈</strong>.</p>
<p>亿万年的进化,让我们的大脑更加倾向于做出拥有即时反馈的决策。
对于那些具有长远利益但是当下却没有什么收益的事情,我们会本能地排斥。
最典型的例子就是学习。
学习前人的知识其实是一件十分枯燥的事情,因为它没有即时反馈。
也因此,很多教学都鼓励要在实践中学习,为什么?因为实践的过程能够更快的产生反馈,让大脑相应的脑回路得到增强,学习效率也就提高了。</p>
<p>现代社会已经茹毛饮血的时代了,我们不需要时刻保持警觉。为了更好的在现代社会生存,我们需要学会培养自己的耐心,学会做出长远的规划。不能只被眼前的各种即时反馈蒙蔽了双眼。</p>
<p>一个典型的反面例子就是玩游戏。游戏的设计者在设计游戏的时候,通常都是通过一些得分、等级之类的能够一眼就看到当前状态的数字来产生反馈,不断刺激大脑,吸引大脑的注意力。
通过不断给出即时反馈,牢牢地抓住了用户的注意力。</p>
<p>但是,我们需要明白的是,现代社会变得越来越复杂,想要完成一件事,已经不仅仅依靠即时反馈了。
它真正需要的是长远规划以及非凡的耐心。
我现在正在做的几件事统统是无法得到即时反馈的事情,比如健身、科研、写作等。
但是,我想大多数人都是明白的,没有即时反馈,不代表这件事没有意义。
相反,正是因为它将会产生巨大的回报,所以它失去了即时反馈的能力。</p>
<p>其实在这一点上,我曾经以为自己做得很好了,但是这次照顾盆栽的经验告诉我,其实我内心深处还是有着一种浮躁的心态,希望能够快速得到结果。
我也是在此时此刻明白了,为什么大家都说养一些花草能够陶冶情操。我想本质上是通过样子盆栽来培养自己的耐心,去除浮躁之心。</p>如何度周末2019-05-11T00:00:00-06:002019-05-11T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-05-11:/words/Weekends/<p>从去年开始,我严格区分了工作日和周末的区别,不仅在身体上,还在心理上做好明确的分界线。
因为,这么多年的从不区分工作日和周末的做法,让我觉得自己的生活无比混乱,很难保持一个很好的生活节奏。
来到美国之后,渐渐被被美国这种严格执行周末休息的制度所感染,开始在身心上做出调整。</p>
<p>我做出的改变包括两个方面.
首先,工作日工作的时候,学会保持专注,绝不浪费时间在看新闻、刷论坛这种事情上。
为了周末能够安心休息,我需要保证每周都完成足够的工作量。
其次,周末的时候,坚决不去实验室,坚决不干任何和工作相关的事情。
通过周末的两天,彻底放空自己的思绪,让自己被另外一种不同的环境所包围,打开自己的思维壁垒。
通过一年的践行,我发现这种模式让我的身心得到的了极大的愉悦感,也让我真正感受到了自己对生活的掌控。</p>
<p>既然决定了周末不干任何工作相关的事情,那么又该做些什么事情呢?
我认为,周末必做的事情必然包括了:</p>
<ol>
<li>思考与总结一周的生活工作状态。这是周末放空的全部意义所在。
我每周至少要花2到3个小时思考反思自己这一周的表现,并且做好相关的周记和总结。通过这个行为让自己明白自己正处在生命阶段的哪个位置,正处于当前工作项目的哪个阶段。</li>
<li>学习。这里的学习一般是学习一些和工作无关的事情。比如我最近在阅读「西方哲学史」。通常我会安排自己去阅读一些很有深度的书,我不追求进度,只追求提高自己的视野。另外,得到上我也参与了很多线上课程的学习。</li>
<li>写作 …</li></ol><p>从去年开始,我严格区分了工作日和周末的区别,不仅在身体上,还在心理上做好明确的分界线。
因为,这么多年的从不区分工作日和周末的做法,让我觉得自己的生活无比混乱,很难保持一个很好的生活节奏。
来到美国之后,渐渐被被美国这种严格执行周末休息的制度所感染,开始在身心上做出调整。</p>
<p>我做出的改变包括两个方面.
首先,工作日工作的时候,学会保持专注,绝不浪费时间在看新闻、刷论坛这种事情上。
为了周末能够安心休息,我需要保证每周都完成足够的工作量。
其次,周末的时候,坚决不去实验室,坚决不干任何和工作相关的事情。
通过周末的两天,彻底放空自己的思绪,让自己被另外一种不同的环境所包围,打开自己的思维壁垒。
通过一年的践行,我发现这种模式让我的身心得到的了极大的愉悦感,也让我真正感受到了自己对生活的掌控。</p>
<p>既然决定了周末不干任何工作相关的事情,那么又该做些什么事情呢?
我认为,周末必做的事情必然包括了:</p>
<ol>
<li>思考与总结一周的生活工作状态。这是周末放空的全部意义所在。
我每周至少要花2到3个小时思考反思自己这一周的表现,并且做好相关的周记和总结。通过这个行为让自己明白自己正处在生命阶段的哪个位置,正处于当前工作项目的哪个阶段。</li>
<li>学习。这里的学习一般是学习一些和工作无关的事情。比如我最近在阅读「西方哲学史」。通常我会安排自己去阅读一些很有深度的书,我不追求进度,只追求提高自己的视野。另外,得到上我也参与了很多线上课程的学习。</li>
<li>写作。从去年开始我就执行了「每周一文」的计划。虽然执行过程中也有磕磕绊绊,但是总体的收获还是不少的。
最重要的是它可以让自己的大脑保持活跃的思考,从生活的点滴之中寻找可以写作的素材。
就像之前在<a href="http://zhouyichu.com/words/Information-Flow/">信息流模型</a>中所说的那样,让自己的信息流流动起来。
从最开始挤牙膏式的写作,到现在我都不需要提前思考主题,只需要坐下来,略微思考一下,马上就能进入写作模式。1年前,我需要花费周末两天的时间来写好一篇博文,现在我只需要不到2个小时,就能写出来了。</li>
<li>娱乐放松。通过娱乐彻底放松自己的紧张的神经与压力。目前我采取的是游戏+美剧。当然,娱乐的时间不会太长,通常都是一个晚上的时间。</li>
<li>陪伴家人的时间。具体来说就是和家里视频通话,和女朋友散个步。</li>
</ol>
<p>网上看到很多人周末过着无比充实的生活,比如去爬个山、参加个沙龙等等。我很是赞同这样的生活方式,毕竟工作时为了生活服务的,而不是倒过来。
但是,美帝这种人口密度相对稀疏的地方,不是每周都有有趣的活动的。
我也只能自己创造有趣的活动。</p>
<h1>更新日志</h1>
<ul>
<li>2019年5月11日写作并发表</li>
</ul>焦虑感2019-05-04T00:00:00-06:002019-05-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-05-04:/words/Anxiety/<p>被焦虑感所劫持的我。</p><p>这一周的生活是泾渭分明的,周一至周三都是努力科研,为几周后的deadline做准备。
周四由于需要做一个小手术,没去实验室。
周五虽然去了,但是心劲完全散了,效率接近于0.
所以,总计下来,本周实际上只是工作了三天而已。</p>
<p>这一周的经验,再次证明了我无法处理好特殊情况和自己的心态。
在这里,我发现最为关键的地方在于,我自己的心态和自己的规划没有完全的匹配。
在日常的工作中,我总是能够很容易地切换自己的心态,进入一个适合工作的状态之中。
但是,一旦发生了特殊情况,比如这次去医院做小手术。
我的整个心态的就崩了,无法恢复到正常的工作状态。
心里总是在告诉自己,我可以好好休息一下。
但是,在实际的事物中,我却很快又给自己的安排的接下去需要处理的事务。
这种内外的不匹配导致了我这两天内心的焦虑。</p>
<p>这种焦虑的结果,就是整体日常规划的崩溃,浪费了不少的时间。
虽然这种情况出现的很少,但是每当这种情况出现的时候,我都处理不好。
而且,在可预计的未来,这种所」的「特殊情况」,将会成为未来生活的常态。
我需要学会处理这些「特殊情况」.</p>
<p>进一步反思自己的思维模式,我发现这种焦虑感可能来自于对自己的过于苛责。
一旦在工作时间没有处于工作状态,我就会产生中一种焦虑感,认为自己是在浪费时间,没有产生有意义的价值。
这种思维模式在从大学时代开始就伴随着我,直到现在。
在这个过程中,我也不断地和这种焦虑感作斗争。
但是,我往往是输的那一方。
我被我自己的焦虑感所牵引着,不停的往前走,一旦出现耽搁,焦虑感就被无限放大。</p>
<p>也许我应该让自己的节奏再放慢一些,至少要做到自由地控制自己的节奏。
我现在的感觉是,不是我在控制节奏,而是节奏在控制我。</p>
<p>过去2年,我一直在和自己强调节奏的重要性,因为我觉得只有保持一个良好节奏,才有可能不断推进一件事情。
没有了良好的规划和节奏,很多事情就会被慢慢糊弄过去。
我认为这是优秀人才和庸才之间的一个重大区别,优秀人的总是能够不断推进事情,而庸才往往会半途而废。
因此,我一直很看重规划和节奏。</p>
<p>但是,没想到,这种重视回过头慢慢发展成了我的焦虑感。
或许我之前的结论一直都是错的?优秀人才和庸才之间的差别也许不仅仅是规划能力,还包括了调节自己压力和情绪的能力。
虽然,在我的认知里,我是知道这一点的。
但是,我自己还是无法正确地处理自己的抗压能力和情绪波动。
我还需要更多的打磨。</p>
<h1>更新日志</h1>
<ul>
<li>2019年5月4日写作并发表。</li>
</ul>西方哲学史第五章 后古典时期 读书笔记2019-04-27T14:13:23-06:002019-04-27T14:13:23-06:00Flyawaytag:zhouyichu.com,2019-04-27:/reading-list/Filosofihistorie-5/<p>西方哲学史第五章 后古典时期 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>你所碰到的一切事情,你都应该坦然接受,就好像它是你本来希望发生的事情那样。因为,如果你知道万物都是根据上帝的意志而发生的话,你就会渴望它发生。——塞内加 斯多葛学派</p>
<p>感官并不提供给我们确定的知识</p>
</blockquote>
<h1>综述</h1>
<p>本章主要描述了后古典时期,也就是希腊哲学在亚里士多德之后到中世纪的这段时间内,哲学思想的变化。
在这段时期了,大帝国开始出现,普通人的政治权利逐步缩小,他们很难在政治上产生影响力。
在这一期间,哲学思想也产生了变化。
人们开始专注于追寻个人的幸福。
本章主要描述了不同哲学流派对于「幸福」标准的看法。</p>
<h1>结构和细部</h1>
<h2>确保个体幸福</h2>
<p><strong>从希腊城邦到希腊帝国</strong></p>
<p>希腊帝国时期: 公元前300年到公元400年</p>
<p>在这个时期,小型的城邦国家开始向能够统治多个民族的大帝国过度。
在这个过程中,为了加强中央集权的统治,一般会将君主描绘成神圣的。
慢慢的,普通市民的政治权利逐步缩小,直到无能为力。</p>
<p><strong>新的格局: 个体的人和普遍的法则</strong></p>
<p>在政治上无能力为力,也在思想层面上得到的反应。
具体表现为这样一种倾向: <em>回避对社会进行哲学思辨,而集中在一件事——一个人如何才能自己的幸福?</em>
渐渐的,哲学家们的思想开始从共同体中的人转向个人和普遍法则。</p>
<p>尽管这个时期也有很多不同的哲学流派,但是他们大部分都是在回答同一个问题: 如何才能让自己幸福?</p>
<h2>伊壁鸠鲁主义——确保个人安康</h2>
<p>伊壁鸠鲁对于这个问题的答案是: <strong>享受生活,但要深思熟虑</strong></p>
<p>伊壁鸠鲁认为我们应该有教养的、自觉的去追寻快乐,而不要介入政治或其他包含忧虑和风险的事情。
伊壁鸠鲁并不是在盲目沉溺与不道德的放纵生活中的纵欲主义,相反,他认为我们在生活中应该谨言慎行,只有处于我们支配之中的快乐才能确保幸福。
伊壁鸠鲁的生活哲学可以归结为以下两点:
1. 存在着唯一的善是快乐
2. 要确保最大的快乐,我们必须只享受我们能够支配的快乐。</p>
<h2>斯多葛学派——确保个人幸福</h2>
<p>相比于伊壁鸠鲁学派,斯多葛学派更怀疑我们控制外在善的能力。
斯多葛学派认为我们应该独立于任何外在的因素,
他们对于幸福问题的答案是: 一个人幸福的唯一条件是他或她过一中有德行的生活,而美德是以知识为基础的.</p>
<p>生命、健康和富裕,或者死亡、疾病、痛苦和贫困不可能影响智慧而由德性的人的幸福.</p>
<p>所谓有德行的生活,就是要按照理性和逻辑生活,是一种道德禁欲的生活。</p>
<p><strong>犬儒主义</strong></p>
<p>犬儒学派不是激发穷人们去进行徒劳的反抗,而是鼓励他们去学会在没有他们本来就不会有的那些物品的情况下,如何做到怡然自得。</p>
<p><strong>罗马时期的斯多葛学派</strong></p>
<p>一个人不再被认为是一个群体的有机部分,而被认为是普遍法典和政府体制下的一个个人.</p>
<p>斯多葛学派认为每个人原则都是法律面前彼此平等的,但是并非实际上彼此平等: 平等现在并不存在,但它是一个目的。
人法和仁政都是用来实现该理想的手段。</p>
<h2>新柏拉图主义</h2>
<p>新柏拉图主义把个人放在一个比较大的图景中,把恶描绘为一种缺失,一种非存在,把身体看做是非存在,把灵魂看作是存在。
其目标是把灵魂从它的肉身框架中解放出来。</p>
<h2>怀疑论</h2>
<p>存在两种不同的怀疑论
1. 直接或间接地主张我们无法认识任何东西
2. 并不主张我们无法认识任何东西,而是主张不停地探索而不采取一个立场。</p>
<ul>
<li>感官并不提供给我们确定的知识</li>
<li>归纳不是一个有效的推理</li>
<li>演绎并不产生新知识</li>
<li>演绎不能证明它们的前提</li>
<li>互相冲突的意见具有同样好的理由</li>
</ul>
<h2>古代的科学和其他学科</h2>
<ul>
<li>
<p>历史编纂学</p>
<ul>
<li>希罗多德和修昔底德</li>
<li>他们把暂时的东西和可变的东西看作是一个有价值的研究领域,强化经验。</li>
<li>他们强调观察和对现存的、可变的实在描述,而反对就所有变化背后不可变之物做理性的思辨.</li>
</ul>
</li>
<li>
<p>医学</p>
<ul>
<li>希波克拉底</li>
<li>强调观察和实践经验</li>
</ul>
</li>
<li>
<p>数学</p>
<ul>
<li>毕达哥拉斯</li>
<li>公理-演绎系统</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>本章的主题是追求个人的幸福。
然而,我觉得对于这个问题来说,人类有点既当裁判又当运动员的嫌疑。
我自己设立一个标准,然后我自己告诉自己,我是幸福的。
这有点自欺欺人的感觉。</p>
<p>这一章很明显可以感到作者的力不从心,很多地方都是一带而过,希望下一章能够有一些更加深入的分析。</p>
<h1>和我的关系</h1>
<p>关于幸福这一点,我自己也有一点想法。
我认为,所谓的幸福,就是自己追寻目标的过程。
这个目标必须是当前的你还无法做到,但是通过努力又是可以做到的事情。
本质来说,我觉得幸福感来自于对未来的希望和笃定。
一个对未来充满信心的人,一定是快乐的。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月27日写作并发表</li>
</ul>好人有好报2019-04-27T10:08:50-06:002019-04-27T10:08:50-06:00Flyawaytag:zhouyichu.com,2019-04-27:/words/Goodness/<p>这个世界真的有「好人有好报」吗?</p><p>我们从小就被教育说,平时要多做好事,因为「好人有好报」。
但是,这个世界真的是这样的吗?</p>
<p>很显然,这个世界不是这么美好的。
有人一生行善,最终却是「我为你雪中送炭,你却要我家破人亡<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>」;
有人作恶一生,因他而死数百万人,最终却能终老而死<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>。</p>
<p>回顾历史,「好人不长命 祸害遗千年」的例子数不胜数,如果还要我相信「好人有好报」,我是无法认同的。
这个世界不存在什么终极力量来为每一个人的行为作出裁决,这个世界只是一种存在,没有好与坏之分。</p>
<p><strong>一个人的命运和他做不做所谓的好事,没有任何关系。</strong></p>
<p>那么为什么那么多人愿意相信「好人有好报」呢?
我觉得主要有几个原因:
1. 幸存者效应,媒体宣传的、人们口中口口相传的都是好人好报的例子。
然而,大家不知道的是,那些做过很多恶事的人,很大一部分都过得很好,安享晚年,无疾而终。
2. 这是最容易的处事策略,因为这条策略最简单,最易执行。类比一下,学过算法的人都知道有这样两种基本的算法策略: 贪心和动态规划。
其实,我认为遵循「好人有好报」的处事原则,其实就是选择了贪心策略,以一种固定的策略来处事。
相对的,另外一种动态规划则完全不同,每一次的决策都是考虑过去、现在和未来,然后再做出最优的决策。
很显然,这要比遵循单一的原则要复杂,而人类永远都是选择简单,而不会选择复杂的事情的。
3. 做好事的行为准则能够使得社会运转的成本最低。如果每个人都是充满了戾气的,社会摩擦不断,反而会降低社会的整体运行效率。</p>
<p>从上面的分析可以看出,所谓的「好人有好报」仅仅只是一种可选的处事原则而已,而且是一种贪心的策略。
而在大部分的问题中,它的最优解绝不是贪心的。</p>
<p>从很多实例中,我们也可以发现,奉行做「好事」原则的人,都是比较一根筋的,做事不懂得权衡利弊,只认死理,这是典型的「贪心策略」;而那些所谓的坏人,他们更加圆融变通,能够根据时事做出最有利于自己的决策,尽管这些决策会让他们被打上「坏人」的标签,但是他们这些人却更加能够在变化莫测的世界中生存下来。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月27日写作并发表</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="http://www.sohu.com/a/135459239_610264">http://www.sohu.com/a/135459239_610264</a> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://zh.wikipedia.org/wiki/%E6%B3%A2%E5%B0%94%E5%B8%83%E7%89%B9">https://zh.wikipedia.org/wiki/%E6%B3%A2%E5%B0%94%E5%B8%83%E7%89%B9</a> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>「基地」读书笔记2019-04-27T00:00:00-06:002019-04-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-27:/reading-list/Foundation/<p>「基地」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">基地</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Isaac Asimov</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2011</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">978-7-5399-8329-5</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>这是整个基地系列的第一本,是整个基地系列宇宙观的开山之作。
小说描绘了一个数万年之后,人类遍布整个银河系的宏大世界。
当时的人类世界全部处于「银河帝国」的统治之下,是一个完整的政治实体。</p>
<p>哈利谢顿,作为整个系列的灵魂人物,他开创了「心理史学」这一数学分支,并且利用这一数学分析工具,预测了帝国的衰亡和第二帝国的兴起。
未来保护人类的未来,他制定了「谢顿计划」,将一批重要的科学家转移到银河系偏远的星球。
在这里,这批科学家的后代们将担负起重新建立银河第二帝国的重任。</p>
<p>谢顿计划的核心是利用人力不可抗的历史潮流因素,使得一代又一代的基地人度过一次又一次的危机,最终使得基地足够强大,以重建帝国。
这本「基地」描述了基地面临的前三次危机,它们分别是:</p>
<ol>
<li>利用政治手段平衡各个王国</li>
<li>利用宗教信仰,夺取各个王国的控制权</li>
<li>利用商业进行边界拓展</li>
</ol>
<h1>感想</h1>
<p>这是一本久负盛名的小说,没花多少时间就阅读完了。Isaac Asimov架构出了一个很大的科幻框架,而实际上小说的主要内容和科幻没有什么关系,更多是讨论的社会的演变过程。</p>
<p>从开创「心理史学」开始,哈里·谢顿预测出了社会变迁的走势,预言了社会的大动乱,为了使得这段动荡的时期能从1万年缩短到1千年,为此他建立了「基地」计划,保存人类的文化和科技,希望在1千年之后人类恢复和平的发展。</p>
<p>如此宏观了的故事背景,决定了不可能对某个人物进行细致的描写,而实际上作者也是这样处理的.全书中是没有主角的,同时每一个人物的描写并不是很多,只是在关键的几个地方进行描述,更多是对整个历史走向的描写。</p>
<p>作者描绘的「心里史学」有两个重要的基本假设:</p>
<p>作为研究对象的人类,总数必须达到足以用统计的方法来加以处理;
研究对象中必须没有人知晓本身已是心理史学的分析样本。即须保证研究对象的随机性和自发性
但是,实际上,在作者的小说中,历史的走向却只是靠几个人处于关键位置的人来推动的。比如是塞佛·哈定提出并实践了将科技和宗教结合的方式来对四大王国进行控制,而70年后,又是由侯伯·马洛提出并实践了用经济手段对四大王国进行控制。似乎每一个关键的时间点,总会出现一个睿智的人,带领「基地」走向新的历史阶段。</p>
<p>面对历史的洪流,尽管个人是无法阻挡的,因此很多人认为个人的力量是微乎其微的,但其实不然,处于关键位置上的人其实对历史走向起了很重要的作用。比如中国近代史那动乱起伏的100多年间,如果当时的每一个决策者都能从大局出发,而不是自己的阶级、自己的利益出发来思考问题,中国也不会贫弱了那么多年。</p>
<p>尽管个人的随机因素不足以抵抗大潮流,但足以推迟,延缓其发生。随机因素对整个系统的影响力并不是通常想象得那么弱,但也不是强大到能阻挡潮流。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月27写作并发表</li>
</ul>「Meditation for Beginners」读书笔记2019-04-27T00:00:00-06:002019-04-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-27:/reading-list/Meditation-for-Beginners/<p>「Meditation for Beginners」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">Meditation for Beginners</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Jack Kornfield</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2006</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">978-1-59179-834-7</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>If we want things that are always changing to stay the same and to get attached to them, we get disappointed, we suffer.</p>
</blockquote>
<h1>综述</h1>
<p>这是一本非常初级,但是很实用的冥想入门书籍。
这本书没有空谈什么「大道理」,直接从可操作的练习方法入手,让新手很快掌握冥想的基本方法。</p>
<h1>结构和细部</h1>
<h2>Benefits of Meditation Practice</h2>
<ul>
<li>It can help us learn how to remain more open, and it can help us learn how to love with our whole hearts—and to be unafraid to express that love.</li>
<li>Meditative awareness reduces tension and heals the body.</li>
</ul>
<h2>Meditation 1: Connecting with the Breath</h2>
<ol>
<li>Find a stable and comfortable posture so that you can become aware of your body in the present mement.</li>
<li>Allow your shoulders to drop and your hands to rest anywhere that is comfortable.</li>
<li>Close eyes gently.</li>
<li>Bring your awareness into the present moment.</li>
<li>Feel your breath. Focus on the breath.</li>
<li>Each time you drift away, return to feel the next breath.</li>
</ol>
<h2>Meditation 2: Working with Sensations in the Body</h2>
<ol>
<li>Expand your field of awareness to include all of the energies and sensations in your body.</li>
<li>The body will start to relese the tension and pain it stored.</li>
<li>Try to name the sensations your body feel.</li>
<li>You do not decide intellectually what it is supposed to be like. Your meditation will open like a flower does, each aspect in its own time.</li>
<li>Three kinds of painful sensations:<ul>
<li>The signal that something is wrong.<ul>
<li>Wrong position</li>
</ul>
</li>
<li>A common experience is to get pins and needles and tingles in your legs.(脚麻)<ul>
<li>Go with it.</li>
</ul>
</li>
<li>The third and most frequent type of pain includes every other uncomfortable sensation that comes with having a body.</li>
</ul>
</li>
<li>Your job is not to control the sensations, but letting them come and go.</li>
</ol>
<h2>Meditation 3: Working with Feelings and Emtions</h2>
<ol>
<li>The first feeling that many people experience in meditation is desire, or the “wanting mind.”<ul>
<li>Do not suppress it</li>
<li>Do not act it either</li>
<li>To feel it and name it.</li>
</ul>
</li>
<li>Do not suppress any feelings and emtions</li>
<li>Just accept and feel it.</li>
</ol>
<h2>Meditation 4: Witnessing Your Thoughts</h2>
<ul>
<li>When your mind keeps thinking about future and past, do not judge them!</li>
<li>Tell youself that these are just stories and they are not real.</li>
<li>Label them as "remembering" or "planning".</li>
<li>It does not matter how long often or how long your thoughts last. What real matters is the moment that you realize you arre thinking and go back to breath.</li>
</ul>
<h2>Meditation 5: Forgiveness Meditation</h2>
<ul>
<li>Forgiveness is not about condoning what happened.</li>
<li>
<p>Forgiveness is a matter of letting go of the past and knowing that even though something was wrong, the way to go forward is to start over.</p>
</li>
<li>
<p>First you ask forgiveness for yourself for when you have hurt or harmed anyone in thought, word, or deed, knowingly or unknowingly—and we all have.</p>
</li>
<li>Then ask forgiveness for the ways you have hurt and harmed yourself out of fear, pain, ignorance, neglect, and dishonesty.</li>
<li>Finally, let the wounds and sorrows you have suffered at the hands of others come into your awareness.</li>
</ul>
<h2>Meditation 6: Lovingkindness Meditation</h2>
<ul>
<li>The next step is to begin to feel compassion for your struggles and sorrows.</li>
<li>Then think of someone you love, someone for whom you naturally feel compassion.</li>
</ul>
<h1>评价</h1>
<p>这是一本实用性非常强的书,文字也很简单,是入门冥想的最好书籍。</p>
<h1>和我的关系</h1>
<p>虽然我很喜欢这本书,但是老实说我并没有完全看完这本书。
本书的最后几章内容和我的关系不是很大,我也没打算继续实践最后两章的冥想方法,因此直接跳过了。</p>
<p>尽管如此,本书还是我最喜欢的一本冥想书籍,是它让我真实体会到了冥想的满足感。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月27日写作并发表</li>
</ul>建模与实现2019-04-20T00:00:00-06:002019-04-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-20:/words/Modeling-and-Implementation/<p>要做成一件不仅仅依靠好的方法论,还需要强大的执行力。</p><p>和各种各样的模型打交道那么久了,我发现,一个模型的好坏,不仅仅取决于模型本身的能力,还取决于它具体的实现。
一个非常精巧的模型,如果实现得非常一般,那么不管是效率还是最终的表现都会不尽如人意;相反,一个比较一般的模型,但是通过各种精巧优化实现,也能得到不错的结果。</p>
<p>这一个发现,放到现实生活中,也是可以成立的。
要做成一件事,你的方法论和具体的执行,都有着至关重要的作用。</p>
<p>之前在阅读吴晓波的「<a href="https://book.douban.com/subject/1072438/">大败局</a>」的时候,书中很多人物的发家史让我印象非常深刻。
我不明白的是,为什么这些人能够靠如此拙劣的方式发家,然后又很快就衰落了?
后来我渐渐明白了,这些中国改革开发以来的第一代企业家,其实在他们心中并没有什么高深的方法论,只是他们看到了机会,就不管什么的一拥而上了。
他们所持有的不是什么精妙的商业眼光,他们凭借其实仅仅具体的「实现」,也就是强大的执行力。
后来,中国大地的商业环境逐渐发展,这些第一代企业家由于没有坚实的方法论,所以很快在后来的竞争中,被拥有更远眼光、更好方法论的后一代企业家所取代。
我觉得这就是一个非常好的,执行力可以替代好的方法论的例子,通俗点来说,就是大力出奇迹。
然而,这套模式有一个很重要的缺点,那就是后续乏力,即使利用「大力出奇迹」的方式能很快取得成功,但是这样的成功却没有一个好的方法论来支撑,因此不可持久。
另外,能够利用「大力出奇迹」的方式来取得成功的外部条件也是十分苛刻的,它要求这个大环境的竞争者都处于类似的情况。
在一个已经非常成熟的市场环境里,想要利用「大力出奇迹」几乎是不肯能的。
几天前看到的一个关于2017年<a href="https://movie.douban.com/subject/30402072/">Fyre音乐节</a>纪录片就是这方面的一个反面例子。
项目主持人以各种方式强力推进项目,却没有一个很好的规划,最终落得人财两空。</p>
<p>另一反面,如果空有所谓的好的方法论,在执行力上却出现了问题,那么也是注定要失败的。
在这种情况下,就会沦落为:「我有一个好的想法,就差一个程序员」的境地了。
通俗的说法就是眼高手低。
这样的例子不胜枚举,我也就不赘述了。</p>
<p>然而,明白这些又能告诉我们什么呢?
1. 首先,这些分析告诉我们,那些成功人士所总结的经验和方法论,未必就是正确的,他们的成功是方法论和具体执行的综合成果,而他们很难明确的区分出这两部分的比例有多少。
2. 你看到一个失败的人,不一定代表他的想法就一定是错的,也许仅仅是他的实现方式不对而已。
3. 要真正做成一件事,真正可靠的只有自己的独立思考能力. 也就是依靠逻辑和实验,而且必须是反复验证的逻辑和反复实践的实验。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月20日写作并发表</li>
</ul>「永恒的终结」读书笔记2019-04-20T00:00:00-06:002019-04-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-20:/reading-list/The-End-of-Eternity/<p>「永恒的终结」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">永恒的终结</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Isaac Asimov</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">读客</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2014年9月</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787539957173</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>这又是阿西莫夫的又一力作。
它也是我读过的关于时间穿越的最早的科幻小说。
小说描述了一个永恒时空,它是独立于一般时空的存在。
永恒时空中的人可以任意穿梭于一般时空的任何一个时间节点。
他们的主要工作就是不断修改现实,抹去一些可能导致人类灾难现实,从而保证人类社会永远在地球上永享快乐。</p>
<p>然而,永恒时空中的人也不是全知全能的。
他们的技术力量难以向上达到人类历史10000世纪之后的时间,他们甚至无法知道在那个时间里,人类还是否存在。</p>
<p>事实上,10000世纪之后的人类利用更加高超的技术力量阻止了永恒时空中人类的干扰。
同时,他们也发现,只要永恒的时空存在一天,人类就永远无法发展出向外空探索的科学技术,因为这些技术总是会被永恒时空抹去。
因此,10000世纪后的超人类,利用一个复杂的计划,将整个永恒时空从现实中抹去,从而将来人从安乐的摇篮中释放出来。
虽然会经受苦难,但是能够走向更加广阔的银河。</p>
<h1>感想</h1>
<p>这次是第二次完整的阅读这部小说,虽然直接结局是什么样的,但是还是为这样的想象力所折服。
作者对于人类整体未来的思考令人深思:</p>
<ol>
<li>外部环境的恶劣能够促进生物的不断进化,如果人类永远处于舒适而完美的世界中,人类永远无法继续进步,只会一步一步颓废下去。</li>
<li>所谓世界大战、饥荒真的是坏事吗?对于个人来说,毋庸置疑这是毁灭性的打击。但是对于人类整体来说,也许反而是好事。各种各样的灾难能不断促进人类不断进步。现代信息社会的基础不就是在二战期间打下的吗?</li>
<li>个人、国家、人类整体不应该太安逸,要有不断的进取心,向外探索才能保证自我的延续。正如尼采所说的,但凡不能杀死你的,终将使你强大。所以,我们不应该害怕失败,不应该害怕不安全。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2019年4月20日写作并发表</li>
</ul>异常2019-04-13T00:00:00-06:002019-04-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-13:/words/Exception/<p>如何处理生活中出现的各种异常。</p><p>从前觉得自己的抗压能力还是不错的,但是最近发现的一些事情,却让我自己认识到,自己对自己的判断是多么的不客观。</p>
<p>首先第一件事就是公寓停水。
停水是从周四晚上开始的,原来以为也就几个小时的事情,结果它停水直接停了24个小时,严重干扰了正常的生活节奏。
由于公寓办公室处没有任何公示说明, 这段时间内一直很焦虑。
我自己也明白,其实我的焦虑没有任何作用。
用<a href="https://en.wikipedia.org/wiki/Dale_Carnegie">卡耐基</a>的话说,我就是在「锯木屑」,是没有意义的事情。
在很多其他类似的情况下,我基本能够做到置身事外,不会因为这些事情干扰自己的情绪。
但是这次却不一样,也许是因为科研寻找问题的压力吧,周五一整天的状态非常差,阅读、思考、写代码的效率都很低。
而导致状态差的原因却是一些我无法控制的因素。
这充分说明了,我自己的调节情绪的能力还是不足。
不能自适应周围的情况,把自己调整到最佳的情况。</p>
<p>第二件事是常用的任务管理工具又出现了bug.
很多待办事项没有按照预想的那样进入「今日待办」。
我需要重新手工整理一天需要完成的任务,这些事情既琐碎也无趣,但又不得不处理。
让本来已经很不爽的自己,更加焦躁了。</p>
<p>事后,我也在不断反思。
为什么我会变成这样?</p>
<p>这两件事的出现,完全是我自己无法掌握的,我不该为这两件事负责。
但是,这两件事又严重干扰了我正常的生活节奏,一定程度上干扰了正常的生活。</p>
<p>上一次类似的情绪波动我已经记不得在什么时候了,我唯一肯定的是,类似的情绪换在以前在我身上是很常见的。
近两年来,通过保持冥想、运动和规律的生活,不断调整自己的内心状态。我以为自己已经完全摆脱这种情绪波动了,没想到,今天它又杀了出来。</p>
<p>抽象总结一下,此类情况可以归结为,当你的计划被突发情况所打乱的时候,你的应对方式是什么样的?
用程序员的语言说,就是当异常发生的时候,你该如何处理?
一旦,将其抽象出来,我觉得类似的情况可以归结为以下几种情况:
1. 这个异常不是你自己造成的,你也无法处理。这种情况就是我上述两件事的情况,这种情况其实也是最简单的,我们能做的其实也只能抛出异常,让别人来处理这件事情。
2. 这个异常不是你自己造成的,但是需要你自己来处理. 这种情况是真正的「无妄之灾」,不是自己造成的,但是却需要自己来处理。比如,你的电脑突然坏了,硬盘中的重要数据等突然读不出来等情况。
3. 这个异常是你自己造成的,但你无法处理。比如,在使用服务器的时候,不小心把自己的账户搞崩溃了,你必须联系管理员来帮你处理。这种情况只能请求别人的帮助。
4. 这个异常是你自己的造成的,同时也只能由自己来处理。严格说来,这种情况不能算是异常,这应该是自己的处理日常的一部分。</p>
<p>面对生活中出现的异常情况,我认为首先要做的是,先确定发生的异常属于上述的哪一种情况,然后再采取相应的对策进行处理。
不要让这些异常影响自己的个人情绪。
要在自己的脑海中刻入这样的印象: <strong>异常总是存在的,不可避免,永远不要奢望自己的生活总是一帆风顺的</strong>(同样不要奢望一个程序是永远bug free的)
我们真正能做的无非就是<strong>兵来将挡,水来土掩</strong>。</p>
<p>这四种情况每个人都会面对的,我自己处理得最不好的就是第一种情况。
经过这次详细的分析,希望一下次异常再次出现的时候,我能以更加平和明智的方式来处理,而不会影响自己的日常节奏。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月13日写作并发表</li>
</ul>西方哲学史第四章:亚里士多德 读书笔记2019-04-13T00:00:00-06:002019-04-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-13:/reading-list/Filosofihistorie-4/<p>西方哲学史第四章:亚里士多德 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>实在是一个趋向现实化的过程,但纯粹现实是个例外,它是个没有潜能的实在。</p>
</blockquote>
<h1>综述</h1>
<p>虽然亚里士多德是柏拉图的学生,但是他们在哲学思想上却有着很大的区别。
他们之间的区别其实就是后来的「理性主义」和「经验主义」之争的前身。
本章着重介绍了亚里士多德的各种思想。
可以说,亚里士多德的认识论奠定了后世科学发展的基础,他的三段论的逻辑思想影响深远。</p>
<h1>结构和细部</h1>
<h2>理念或实体</h2>
<ul>
<li>柏拉图: 通过理性要求批评实际情况,他认为政治的任务是使实际情况更接近理想的状况.他想要超越已有的秩序去追寻崭新的秩序。</li>
<li>亚里士多德: 从已有的国家形式着手,理性是划分和评价已有国家形式的手段。从已有的秩序中寻求最好的秩序。</li>
</ul>
<p><strong>实体和属性</strong></p>
<ul>
<li>柏拉图: 独立存在的是理念</li>
<li>亚里士多德: 独立存在是个别事物,称为实体。</li>
</ul>
<p>实体具有属性,而属性作为实体的属性才存在; 离开试图,属性无法独立存在。
属性又分为本质属性和非本质属性.</p>
<p>对于柏拉图来说,先有「理念的世界」,然后才有我们这个现实的世界,这个现实的世界是理念世界的不完美投影(理性高于经验);而亚里士多德则认为经验更加实在,最终存在的也是个别的事物,但我们能借助理性从事物中抽象出普遍形式,通过抽象过程,我们认识到世界存在的普遍形式。</p>
<ul>
<li>柏拉图: 从理念的世界开始,一步一步向下投影。</li>
<li>亚里士多德: 从具体的事物开始,利用理性一步一步地向上抽象,形成各种学科。</li>
</ul>
<h2>本体论和认识论</h2>
<p><strong>基本概念</strong>
- 本体论: 关于存在的基本形式的哲学理论(比如理念论和实体属性论)
- 认识论: 关于知识的基本形式的哲学理论</p>
<p>亚里士多德认为,获取知识包括:
1. 用我们的感官来体验个别事物
2. 从偶然性中抽象出本质和共相</p>
<p>亚里士多德的本体论认为个别事物和实体是独立存在的;他的认识论则认为我们寻求的知识应该是关于普遍本质属性的知识。</p>
<p><strong>四因说</strong></p>
<ul>
<li>质料因(Matter - material cause):即构成事物的材料、元素或基质,例如砖瓦就是房子的质料因;</li>
<li>形式因(Form - formal cause):即决定事物“是什么”的本质属性,或者说决定一物“是如此”的样式,例如建筑师心中的房子式样,就是房子的形式因;</li>
<li>动力因(Agent - moving cause 或 efficient cause):即事物的构成动力,例如,建筑师就是建成房子的动力因;</li>
<li>目的因(End 或 purpose - final cause):即事物所追求的目的,例如“为了安置人和财产”就是房子的目的因。</li>
</ul>
<p><strong>变化和宇宙论</strong></p>
<p>亚里士多德界定了四种变化:
1. 实体性的变化: 一个实体的产生和消灭,如一匹马的出生和死亡。
2. 性质上的变化: 一个实体变化了特性,如一片叶子由绿变黄
3. 数量上的变化: 一个实体增加或减少了特性
4. 位置上的变化: 一个实体改变了空间的位置。</p>
<p>亚里士多德的宇宙观:</p>
<ol>
<li>宇宙被分为天界和地界两个领域,每个领域有各自的运动法则</li>
<li>天界的运动轨迹是圆周运动</li>
<li>天体呈匀速圆周运动</li>
</ol>
<p><strong>现实-潜能和分级的有机世界观</strong></p>
<p>亚里士多德认为一切事物都混合了潜能和现实性,而且一切事物都想使潜能变为现实。
变化是潜能的现实化。</p>
<h2>亚里士多德和生态学</h2>
<p>亚里士多德看来,每一个事物都它自然的位置,污染是一种错置: 事物被放到并不属于的位置上。</p>
<h2>知识和实践</h2>
<p>作为一个分析论者,亚里士多德区分不同学科之间的区别。
- 理论科学: 关于认识, 确定真理.
- 自然哲学: 确定可感变化的事物
- 数学: 确定不变的数量的性质
- 形而上学: 确定不变的独立存在的形式
- 实践科学: 关于实践知识, 通过获得性的伦理能力导向明智行动.这种知识不能光靠词语交流,而要靠人们自己去参与和体验才能获得。
- 政治学
- 伦理学
- 创制科学: 技艺或技巧,目的是为了创造某物,具有创造性
- 艺术创作
- 修辞学</p>
<p>逻辑学不是一门独立的学科,而是一门工具,它贯穿于一切科学中。</p>
<p><strong>善的生活</strong></p>
<p>柏拉图把善的理念看成是独立存在的事物,但是亚里士多德则认为,善不能独立于人存在。</p>
<p>不同的人有不同的能力,因此他们也有不同的善。</p>
<p><strong>正义的社会</strong></p>
<ul>
<li>现有权利的正义: 涵盖了现存法律和法律传统以及可接受的各种合法的传统。</li>
<li>基于平等原则的正义: 同样情况应该同样同样对待,要求行为前后一致。<ul>
<li>交易平等的正义: 一个人的付出与所得相等</li>
<li>分配平等的正义:</li>
</ul>
</li>
</ul>
<h2>艺术: 模仿和净化</h2>
<p>艺术能够纯化和净化人的情感。</p>
<ol>
<li>艺术的净化作用在于它能够使我们「释放情绪」</li>
<li>艺术的净化作用在于我们作为人,能通过艺术得到提升和教化。</li>
</ol>
<h1>评价</h1>
<p>也许是翻译的问题,本章的阅读体验其实并不是特别流畅。
一些思想的解释和探讨浅尝辄止,有点意犹未尽的感觉。</p>
<h1>和我的关系</h1>
<p>亚里士多德思想中,最吸引我的就是他对于的认识论的新观点。
他认为我们必须从实际中出发,从实际经验中的理解这个世界。他的这一想法完全和他的老师柏拉图背道而驰。
柏拉图的理念论的核心就是假设一个超越经验存在的理念的世界,而亚里士多德不承认这一点,他认为我们需要从实践中寻找最好的,而不是臆想出一个完美的世界。</p>
<p>这是我最佩服亚里士多德的一点,他早年学习了柏拉图的思想,却没有全盘接受,甚至没有进行修补和拓展,完全另起炉灶,创造了一整套属于自己的哲学体系。
没有因为导师的思想而放弃自己的思想。
这才是一个哲学家真正应该具有的品质。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月13日写作并发表</li>
</ul>「神们自己」读书笔记2019-04-13T00:00:00-06:002019-04-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-13:/reading-list/The-Gods-Themselves/<p>「神们自己」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">神们自己</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Isaac Asimov</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">读客</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2014年12月</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787539978529</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>全书分为三个部分,第一部分描述了人类收到来自于平行宇宙的物质,建立了「电子通道」,从而获得了清洁的无限能源。
而有一位科学家拉蒙特发现了这种获取能源方式的弊端,最终将会导致我们所在宇宙的崩塌。
而发现这种能量来源的科学家拒绝接受的这个事实,因为这会损害他的名誉。
而其他握有实权的人也拒绝相信拉蒙特的理论,因为他们也害怕失去自己手中的权势。
面对如此重要且明显的问题,这些当权者为了一己私欲而选择视而不见,这就是Isaac所说的「愚昧」,而人类与愚昧的战争将会永远继续。
想想面对所谓的环境保护、核弹危害、种族歧视,那些当权者是如何选择的?</p>
<p>第二部分描述了平行世界中的外星生命,这些外星生命分为幼年状态和成年状态,幼年状态时由三个性别组成一个家庭: 理者、情者和抚育者。
当这三个个人组成家庭并诞生新的后代之后,这三者就会相互融合形成一个成年个体——长老。
第二部分的故事描述了外星世界由于太阳枯竭而急需新的能源,于是长老们发明了「电子通道」,从平行宇宙中获取能源。
但是,有一个不一般的情者发现「电子通道」终将毁灭平行世界,情者面对另一个文明的毁灭和自己种族的生存,产生了激烈的内心斗争,她最终选择破坏「电子通道」,拯救平行世界中的人类。
然而她的反抗是徒劳的,当她最终和理者、抚育者合体之后,她的这种悲天悯人完全被理智和本能所击败。
我觉得这三种不同的性别就象征着人类自己,理智、情感和本能。
情感也许多变、也许高尚、也许强大,但最终依然抵不过理智和本能。
而有时候,最理智的选择也是最黑暗的选择。
就像「三体」中所描述的黑暗森领法则一样,在生存面前,无所谓善良与邪恶,只有赤裸裸的生存本能。</p>
<p>接着是第三部分,人类在月球上终于找到了「电子通道」危机的解决策略,男女主人公也相爱相守在一起了。 这一部分写得太过理想化了,也许这也是寄托了Isaac美好的愿望,正如他开篇所说:</p>
<h1>感想</h1>
<p>小说开篇的那句话让我印象非常深刻:</p>
<blockquote>
<p>愿与愚昧的战争终将有胜利的一天。
-- Isaac Asimov神们自己</p>
</blockquote>
<p>整部小说也充分反映了这个主题。
人类的短视与盲目,很有可能成为人类发展的障壁。</p>
<p>这部小说是Asimov所有小说中,最不令我感到惊艳的作品。
尽管如此,它还是比一些粗制滥造的,披着科幻外衣的小说要好上许多。</p>
<p>经过豆瓣上一篇评论的提示,我发现刘慈欣的作品应该是在很大程度上收到这部「神们自己」的影响,比如:
1. 本作中的一个月球人想要把月球直接发射出去,这和刘慈欣的「流浪地球」非常相似
2. 杜阿对平行宇宙的警告和「三体」中的三体人观察者的警告如出一辙。
3. 对于普通人的愚昧和圣母情结的厌恶,也能从中体会出来。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月13日写作并发表</li>
</ul>「巴菲特的护城河」的读书笔记2019-04-07T11:08:16-06:002019-04-07T11:08:16-06:00Flyawaytag:zhouyichu.com,2019-04-07:/reading-list/The-Little-Book-That-Builds-Wealth/<p>「巴菲特的护城河」的读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">The Little Book That Builds Wealth</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Pat Dorsey</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2009年11月</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787545401585</td>
</tr>
</tbody>
</table>
<h1>综述</h1>
<p>这是一本和巴菲特没有半毛钱关系却冠以巴菲特之名的小册子。
这本册子是来自<a href="https://www.morningstar.com/">晨星(MornignStar)</a>的资深股票分析员的投资总结。
挺有启发性的。
它提出了什么才是一个企业的真正护城河。
在寻求投资机会的时候,需要学会区别出真假护城河的区别。</p>
<h1>结构和细部</h1>
<h2>经济护城河</h2>
<p>一个公司的价值=预期创造的现金值-扩大经营所必须的支出</p>
<p>经济护城河: 企业能常年保持竞争优势的结构性特征,是其竞争对手难以复制的品质。</p>
<p>虚假的护城河:
- 优质产品
- 高市场份额
- 有效执行
- 卓越管理</p>
<p>真正的护城河:
- 无形资产: 品牌、专利或法定许可,能够出售竞争对手无法效仿的产品或服务
- 转化成本: 企业能够让客户不选择竞争对手的产品或服务
- 网络效应: 商品或服务的价值能够随使用者的增加而提高。想要从网络效应中获益,这个网络必须是封闭的。
- 成本优势: 成本优势对那些价格影响客户采购决策最大的行业最为关键。 成本有优势包括: 流程优势、上佳的地理位置和独一无二的资源。
- 规模优势: 宁愿做小池塘里的钓大鱼,也不做大池塘里更大鱼,重点在于公司的相对规模,而非公司的绝对大小。</p>
<p>真正的护城河是别人无法复制的模式。</p>
<h2>发现衰退的信号</h2>
<ol>
<li>依靠技术的企业,随时都冒着在激烈竞争中丧失原有优势的风险。</li>
<li>技术落实对非技术型企业的影响,是一种更无法预料、同时也是更加严重的威胁,因为在新技术危机他们生存前,这些企业会给人竞争优势无与伦比的错觉。</li>
</ol>
<h2>发现护城河</h2>
<ul>
<li>软件企业比硬件企业更容易建造护城河,硬件企业本身更加侧重于资本密集。一种软件通常要和其他软件结合一起才能发挥作用,而这种结合就能锁定用户,增加了客户的转换成本。</li>
<li>媒体企业比较容易形成护城河。独有内容和零传播成本保证了成本优势。</li>
<li>直接面对消费者企业往往难以形成竞争优势,如餐饮企业和零售商。</li>
<li>为公司提供服务的企业拥有护城河的比例是最高的,以为他们可以把自己的业务紧密结合到客户的业务中,形成非常高的转化成本。</li>
<li>在任何一种商品制造领域里,企业真正拥有的可持续成本优势都是微乎其微的。</li>
</ul>
<h2>管理</h2>
<ul>
<li>在护城河这个问题上,管理并不像我们认为的那样举足轻重。</li>
<li>把赌注放在赛马身上,而不是骑师。管理者固然重要,但还不足以超过护城河。</li>
<li>选择大于一切。</li>
</ul>
<h2>护城河的价值</h2>
<ul>
<li>公司的价值就是它在未来所创造的现金现值,仅此而已</li>
<li>影响企业估价的四个重要因素:<ul>
<li>企业在未来所能创造的现金(增长率)</li>
<li>实现这些预测现金的可能性(风险)</li>
<li>企业运作需要的投资额(资本回报率)</li>
<li>企业置竞争对手于门外的时间(经济护城河)</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>全书的内容和结构还是很不错的,利用了大量的真实案例说明了作者的观点,比较有说服力。</p>
<h1>和我的关系</h1>
<p>这本书是从投资角度来分析一个企业的,但是在阅读的过程中,我发现也可以从经营一家企业的角度思考。
比如,书中提到的四种真正的护城河,当我们开始创业的时候,我们可以有意识地为自己的企业构建出这四种护城河。
从而让自己的企业从众多的竞争对手中脱颖而出。
作者提出的四种护城河,让我对未来的创业和投资都有了新的思考角度,具有启发性。</p>
<h1>更新日志</h1>
<p>2019年4月7日写作并发表</p>「海伯利安的陨落」读书笔记2019-04-07T00:00:00-06:002019-04-07T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-07:/reading-list/The-Fall-of-Hyperion/<p>「海伯利安的陨落」读书笔记</p><table>
<thead>
<tr>
<th align="left"></th>
<th align="left"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Title</td>
<td align="left">海伯利安的陨落</td>
</tr>
<tr>
<td align="left">Author</td>
<td align="left">Dan Simmons</td>
</tr>
<tr>
<td align="left">Edition</td>
<td align="left">吉林出版社</td>
</tr>
<tr>
<td align="left">Release Date</td>
<td align="left">2014年11月</td>
</tr>
<tr>
<td align="left">ISBN</td>
<td align="left">9787553452937</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>这一部的故事紧接上一部的故事。
描述了七人朝圣团队后来的故事。
小说基本上以多条叙事线开展的,每一个人都是这一出历史大剧中的一个角色,但却没有一个绝对的主角。
主要剧情可以大体分为三条
1. 赛博文赛文的经历。他也是一个人工智能制造的重塑人格,基本蓝图是诗人济慈。七人团后来在海伯利安上的经历,基本都是通过他的梦境来展现的。后来也是他探查到了内核的所在,并将这个消息透露给了人类。
2. 七人朝圣团队在海伯利安的经历。杜雷神父被传送出了海伯利安,并且成为了新任的教皇;卡萨德上校正面挑战伯劳,最后力战而死;诗人马汀-赛伦诺斯最终还是完成了他的「诗篇」,但是却被伯劳钉在了荆棘树之上,后来被米拉亚洲救下;索尔抗争到了最后,只是在最后一秒他还是将瑞秋献祭了出去,同时在未来瑞秋的帮助下,穿越时空之门,在未来继续抚养幼年时期的瑞秋;拉米亚先是和强尼一起在内核中游历,后来返回现实世界之后救下了诗人;领事代表霸主与驱逐者们进行谈判,决定了战争的走向。
3. 霸主执行官悦石面对战争的种种举措。在最终得知战争其实是内核的阴谋以及内核真正所在的位置之后,毅然决然地销毁了所有的远距离传送门,彻底终结了内核的威胁。</p>
<h1>感想</h1>
<p>老实说,我还是无法理解这部作品的伟大之处在哪里。
虽然剧情大概我能够理解的,但是还是有很多细节之处我无法理解。
再加上书中大段大段的引用诗句来反应意境,这让我产生了很强的出戏之感。
在一部以科幻为主题的小说中,融入如此之多的文学意象,阅读体验很奇怪。
尽管这本书盛名在外,但我已经不打算继续阅读接下来的第三第四部了。</p>
<h1>更新日志</h1>
<p>2019年4月7日写作并发表</p>「原则」读书笔记2019-04-06T00:00:00-06:002019-04-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-06:/reading-list/Principles/<p>「原则」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">原则</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Ray Dalio</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">中信出版社</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2018年1月</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787508684031</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己该怎么做。</p>
<p>我的一败涂地是在我身上发生过的最好的事情之一,因为它让我变得谦逊,而我正需要谦逊来平衡我的进攻性。我学到了一种很好的恐惧犯错的意识,这本我的思维定式从认为“我是对的”变成了问自己“我怎么知道我是对的”</p>
<p>我的目标只是让自己正确--我并不关心正确的答案是否来源于我</p>
<p>承认你的弱点并不是向弱点投降,而是克服弱点的第一步</p>
</blockquote>
<h1>综述</h1>
<p>整本书看下来就像是作者整理的行为原则条目,虽然加入了不少的解释和说明,但是更像是一个工具书,而不是一个可以通读思考的书。
整本分为了三部分,第一部分是总结了瑞达利欧自己的成长经历;第二部分是他总结出来的生活原则;第三部分是工作原则。</p>
<h1>结构和细部</h1>
<h2>第一部分: 成长经历</h2>
<p>在本书的第一部分,瑞达利欧描述了自己的成长经历。
我发现在他的成长历程中,我发现自己的现在的一些想法其实和他的很相似,但是他的思考却比我更加深远。
在这第一部分,我已经能感受到了瑞达利欧的一些基本行事原则了:
1. 不害怕犯错,但是每次犯错都必定要找出原因
2. 不关心我是否正确,更加关心我怎么知道我是正确的
3. 成功的满足感并不来自实现目标,而是实现目标的过程</p>
<p>整个第一部分的描述其实都是流于表面的,达利欧只是将自己的人生划分成了几个不同的阶段。
但是,在他的字里行间,我明显能感到他其实隐去了不少的内容。</p>
<h2>生活原则</h2>
<h3>拥抱现实,应对现实</h3>
<ol>
<li>做一个超级现实的人: 脚踏实地的做事<ul>
<li>梦想+现实+决心=成功的生活</li>
</ul>
</li>
<li>真相,是任何良好结果的根本依据. 客观的分析事情、分析自己。不要自欺欺人.</li>
<li>做到头脑开放,极度透明。不能固执己见,承认自己的无知。<ul>
<li>不要担心别人的看法,做好自己</li>
</ul>
</li>
<li>观察自然,学习现实规律<ul>
<li>放弃事物「应该」是什么样的想法</li>
<li>正确的事是符合自然规律的,并且促进整体的进化</li>
<li>进化是宇宙中唯一永恒的东西: 不存在一劳永逸的原则、方法,永远保持学习的精神</li>
<li>不进化,就死亡</li>
</ul>
</li>
<li>进化是生命最大的成就和最大的回报: 不停的更新自己的操作系统<ul>
<li>个体的激励机制必须符合群体的目标</li>
<li>现实为了整体趋向最优化,而不是为了个体</li>
<li>通过快速试错以适应是无价的</li>
<li>你的未来取决于你的视角</li>
</ul>
</li>
<li>理解自然提供的现实教训<ul>
<li>把你的进化最大化: 成功意味着以更加高效的方式拼搏和进化,即迅速认识自身和所处环境,然后通过改变实现进步。</li>
<li>没有痛苦就没有收获</li>
<li>想要进化,必须突破极限,而突破极限的过程是痛苦的</li>
</ul>
</li>
<li>痛苦+反思=进步<ul>
<li>迎接而非躲避痛苦</li>
<li>接受严厉的爱</li>
</ul>
</li>
<li>考虑后续与再后续的结果: 短期收益和长期收益?</li>
<li>接受结果: 改变能改变的,接受不能改变的。</li>
<li>从更高的层级俯视机器</li>
</ol>
<p>总结:
- 不要混淆你的愿望和事实
- 不要因为自身形象担心,只需要关心能不能实现你的目标
- 不要过于重视直接结果而忽视后续、再后续的结果
- 不要让痛苦妨碍进步
- 不要把不好的结果归咎于任何人,从自己身上找原因</p>
<p>### 用五步流程实现你的人生愿望</p>
<ol>
<li>有明确的目标<ul>
<li>给目标排列优先顺序</li>
<li>不要混淆目标和欲望</li>
<li>不要把成功的装饰错误认为是成功本身</li>
<li>永远不要因为你觉得某个目标无法实现就否决它</li>
<li>谨记伟大的期望创造伟大的能力</li>
</ul>
</li>
<li>找到阻碍你实现这些目标的问题,并且不容忍问题<ul>
<li>把令人痛苦的问题视为考验你的潜在进步机会</li>
<li>不要逃避问题.思考难以解决的问题也许让你焦虑,但不思考肯定会让你更加焦虑</li>
<li>要精确地找到问题所在。</li>
<li>不要把问题的某个原因误认为问题本身</li>
<li>找出问题之后,不要容忍问题</li>
</ul>
</li>
<li>准确诊断问题,找到问题的根源<ul>
<li>先把问题是什么弄明白,再决定怎么做</li>
<li>区分直接原因和根本原因</li>
</ul>
</li>
<li>规划可以解决的方案<ul>
<li>前进之前先回顾</li>
<li>把你的问题看作一部机器产生的一系列结果</li>
<li>谨记实现你的目标通常有很多途径</li>
<li>把方案写下来并按照方案执行,规划先于行动!</li>
</ul>
</li>
<li>做一切必要的事情来践行这些方案<ul>
<li>建立良好的工作习惯</li>
<li>建立清晰的衡量标准来确保你在严格执行方案</li>
</ul>
</li>
</ol>
<p>没有人能够完美的做到以上五个步骤,必须要找到自己的犯错误的地方。
在上述五步流程中,找到自己最弱的那一项,并且克服它.</p>
<p>### 做到头脑极度开放</p>
<ol>
<li>认识你的两大障碍: 自我意识和思维盲点<ul>
<li>自我意识障碍: 潜意识里的防卫机制,它使你难以接受自己的错误和弱点</li>
<li>思维盲点: 思维方式会阻碍你准确看待事物. 人们无法理解自己看不到的东西。</li>
</ul>
</li>
<li>奉行头脑极度开放. 接受自己有盲点,接受自己有可能是错的。<ul>
<li>认识到决策应当分为两步: 先分析所有相关信息,然后决定</li>
<li>不要担心自己的形象,只关心如何实现目标</li>
<li>谨记: 你是在寻找最好的答案,而不是你自己能得出的最好答案</li>
</ul>
</li>
<li>领会并感激: 深思熟虑的意见分歧</li>
<li>识别你应当注意的头脑封闭和头脑开放的不同迹象</li>
</ol>
<h3>理解人与人大不相同</h3>
<ol>
<li>明白你与其他人的思维方式能带来的力量<ul>
<li>我们拥有各种天生特征,既可能帮助自己也可能伤害自己</li>
</ul>
</li>
<li>理解大脑里的主要斗争,以及如何控制这些斗争,以实现“你”的愿望<ul>
<li>要明白,意识与潜意识在不断斗争</li>
<li>要知道最唱发生的斗争史情绪和思考的斗争</li>
<li>调和你的情绪和思考</li>
<li>善择你的习惯</li>
<li>理解大脑可以改变的程度</li>
</ul>
</li>
<li>认识自己和他人的特性</li>
<li>无论你要实现什么目标,让合适的人各司其职以支持你的目标,是成功的关键</li>
</ol>
<h3>学习如何有效决策</h3>
<ol>
<li>要认识到影响好决策的最大威胁是有害的情绪,决策是一个两步流程: 先了解后决定</li>
</ol>
<p><strong>了解清楚</strong>
2. 综合分析眼前的形式
- 你能做的最重要的决定之一是决定问谁
- 不要听到什么信什么。观点是很廉价的,需要学会区分观点和事实。
- 所有东西都是放在眼前看更大
- 不要夸大新东西的好处
- 不要过度分析细节
3. 综合分析变化中的形势
- 始终记住改善事物的速度和水平,以及两者的关系
- 不必过于精确
- 谨记二八法则,找出关键性的20%是什么
- 不要做完美主义者
4. 高效地综合考虑各个层次</p>
<p><strong>把决策做好</strong>
5. 综合分析现实、理解如何行动的最好工具是逻辑、理性和常识
6. 根据预期价值计算做决策(计算每一个决策的期望结果). 奖励乘发生概率-惩罚乘发生概率
- 不管押对的概率已经多大,提高你的押对概率始终是价值
- 知道什么时候不要去押注,和知道什么注值得押同样重要
- 最好的选择是好处多于坏处的选择,而不是毫无坏处的选择
7. 比较更多信息带来的价值和不做决定造成的成本,决定优先顺序
- 先把你的「必做之事」做完,再做你的「想做之事」</p>
<p>需要做出决定的时候,让思维慢下来,根据标准做出决策,当结果出现时,对比标准,做出改进。</p>
<ol>
<li>对你的决策进行可行度加权</li>
<li>把你的原则转换成算法,让计算机和你一起决策</li>
</ol>
<h1>评价</h1>
<p>老实说,我觉得这本书是有点言过其实的。
虽然我只是主要阅读了前两部分的内容,其中的很多内容都是在各种鸡汤文中见到的大道理,并没有太多超出预期的内容。
我觉得这本书,最重要的一点就是改变了人们普遍的思维习惯: 我们可以把整个人生看成是一个不断学习进化的数学模型。
从错误中不断学习更新自己,而具体的更新步骤就是书中所描述的各项原则。
一旦发现基于原则作出的决策与实际的结果不符合,那么我们就应该更新自己的原则。
虽然这些原则都是一些非常朴素的道理,但是真正能够把这些内容系统化的,还是少数;同时能够一生践行这些原则的,那就是更加少之又少了。</p>
<h1>和我的关系</h1>
<p>从这本书中,我最大的收获就是:
1. 决策基于原则,而不是基于直觉或情绪,并且需要根据现实反馈不断更新整理自己的原则。
2. 将生活系统化、原则化,以原则驱动的方式去处理生活中的各项事情。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月30日写作并发表</li>
</ul>宋朝的臆想2019-04-06T00:00:00-06:002019-04-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-04-06:/words/Song/<p>刚听完宋朝的有声书,记录一下相关的臆想。</p><p>最近在喜马拉雅上听完了一段关于大宋王朝的历史。
对于宋朝,我想很多中国人都会又爱又恨的。
爱的是这个时代的繁荣,科技、经济、文化都在这段时间内有长足的发展。
而恨的又是这个朝代是出了名的软弱,一向对外奉行「花钱买平安」的政策。
从国土面积上看,这是中国历史上主要朝代中面积最小的几个王朝之一,但是从生产力和国力来看,又是无比强大的几个之一。</p>
<p>年少轻狂的时候,每每想到这段历史,总是不胜唏嘘。
坐拥如此强大的国力,为什么还要向敌国俯首帖耳?
后来,才逐渐明白,这其实是一个很简单的经济成本问题。
北宋前期向辽国纳贡以保持和平,这其实是一个非常有利的交易。
战争的发生,很大一部分的原因就是因为战胜带来的利益远远大于发动战争的成本。
但是,在当时的历史条件下,其实这一点并不成立。
宋朝前期也和辽国缠斗了几十年,然而除了消耗国力以外没有任何收获。
但是,如果愿意花钱摆平此事,而所花的钱仅仅是发动战争成本的百分之一,那么又何乐不为呢?
如果仅仅是为了「扬我国威」而发动毫无意义的战争,有什么意义呢?
一个反面的例子就是汉武帝,汉武帝好大喜功,为了彻底击垮匈奴,耗尽了文景之治积攒下来的国力,即使最终战胜了匈奴,但是剩下的也只是一个空虚的国家。</p>
<p>然而,虽然宋朝能够用钱摆平事情是一件好事。
但是,它也带来一个隐患。
那就是导致后来的宋朝「忘战去兵」,导致整个国家军队战斗力的下降。
国家从上到下渐渐失去了战斗精神。
这也是后来靖康之耻、建炎南渡等历史事件的深层原因。
如果一个国家只有强大的经济而没有与之匹配的军力,迟早会被其他国家侵略的。
类似的例子可以参见清末民初那几十年风雨飘摇的时期。
但是,既然有反面的例子,那当然也会有正面的例子。
现代社会的美国,可以说就是文武兼备了。
这也正是美国百年来是唯一超级大国的原因。
经济上的GDP就不用说了,和第二名的中国拉开了很大的差距;军事上面,美军在全世界各地都有军事基地,而且局部的武装冲突不断。在实际的小规模战争中,美军能够不断打磨自己的装备、军事系统,以保持足够好的战斗力。
我想这也是美国能保持强大的重要原因之一。
不管是有意识还是无意识的,它都真正做到了国家层面上的「文武兼备」。</p>
<p>相同的道理其实是可以移植到个人身上的,一个人如果一路走得太过顺利,他很快就会失去面对挫折的能力。
一旦遇到真正的失败,可能从此就一蹶不振了。
相反,如果一个人是从一个个小的挫折中不断前进的话,那么他将拥有更加宽广的未来。
一个理想的人生之路,不是一帆风顺,也不是充满荆棘;而是在不断的小挫折中螺旋式的上升。</p>
<h1>更新日志</h1>
<ul>
<li>2019年4月6日写作并发表</li>
</ul>需求和不可替代性2019-03-30T00:00:00-06:002019-03-30T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-03-30:/words/Demand-and-Irreplaceable/<p>最近在阅读「巴菲特的护城河」,这是一本和巴菲特没有半毛钱关系,却用着他的名字的书。
这是一本关于投资的小册子,主要分析了现代商业环境中优秀企业所拥有的护城河。
虽然我还没有完全看完,但是,以我个人的见解,所谓企业的护城河,就是竞争对手无法复制的品质。</p>
<p>我真正感兴趣的,其实是如何构建每个人的个人护城河,如何让自己在这个充满竞争的社会中保持强有力的竞争力,拥有足够的「定价权」。</p>
<p>将企业的护城河转移到个人身上,我发现需要满足至少两个条件:
1. 你的能力被这个社会需要
2. 你的能力是不可替代的</p>
<p>一旦做到了以上这两点,不管你所从事的事业是多么的无趣或者简单,都将获得不菲的回报。</p>
<p>比如,现在很火的小鲜肉们,虽然很多人都不喜欢这些所谓的流量明星,没有演技还要甩大牌。
但是,他们依然大红大紫,不断的从社会上获取财富。
因为这个社会上还有很多人想要看到这些小鲜肉(需求),而且这些小鲜肉的颜值确实不是普通人能达到的(不可替代),所以,尽管他们的言行在一些人看来是非常的不堪,但这并不妨碍他们成为「印钞机」。</p>
<p>以上说的两个特点必须同时满足,才能构成一个人的护城河。
只满足其中一项,并没有什么太大的作用。</p>
<p>比如,很多研究理论的科学家,他们一生奉献给了科学事业,但是却一生清贫。
「生活大爆炸」中有一集的剧情就是 …</p><p>最近在阅读「巴菲特的护城河」,这是一本和巴菲特没有半毛钱关系,却用着他的名字的书。
这是一本关于投资的小册子,主要分析了现代商业环境中优秀企业所拥有的护城河。
虽然我还没有完全看完,但是,以我个人的见解,所谓企业的护城河,就是竞争对手无法复制的品质。</p>
<p>我真正感兴趣的,其实是如何构建每个人的个人护城河,如何让自己在这个充满竞争的社会中保持强有力的竞争力,拥有足够的「定价权」。</p>
<p>将企业的护城河转移到个人身上,我发现需要满足至少两个条件:
1. 你的能力被这个社会需要
2. 你的能力是不可替代的</p>
<p>一旦做到了以上这两点,不管你所从事的事业是多么的无趣或者简单,都将获得不菲的回报。</p>
<p>比如,现在很火的小鲜肉们,虽然很多人都不喜欢这些所谓的流量明星,没有演技还要甩大牌。
但是,他们依然大红大紫,不断的从社会上获取财富。
因为这个社会上还有很多人想要看到这些小鲜肉(需求),而且这些小鲜肉的颜值确实不是普通人能达到的(不可替代),所以,尽管他们的言行在一些人看来是非常的不堪,但这并不妨碍他们成为「印钞机」。</p>
<p>以上说的两个特点必须同时满足,才能构成一个人的护城河。
只满足其中一项,并没有什么太大的作用。</p>
<p>比如,很多研究理论的科学家,他们一生奉献给了科学事业,但是却一生清贫。
「生活大爆炸」中有一集的剧情就是,主角们所在学校的一位老教授去世之后,主角们去收拾老教授的遗物,发现这位老教授一生工作所留下来的仅仅是一堆除了审稿人再也没人读过的论文。
但是看到这段剧情的时候,其实是感到有些悲哀的。
这些理论科学家所从事的工作,对推进人类文明发展具有不可磨灭的贡献,然而社会却给予了他们非常少的回报。
但是,如果按照「护城河」理论来分析的话,我们就能发现,虽然他们的工作是具有不可替代性的,但是却不被需要。
社会上的普通大众,不明白也不需要他们的研究成果,所以,即使有再大的贡献,普通大众也不关心。</p>
<p>想想感觉悲哀,但是事情就是这样的,能否取得回报,不是取决于你的工作有多重要,而仅仅是取决于你是否被社会所需要。</p>
<p>另一方面,如果你的能力是被社会需要的,但是却是可被替代的,那么你一样无法获得足够的回报。
比如,建筑工人、长途运输的司机等,这些职业都是维持这个社会正常运转必不可少的,社会对这些职业有很强的需求。
但是,从事这些职业的人,却拿着比较低的收入,为什么?因为他们的工作的是可被替代的。
任何一个人,经过简单的培训,能够马上上岗。
非常低的进入门槛,导致这些职业并不能获得更多的回报。
与之对应的就是一些需要常年培训的职业,比如律师和医生。
这两个职业需要长年的培训,才能取得律师执照或者医生执照。
这就间接的造成了这些职业的不可替代性,同时又是社会所需要的,因此,这些职业就成为了高收入的代表。</p>
<p>最后,再分析一下程序员这个职业。
最近国内比较火的<a href="https://996.icu/#/zh_CN">996.icu</a>的页面引起了很多人的关注。
可是,为什么只有程序员这个职业会出现996的现象呢?
因为这个职业有很大的需求,同时准入门槛又很低(具有可替代性),因此即使你不接受996工作制,别的程序员也会接受。
这就形成了恶性循环,导致那么多的公司肆无忌惮的要求程序员996.</p>
<p>所以,最终的结论就是,想要在这个社会上立足,必须培养自己同时拥有两项能力:
1. 被社会需要
2. 不可替代</p>
<p>满足这两项,就能够从芸芸众生中脱颖而出。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月30日写作并发表</li>
</ul>西方哲学史第三章:柏拉图——理念论和理想国 读书笔记2019-03-24T15:53:03-06:002019-03-24T15:53:03-06:00Flyawaytag:zhouyichu.com,2019-03-24:/reading-list/Filosofihistorie-3/<p>「西方哲学史」第三章柏拉图——理念论和理想国的读书笔记.</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>理念不存在时空,既不产生也不会消失。</p>
</blockquote>
<h1>综述</h1>
<p>这是「西方哲学史」的第三章,主要分析了柏拉图的主要思想。
从作者的文章结构中可以看出,他将柏拉图的思想分为了三个方面:</p>
<ol>
<li>关于理念的世界模型,这是纯粹的哲学思想</li>
<li>根据理念论而产生的政治观点,主要是柏拉图的「理想国」</li>
<li>由理念论而产生的艺术观</li>
</ol>
<p>在柏拉图的思想中,可以很明显的感受到,他是一个纯粹的理性主义者,他完全忽视了人的生物性。
他所有的理论基础都是假设存在着一个永恒不变的理念世界,这个理念世界中的所有事物都完美无缺的。
我们需要做的就是将我们的日常生活(政治、艺术)都向这个完美的理念世界靠拢。</p>
<h1>结构和细部</h1>
<h2>知识和存在</h2>
<p><strong>理念和知识</strong></p>
<p>柏拉图思想的三个发展阶段:
1. 早期: 紧随苏格拉底,用概念分析和概念洞见的方法
2. 中期: 试图说明理念论的存在
3. 后期: 辩证的认识论</p>
<p>理念论: 除了我们感官所感知到的事物外,还有我们理解但无法用感官感知的事物。</p>
<p>我们的世界=可感知的世界+理念的世界。</p>
<p>理念的世界客观存在,我们能够理解,但是无法直接感知。只能通过具体的实例来认识。
理念不存在时空,既不产生也不会消失。</p>
<p>理念与理念是相互交织在一起的,我们无法获得对单一理念的真知。
洞见理念就是洞见它们之间的联系,洞见理念的整体。
「真理」就是关于这种整体的一切知识。</p>
<p>柏拉图提出的几个类比:
1. 太阳之喻
太阳队可感世界的关系,就好比善的理念对可知世界的关系.
善的理念是我们理解其他的理念的基础,就像阳光是我们看见这个世界的基础一样
2. 线段之喻</p>
<p><img alt="Figure" src="http://zhouyichu.com/images/figure-0.png"/></p>
<ol>
<li>囚徒之喻</li>
</ol>
<p><strong>理念论和人的角色</strong></p>
<p>人的灵魂属于理念世界,肉体属于感知世界。
人的前世,灵魂居住在理念世界,它能够直接看到理念;但是当灵魂以肉体的形式呈现时,它就忘记了先前所知的一切。
但是在生活过程中,它又能回忆起以前所知道的东西。
因此,一个人所有的学习,从生到死,都是一个再认识的过程。</p>
<h2>柏拉图的「理想国」和善</h2>
<p><strong>教育和社会分层</strong></p>
<p>柏拉图认为,要洞见理念,需要具备良好的理智能力和训练培养,而普通人不具备这些能力,因为无法依靠自己主动地拥有美德和善。
因此,必然需要那些能够洞见理念并且有德行的少数人引导其他大多数人走上正确之路。
柏拉图其实是一位反民主派: 他认为人民不能自我领导。</p>
<p>柏拉图认为,在一个健康的城邦中, 权利应该掌握在胜任者手中.</p>
<p>柏拉图理想中的教育体系:
- 教育属于管家管辖之事,要平等对待每一个儿童,不管出生和性别。
- 所有学生在10岁到20岁都接受相同的教育
- 20岁之后,挑选优秀的学生继续学习其他科目,一直到30岁
- 再次挑选,让选中的学生继续学习哲学,直到35岁。
- 然后,让他们在世间学习管理实际事务15年。
- 在他们50岁的时候成为国家的领袖</p>
<p>柏拉图理想中的世界分为三个阶层:
1. 统治者: 有能力有权威
2. 管理者和士兵
3. 生产者</p>
<p>柏拉图认为每个人的能力不同,他需要在社会中找到最适合他的位置。</p>
<p><strong>权利和能力</strong></p>
<p>统治者和管理者(士兵)没有私有财产和家庭生活。
次优国家: 允许每个人拥有私有财产和过家庭生活的权利。他允许社会受法律的治理。</p>
<p><strong>男子和女子</strong></p>
<p>柏拉图提倡广泛的男女平等。
他认为男女生理上的差别与每个人在社会中所能胜任的工作无关: 妇女生育孩子并不能证明以性别差别为依据劳动分工,即让妇女从事家务劳动,只让男子履行公众义务的分工的合理性。</p>
<p>柏拉图被看成是妇女权利的早起捍卫者。</p>
<p>柏拉图把公共生活置于私人生活之上;同时把理智和教育置于生物性之上。</p>
<h2>艺术的伦理责任</h2>
<p>我们现在普遍认为 真、善、美-科学、道德、艺术是相互区别的,需要区别对待。
艺术作品即使不能提升道德或真理,也可以成为伟大的艺术。</p>
<p>但是,对于柏拉图来说,这种对真善美的区分是不合理的。
他认为理念之间是相互联系的: 善和美的理念交织在一起。美指向善,善也指向美。艺术不能脱离道德。</p>
<p>在柏拉图看来,艺术是摹本的摹本。
首先可感知的世界是理念世界的摹本,而艺术作品又是可感知事物的摹本。
因此,他认为艺术家应该直接努力复制理念。</p>
<h1>评价</h1>
<p>这一章的内容比较清晰地说明了柏拉图的主要思想——理念论。
然而,柏拉图不仅仅作为一个哲学家闻名于世,他还是一个政治家、艺术家。
而本章的内容没有忽略这部分内容,可以说是比较系统的分析了柏拉图的思想,是非常不错的一章。</p>
<h1>和我的关系</h1>
<p>由于之前对柏拉图的思想就比较熟悉,因此这一章的内容虽然有很多共鸣,但是却没有太多让我惊奇的思想。
从中我学习到的是柏拉图的政治观点和艺术观点。</p>
<p>很多年前,当我第一次接触到柏拉图的理念论的时候,感觉深有同感。
当时,我刚开始学习编程,自然就将编程中的「面向对象」思想和柏拉图的「理念论」联系到了一起。
这两种思想都是假设这个世界分为两部分,一部分是完美的、永恒的;而另外一个则是具体的、短暂的。
目前「面向对象」思想依然是软件工程领域的主流思想就足以看出这种建模方式的优越性。
它不一定是完美的,但是它在很大程度上确实完美的模拟了我们生活的这个世界。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月24日写作并发表</li>
</ul>方向和大小2019-03-23T00:00:00-06:002019-03-23T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-03-23:/words/Direction-and-Progress/<p>向量具有两个非常基本的属性: 方向和大小。
而人生其实也可以从这两个角度来分析: 方向和大小。</p>
<p>这里的方向指的是人生方向上的选择,而大小则是指你在这个方向取得进度的速度(而不是最终的取得的成绩)。</p>
<p>在我们小时候,我们被教育要好好努力读书,将来做一个有用的人才。
然而,这个世界上人生道路千万条,却从来没有人告诉我们该如何选择道路,只是告诉我们需要努力。
这相当于,只告诉我们要加速,却不告诉我们该向哪个方向加速。
而在这种模式下成长起来的人,很大一部分本质很优秀的人都进入了一条不适合自己的道路,从而埋没了自己的才华。</p>
<p>上大学出来之后,才逐渐发现,选择其实远比取得进步重要的多。
即使你是战神,如果你在45年加入德军,你还觉得自己的前途光明吗?
选择的重要性在大量的鸡汤文的洗礼之下,现在已经不言而喻了,大部分都明白选择的重要性。
据说投资圈中还流传着这样一句话: 站在风口上,猪都会飞。
这句话表达的其实就是选择的重要性。</p>
<p>后来继续不断学习深造,当自己的专业领域走得越来越深的时候,又发现,其实方向和进度都是非常重要的。
即使选择了一个非常好的方向,如果不能够快速地取得进度,你还是会湮灭于茫茫众生。
想想前几年流行的共享经济模式的创业,现在剩下来的又有几家?而你现在的生活是否还能离开类似的服务?
方向确实很重要,但是同样的重要的是,需要快速的在这个方向去的进度。</p>
<p>用一张图就可以说明这一点:</p>
<p><img alt="Figure" src="http://zhouyichu.com/images/figure.png"/></p>
<p>图中的A和B都表示选择了同一个方向的两个人,但是由于他们的执行效率不同, A通过长时间的积累 …</p><p>向量具有两个非常基本的属性: 方向和大小。
而人生其实也可以从这两个角度来分析: 方向和大小。</p>
<p>这里的方向指的是人生方向上的选择,而大小则是指你在这个方向取得进度的速度(而不是最终的取得的成绩)。</p>
<p>在我们小时候,我们被教育要好好努力读书,将来做一个有用的人才。
然而,这个世界上人生道路千万条,却从来没有人告诉我们该如何选择道路,只是告诉我们需要努力。
这相当于,只告诉我们要加速,却不告诉我们该向哪个方向加速。
而在这种模式下成长起来的人,很大一部分本质很优秀的人都进入了一条不适合自己的道路,从而埋没了自己的才华。</p>
<p>上大学出来之后,才逐渐发现,选择其实远比取得进步重要的多。
即使你是战神,如果你在45年加入德军,你还觉得自己的前途光明吗?
选择的重要性在大量的鸡汤文的洗礼之下,现在已经不言而喻了,大部分都明白选择的重要性。
据说投资圈中还流传着这样一句话: 站在风口上,猪都会飞。
这句话表达的其实就是选择的重要性。</p>
<p>后来继续不断学习深造,当自己的专业领域走得越来越深的时候,又发现,其实方向和进度都是非常重要的。
即使选择了一个非常好的方向,如果不能够快速地取得进度,你还是会湮灭于茫茫众生。
想想前几年流行的共享经济模式的创业,现在剩下来的又有几家?而你现在的生活是否还能离开类似的服务?
方向确实很重要,但是同样的重要的是,需要快速的在这个方向去的进度。</p>
<p>用一张图就可以说明这一点:</p>
<p><img alt="Figure" src="http://zhouyichu.com/images/figure.png"/></p>
<p>图中的A和B都表示选择了同一个方向的两个人,但是由于他们的执行效率不同, A通过长时间的积累,很快就超越了卓越的水平;而B虽然也选择了相同的方向,但是由于松散的执行力,即使在一个非常好的方向上,他依然无法达到卓越水平,甚至无法达到「可以接受」的水平。</p>
<p>这就对我们提出了更多的要求,不仅要学会战略性的目光,选择一条有发展前途的道路;还需要学会精耕细作,在选择的道路全速前进。</p>
<p>在日常生活,我们要时刻关注自己的这两个方面,观察自己的方向已经进度,哪一方面出现了缺失就需要补齐哪一方面。</p>
<p>具体的做法其实没有什么新意:
1. 每一天的相关工作都做好计划和记录
2. 做好总结: 对比每天的计划和执行结果,分析这其中出现分歧的原因,并加以改进。同时审视自己的方向,关注其他方向上的动态.</p>
<p>计划和记录的作用在于量化自己的进度;而总结则是在审视自己的选择,为未来的选择做好准备。</p>
<h1>更新日志</h1>
<p>2019年3月23日写作并发表</p>人是万物的尺度2019-03-16T00:00:00-06:002019-03-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-03-16:/words/Man-is-Measure-of-Everything/<p>古希腊的哲学家普罗泰哥拉曾经提出过一个非常著名的论断: <strong>人是万物的尺度</strong>。
我非常喜欢这个简洁又包含了无穷意义的论述。
在我的理解中,这句话包含了一下几层意义:
1. 事物不以它们本来的面目向人们显示,在任何时候都只显示某些方面或特性。
2. 我们对事物的认识都是以视角为条件的,我们自己的视角决定了自己的知识体系。 </p>
<p>详细解释一下。</p>
<p>其实第一层的意思和我们中国道家的思想很接近,稍微翻译一下就是: 福兮祸之所倚 祸兮福之所伏.
事物的好与坏不是绝对的,它的价值取决于人们使用它的场景。
一把好的刀子在厨师手中,就是提高效率的利器;而在一个凶徒手中,那就是杀人的凶器。
人才是决定事物价值的判断标准。</p>
<p>第二层的意思是说,我们看待事物的方式其实是受到自己的视角的局限的。再次翻译一下,就是人们常说的<strong>屁股决定脑袋</strong>.
而且这样的视角局限性,人们是常常不自知的。
这才是最危险的。</p>
<p>这些朴素的道理对我们日常的生活有不少的启示.</p>
<p>首先,当一件事情发生的时候,我们不要给它打上一个标签,这是一件好事还是一件坏事。
就像上面提到的一样,一件事的好坏取决于它所处的情景,而不是它自己本身。
因此,我们不能光以一件事的本身就得出结论。
往往在一些时候,好事能变成坏事,坏事也能变成好事。
明白了这一点,我们就能够以更加平实的眼光看待这个世界,做到宠辱不惊。</p>
<p>换个角度来说,一件所谓的坏事发生之后,它对我们的影响其实仅仅是一些外在的影响 …</p><p>古希腊的哲学家普罗泰哥拉曾经提出过一个非常著名的论断: <strong>人是万物的尺度</strong>。
我非常喜欢这个简洁又包含了无穷意义的论述。
在我的理解中,这句话包含了一下几层意义:
1. 事物不以它们本来的面目向人们显示,在任何时候都只显示某些方面或特性。
2. 我们对事物的认识都是以视角为条件的,我们自己的视角决定了自己的知识体系。 </p>
<p>详细解释一下。</p>
<p>其实第一层的意思和我们中国道家的思想很接近,稍微翻译一下就是: 福兮祸之所倚 祸兮福之所伏.
事物的好与坏不是绝对的,它的价值取决于人们使用它的场景。
一把好的刀子在厨师手中,就是提高效率的利器;而在一个凶徒手中,那就是杀人的凶器。
人才是决定事物价值的判断标准。</p>
<p>第二层的意思是说,我们看待事物的方式其实是受到自己的视角的局限的。再次翻译一下,就是人们常说的<strong>屁股决定脑袋</strong>.
而且这样的视角局限性,人们是常常不自知的。
这才是最危险的。</p>
<p>这些朴素的道理对我们日常的生活有不少的启示.</p>
<p>首先,当一件事情发生的时候,我们不要给它打上一个标签,这是一件好事还是一件坏事。
就像上面提到的一样,一件事的好坏取决于它所处的情景,而不是它自己本身。
因此,我们不能光以一件事的本身就得出结论。
往往在一些时候,好事能变成坏事,坏事也能变成好事。
明白了这一点,我们就能够以更加平实的眼光看待这个世界,做到宠辱不惊。</p>
<p>换个角度来说,一件所谓的坏事发生之后,它对我们的影响其实仅仅是一些外在的影响。
如果我们继续以一种悲观的视角来看待它的话,那么这件坏事对我们的影响就远不如表面上的那么一些了。
一件事情对我们真正产生的影响取决于我们对这件事的反应,而不是这件事本身。</p>
<p>对于第二点,我们需要告诫自己的是,我们看待的世界的角度,只是众多角度中的一种。
而且,从来没有一种角度是百分之百正确的。
正因为如此,我们才需要和他人合作。
不同的人的合作过程其实就是整合不同的视角,尝试还原事物本来的面貌。
用一个类比来说,就像是盲人摸象。
每个个体只能看到这个世界的一部分,只有不同的人在一起合作,才能真正看清一件事物的本质。</p>
<p>现实世界上很多的矛盾,其实都是当事人无法意识到别人的视角其实是和自己不同的。
面对同一件事,不同的人看到的是不同的东西。
如果能够明白,视角的不同,我想人与人之间的相互理解程度应该能够更深一点吧。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月15日写作并发表</li>
</ul>西方哲学史第二章:智者派和苏格拉底 读书笔记2019-03-13T00:00:00-06:002019-03-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-03-13:/reading-list/Filosofihistorie-2/<p>「西方哲学史」第二章智者派和苏格拉底 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>没有什么确实是正当的。我们所谓的正当就是强权。有强权才有公理。</p>
<p>人是万物的尺度。</p>
</blockquote>
<h1>综述</h1>
<p>「西方哲学史」的第二章内容,本章主要描述了和苏格拉底同一时代的哲学流派。
主要有两大派别,其一被称为智者学派,从这个学派中走出了不少的诡辩学家;另一派就是苏格拉底。
在这个时期,古希腊的哲学家们将目光从自然转移到了人类自身身上。
他们对人类自身的认识论进行了深入的思考。
从这个时期起,人们开始怀疑「自己」了。</p>
<h1>结构和细部</h1>
<h2>智者派</h2>
<p>从前450年开始,哲学家不再简单去观察事物,然后下断言。人类自身本性成为了怀疑对象。思想被拉回到自身。人类开始“反思”。
人类本身成为了人类思考的重点,由此进入了「人类中心论时期」。</p>
<p><strong>智者派</strong>: 启蒙人民的教学,他们教授参与政治生活必须的科目: 论辩术、修辞学、市政学。
他们认为,所谓的正当和正义仅仅是一种独断传统的表达或是独断统治强迫人民接受的。</p>
<p>智者派的一个分支渐渐演变为了诡辩派。</p>
<p><strong>高尔吉亚</strong>
高尔吉亚提出了三个命题:
1. 无物存在
2. 如果有物存在,也不可知
3. 即使可知,也不能把这样的知识告诉别人。</p>
<p><strong>色拉叙马霍斯</strong></p>
<p>正义所满足的是最强者的利益。
正义就是强权。</p>
<p><strong>普罗泰哥拉</strong>
人是万物的尺度。(有点「实用主义」的感觉)
<strong>事物不以它们本来的面目向人们显示,在任何时候都只显示其某些方面或特性。</strong></p>
<p>普罗泰哥拉的思想暗示了一种认识论的视角主义(perspectivism): <strong>在任何时候我们的知识都以视角为条件,在视角的基础上建立知识。</strong>
而这样的视角主义又暗示了认识论的多元论: <strong>观察事物的方式多样的。</strong>
我们对事物的认识取决于我们的活动或情境。</p>
<p><img alt="History" src="http://zhouyichu.com/images/history.png"/></p>
<h2>苏格拉底</h2>
<p>苏格拉底感兴趣的主要不是自然哲学,而是认识论--借助对话澄清概念(下定义)--和伦理-政治问题。</p>
<p>苏格拉底承认有普遍的善和正当的价值规范存在。</p>
<p>对知识分为三类:
1. 有关是什么的事实知识
2. 对应当是什么的规范性洞见
3. 对真正自我的洞见</p>
<p>苏格拉底试图通过和别人「讨论」,建立以一种关于「善」、「美德」的参考系。</p>
<h1>评价</h1>
<p>这一章的内容比较平实,也许是因为这一段历史时期的留存的资料不是很多的缘故吧。
尤其是苏格拉底,他自己没有留下任何文字著作。
我们只能通过柏拉图留下的「对话」来间接了解苏格拉底,增加了我们理解苏格拉底的困难。</p>
<h1>和我的关系</h1>
<p>在这一章中,有两个观点非常吸引我:
1. 普罗泰哥拉的「人是万物的尺度」。这一观点包含了后世的「实用主义」思想。世界上任何的事物的价值取决于人们使用它的情景。没有绝对的好与坏。一件事的好与坏,只取决于我们自身对这件事的反应。
2. 苏格拉斯讨论式的教学。不同的学科需要采取不同的教学方法:
1. 权威主义的方法。教师直接将知识灌输给学生,学生失去了第一手的体验与经验。应试教育就是这种方法的集大成者。
2. 自由主义的教学。这种方法把学生看成是一棵树,教师只是负责浇水和营养,但不干涉它的成长。但是,依靠学生自己几乎是不可能学习所有的知识的。
3. 苏格拉底式的方式: 教师与学生进行对话,一起与学生进行学习。这就是所谓的「通过讨论而探索」。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月12写作并发表</li>
</ul>西方哲学史第一章:前苏格拉底哲学 读书笔记2019-03-12T00:00:00-06:002019-03-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2019-03-12:/reading-list/Filosofihistorie-1/<p>「西方哲学史」第一章前苏格拉底哲学 读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">西方哲学史</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Gunnar Skirbekk, Nils Gilje</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">上海译文出版社2016年</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-3</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787532770168</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>哲学答案的重要性不在于它们能够被「运用」,而在于它们能够使我们对事情理解得更好</p>
<p>哲学可以区别于四种其他活动: 创造性写作、实验科学、形式科学和神学。</p>
</blockquote>
<h1>综述</h1>
<p>这是西方哲学史的第一章,主要是讲述了前苏格拉底时代的各个哲学家的主要思想。
从现在的角度来看,这些想法有些简单了,但是非常具有启发性。
原子论、毕达哥拉斯学派等等思想,都在后世起到了非常重要的作用。
这段时期也被称为「宇宙论时期」。主要是在前600年到前450年。</p>
<p>同时,在这一章中,作者也阐述了一个非常重要的问题--<strong>哲学问题的答案并不重要,重要的是思考的过程</strong></p>
<p>在主要介绍古希腊的哲学家以外,这一章还包括了一些印度和中国的哲学思想,但是作为一个中国人来看,西方看待孔子和老子的思想还是有些怪怪的。
总觉得他们分析的角度很奇怪。</p>
<h1>结构和细部</h1>
<p>公元前6世纪。</p>
<p>区别于哲学的四种其他活动:
- 创造性写作: 哲学必须做出真假的判断
- 实验科学: 不依赖与实验
- 形式科学: 必须对自己的预设进行反思,对预设进行讨论及论证其正确性。
- 神学: 没有固定的出于宗教理由而无法放弃的预设</p>
<p>哲学思想所必须包含的四点:
1. 问题
2. 论据
3. 答案
4. 蕴意</p>
<p>其中的答案是最不重要的。</p>
<h2>第一代哲学家: 泰勒斯,阿那克西曼德和阿那克西米克</h2>
<p>泰勒斯声称「万物是水」,这个世界是水形成的一个循环: <strong>从水到其他物体、从其他物体又到水。</strong>
泰勒斯是在寻找这个世界的最基本的建筑材料,变化中的不变性。</p>
<p>泰勒斯是从生活经验中总结出这一结论的,它的这种「观测-->得出结论」的方式,开启了后世的科学研究.</p>
<p>在这个过程中包含了这样的一种假设: <strong>万事万物都是可以为人类思想所理解的,哪怕是宇宙最远的角落,都是人类思想可理解的。</strong>
泰勒斯因此被称为第一个哲学家和科学家。</p>
<p>泰勒斯的思考可以归结为:
前提: 变化是存在的
1. 问题: 所有变化当中的不变元素是什么?
2. 论据: 对水的观察
3. 答案: 水是所有变化中的不变的元素
4. 蕴意: 万物是可以理解的</p>
<p>阿那克西曼德和阿那克西米尼提出了和泰勒斯同样的问题。
但是他们不同意泰勒满的结论,如果水能变成任务的东西,那么我们可以把始基定义为任何东西。</p>
<p><strong>阿那克西曼德</strong>
如果水能变成任何东西,那么这就意味着任何事物都能转变为任何事物。
阿那克西曼德认为始基是apeiron,它在空间和时间上是没有边界的。
apeiron和水不同,它不是一种可以被观察到的东西。
也就说,阿那克西曼德认为感性的世界是由一种非感性的东西组成的。</p>
<p><strong>阿那克西米尼</strong>
他更加关注变化状态。
认为「气」是始基。</p>
<p>第一代希腊哲学家: 泰勒斯、阿那克西曼德、阿那克西米尼.
他们也被成为米利都学派的自然哲学家。</p>
<h2>第二代哲学家: 赫拉克利特、巴门尼德和芝诺</h2>
<p>这三人属于第二代哲学家,他们不仅观察自然,而且还研究第一代哲学家的论述。
第一代哲学家假定自然中发生着变化,这是他们的前提假设。</p>
<p>第二代哲学家对这个假设提出了疑问。</p>
<p>赫拉克利特认为万物都处于不断的变化或流动中;巴门尼德则认为没有任何东西是在变化的状态之中。</p>
<p><strong>赫拉克利特</strong>:
1. 万物处于流动状态之中,
2. 但是变化是根据一种不变的规律发生的
3. 这种规律包含了对立面的相互作用
4. 但是这种对立面相互作用的方式,作为一个整体创造出了和谐。</p>
<p><strong>巴门尼德</strong>
认为一切事物的多样性和变幻只是一个幻觉,整个宇宙只有一个东西,并且永恒不变、不可分割,他称之为“一”.</p>
<p><strong>芝诺</strong>
- 巴门尼德的学生
- 提出了阿基里斯和乌龟赛跑的悖论</p>
<h2>第三代哲学家: 恩培多克勒和阿那克萨戈拉</h2>
<p>第二代哲学家,他们有的人认为万物是处于流动中的;有的人认为世界是静止的。
第三代哲学则认为真理存在于两者之间,因此而被称为居间的哲学家。</p>
<p><strong>恩培多克勒</strong>:
1. 存在着四种不可变化的、原始的元素(火气水土)
2. 除了原始的实体之外,还存在着一些力量: 分裂作用的力量(恨)和统一作用的力量(爱)
3. 四元素在质和量上都是不可变化的,它们永远保持各自的特性。</p>
<p>恩培多克勒试图创建一种既包括变化,也包括不可变的东西的模型。</p>
<p><strong>阿那克萨戈拉</strong>
1. 基础元素是「无数的」
2. 只有一种力量: 心灵</p>
<p><strong>德谟克利特</strong>
- 原子论: 只存在着一种基础元素: 不可分割的微小粒子。</p>
<h2>毕达哥拉斯学派</h2>
<p>该学派认为这个世界可以用「数学」来描述,尝试从数学角度来描述整个世界。
他们认为数学结构是所有事物的基础。
任何事物都会毁坏,而数学不会。因此,数学是自然中的不变者。</p>
<h2>古代印度思想</h2>
<p>《吠陀》宗教文本
宗教中的神祇常常与种种自然力量相联系。
他们的世界是宇宙与混沌之间的永恒的战斗。</p>
<p>《奥义书》宣扬一种新的宗教和形而上学学说。
- 转世学说,生和死的永恒循环。
- 全部的印度哲学都是在追求救赎,从永恒的生死循环中解脱出来。
- 业,是印度哲学中一个特殊的概念。
- 道德因果性和转世相连接。
- 今生得到更好的「业」,来世能转生为更高级的物种(更高级的种姓)
- 这种哲学世界观为种姓制提供了理论基础</p>
<p>佛教
- 四谛
- 苦谛: 生是受苦;老是受苦;病是受苦;亡是受苦
- 集谛:
- 灭谛:
- 道谛;
- 这个世界是一个过程,而不是事物或实体。</p>
<p>印度教: 《薄伽梵歌》
- 种姓制度是宇宙秩序的不可瓦解的部分
- 个人责任是受他所属的种姓决定的。</p>
<h2>古代中国思想</h2>
<p>中国文明更多的是实践和实用的取向。</p>
<p>儒家
- 一位强烈依恋传统的哲学家
- 孔子捍卫一种直接的社会等级划分,个人的义务与其社会地位联系在一起。
- 人性本善</p>
<p>道家
- 整体论和神秘主义
- 核心概念: 道
- 道先于天地而生,是万物的起源和复归。</p>
<h1>评价</h1>
<p>总体来说,本书的写作是非常严谨的。
从第一章就包含了大量引用看出,这确实是一本值得一读的好书。</p>
<h1>和我的关系</h1>
<p>在这第一章中,我学习到了前苏格拉底时代,各个地区的哲学家们的主要思想。
其中着重介绍了古希腊自然派的哲学家,他们对于这个世界的建模虽然现在看起来非常简单,但是在其中还是能看到他们头脑中闪耀着的智慧之光。</p>
<p>其中最令人震惊的是德谟克利特在几千年前就得出了原子论。
现代科技也是直到近现代才得出的结论,古代的哲学家却仅仅依靠观察和思考,就得出了相似的结论。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月12日写作并发表</li>
</ul>「海伯利安」读书笔记2019-03-10T00:00:00-07:002019-03-10T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-03-10:/reading-list/Hyperion/<p>「海伯利安」读书笔记</p><table>
<thead>
<tr>
<th align="left"></th>
<th align="left"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Title</td>
<td align="left">海伯利安</td>
</tr>
<tr>
<td align="left">Author</td>
<td align="left">Dan Simmons</td>
</tr>
<tr>
<td align="left">Edition</td>
<td align="left">吉林出版社</td>
</tr>
<tr>
<td align="left">Release Date</td>
<td align="left">2014年11月</td>
</tr>
<tr>
<td align="left">ISBN</td>
<td align="left">9787553452937</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>整篇小说是由6个故事组成的。他们分别是:
1. 牧师的故事
2. 士兵的故事
3. 诗人的故事
4. 学者的故事
5. 侦探的故事
6. 领事的故事</p>
<h2>牧师的故事: 为上帝痛哭的人</h2>
<p>杜雷神父被教会放逐来到了海伯利安行星。
在调查这颗行星上一个土著民族的时候,他发现了这群土著的秘密。
这些土著拥有永生不灭的肉体,没有性别、不会年老,即使意外死亡之后还是会复活。
其中的秘密来源于海伯利安上被称为「大哀之君」的伯劳。
这个土著族群中的所有都被寄生了一种奇怪的寄生生物,称为「十字型」。
而这种生物似乎和伯劳又有着千丝万缕的关系。
被这种生物寄生之后,虽然获得了永生不灭的生命,但是也是付出了失去理性的代价。
这个族群中的所有人都失去了人类正常的智力,称为真正的「行尸走肉」。
杜雷神父为了调查清楚其中的原因,自愿被这种生物寄生了。
同时,杜雷神父为了将消息送出海伯利安,带着这种寄生在他身上的生物试图强行突破火焰森林,可是每次都失败了。
神父为了不让自己失去理智,他把自己钉在了一个巨大的树桩上,每天经受雷劈而死,又通过这种寄生生物恢复生命。周而复始,一直持续了7年。
最终被另外一个来寻找他的神父霍伊特解放了。
然而,霍伊特也被这种奇怪的生物寄生了。
为了从这永恒的痛苦中解脱,霍伊特需要再次回到海伯利安。</p>
<h2>士兵的故事: 烽火恋人</h2>
<p>费德曼-卡萨德上校在军事学院里的模拟战争中不断会遇到同一个女子,这个女子每次都会和他在战场上翻云覆雨。
每当卡萨德认为不再会见到她的时候,她总是会适时地出现。</p>
<p>最终又一次,卡萨德受伤迫降在海伯利安上面。
他在海伯利安上又见到了那个女子。
这个女子将他带到光阴冢附近,带引他见到了伯劳。
在伯劳的帮助下,卡萨德进入了一种全新的时间体验中,他的时间流速远远快于他的敌人。
他轻易的将敌人消灭了。
然而,再次和这个女子做爱的时候,他却发现她变成了伯劳,吓得卡萨德赶忙离开了海伯利安。
而现在为了彻底搞清楚这个女子的事情,他需要再次回到海伯利安。</p>
<h2>诗人的故事</h2>
<p>马汀-赛伦诺斯是一个诗人。
因早年的一个意外事故,他失去了语言能力,只能从事最低级的体力劳动。
然而,在艰苦的环境下反而激发了他的艺术才情,他的语言能力也渐渐恢复,写下了知名的「诗篇」。
自此之后,他过上了挥金如土的生活。
后来又因为才情中断,跟着哀亡比利来到海伯利安拓展殖民地。
在开拓殖民地期间,海伯利安上的伯劳开始大屠杀。
然后,令人震惊的是,每当伯劳开始屠杀,诗人的灵感就层出不穷,不断写下令人沉醉的诗篇。
后来哀王比利发现了这两件事的相关性,决定完全毁掉诗人的著作,希望以此来阻止伯劳的屠杀,没想到却被伯劳给杀了。
而诗人的著作也被毁去了大半。
为了重新获得创作的灵感,诗人需要再次回到海伯利安。</p>
<h2>学者的故事: 苦涩的忘川之水></h2>
<p>索尔是一个犹太裔的学者,他和妻子女儿生活在一个以农业为主的星球上,恬静而美好。
女儿长大后成为了一个考古学者。
有一次她在海伯利安的光阴冢里进行考古的时候,不小心被时间潮汐所击中。
从此患上了一种奇怪的病--她的时间是在倒流的。
也就说她的年龄(包括记忆)越来越年轻,直到最终有一天她会回退到婴儿状态。</p>
<p>自从她得了这种病症之后,她就回到了父母身边疗养。
她的父母尝试过了所有的方法,都失败了。
在妻子因一次意外而去世之后,索尔终于停止了对诸神的请求,决意带着已经退化为婴儿的女儿回到海伯利安寻求最终的救赎之道。</p>
<h2>侦探的故事: 漫长的告别</h2>
<p>拉米亚是一个私人侦探。
再一次的业务中,她接到了来自赛博人的委托。
在小说中,赛博人拥有和人类一模一样的肉体,但是他的意志却是由人工智能所控制的。
这个自称强尼的赛博人,声称被人谋杀了。但是因为它本质是人工智能,所以很快就复活了。但是他失去了三天记忆。
他请求拉米亚帮助他找出谋杀他的人,并调查清楚他为什么会被杀。
不落俗套的,在调查过程中,强尼和拉米亚产生了爱情,并且正式成为了恋人。</p>
<p>随着调查的深入,他们发现了种种奇怪的事情都是围绕着海伯利安上的光阴冢的。
因此他们打算前往海伯利安进行调查。
但是,即将踏上前往海伯利安的飞船的时候,已经彻底将意识传递到肉身中的强尼再次被杀。
因此此次他的意识已经完全转移到了肉体中,这次死亡的他已经无法复活了。
而拉米亚带着痛苦踏上了前往海伯利安的飞船。</p>
<h2>领事的故事: 永恒的西丽</h2>
<p>领事的故事是从他的祖父祖母开始的,祖母是一个殖民行星上的土著后代,而祖父则是霸主政府军队中的一个普通船员。
当年,霸主吞并这个星球的时候,屠杀了一部分的反抗者。
其中就包括了领事的父母。
领事从小就对霸主充满了仇恨。
在他担任霸主在海伯利安的领事期间,他挑拨驱逐者和霸主之间的关系,引发了霸主和驱逐者的全面开战,并且他利用驱逐者的技术力量,彻底打开了光阴冢中的力场,释放了伯劳.</p>
<p>在领事讲述完最后一个故事之后,「海伯利安」的第一本也就结束了。
这6个故事或多或少都和海伯利安这颗行星产生了联系,并且在讲述故事的过程中,作者也渐渐向读者展开了一幅宏大的未来世界展望。
从中能看到很多熟悉的科幻元素,比如赛博朋克、人工智能、时空穿越等等。</p>
<h1>感想</h1>
<p>在网上很多关于「海伯利安」的评价中,都将其与阿西莫夫的「基地」系列进行类比。豆瓣上对这个科幻系列的评分也很相近。
但是,从我看完这一部的「海伯利安」我就觉得,它比「基地」系列欠缺了一下东西。
虽然我承认这也是一部融合了众多元素的优秀科幻小说,但是正因为它融合了太多的东西,让一下子无法抓住重点。
反而失去了很多可读性。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月10日写作并发表</li>
</ul>理性主义 v.s 经验主义2019-03-09T00:00:00-07:002019-03-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-03-09:/words/Rationalism-vs-Empiricism/<p>在<a href="http://zhouyichu.com/words/Skepticism/">上一篇博文</a>中,我说明了「怀疑论」是如何对现代科学的产生的质疑,并且我也说明了应对之道。
这篇博文,我想要分析一下现代科学发展的两块基石思想: <a href="https://zh.wikipedia.org/wiki/%E7%90%86%E6%80%A7%E4%B8%BB%E4%B9%89">理性主义</a>和<a href="https://zh.wikipedia.org/wiki/%E7%BB%8F%E9%AA%8C%E4%B8%BB%E4%B9%89">经验主义</a>,以及他们的局限性。</p>
<h1>理性主义</h1>
<p>理性主义从古希腊时代就开始了发展。
亚里士多德的<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E6%AE%B5%E8%AB%96">三段论</a>思想就是典型的理型主义: 由一个大前提和一个小前提,从而推导出一个结论。
推导过程必然是符合逻辑的。
这是目前为止人类认识世界最重要的一个思想工具之一。
但是,知道笛卡尔之前,「三段论」也只是一种非常初级的思维工具,还没有发展成为一个成熟的思想体系。</p>
<p>欧几里得的「<a href="https://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E5%8E%9F%E6%9C%AC">几何原本</a>」则将这个思维工具进一步发展了。
在「几何原本」中,欧几里得通过预设的五个不证自明的公设,直接推导出了整个几何系统。
整个过程简直是叹为观止,集优美与和谐于一身。
「几何原本」体现出的思想也是非常精彩: 从几个基本公设开始,利用逻辑不断演绎推导,最终能够展现出整个几何世界的全貌。
这充分体现出了理性主义的力量。</p>
<p>在此之后的笛卡尔更是将这种思想推广到了哲学领域,确立了理性主义的哲学体系: 从公设开始用演绎推理的方式推导出整个世界。
他提出的笛卡尔坐标系将代数与几何完美的融合到了一起,也证明了演绎推理不止可以应用在几何领域。
可以说,笛卡尔是当时数学的集大成者 …</p><p>在<a href="http://zhouyichu.com/words/Skepticism/">上一篇博文</a>中,我说明了「怀疑论」是如何对现代科学的产生的质疑,并且我也说明了应对之道。
这篇博文,我想要分析一下现代科学发展的两块基石思想: <a href="https://zh.wikipedia.org/wiki/%E7%90%86%E6%80%A7%E4%B8%BB%E4%B9%89">理性主义</a>和<a href="https://zh.wikipedia.org/wiki/%E7%BB%8F%E9%AA%8C%E4%B8%BB%E4%B9%89">经验主义</a>,以及他们的局限性。</p>
<h1>理性主义</h1>
<p>理性主义从古希腊时代就开始了发展。
亚里士多德的<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E6%AE%B5%E8%AB%96">三段论</a>思想就是典型的理型主义: 由一个大前提和一个小前提,从而推导出一个结论。
推导过程必然是符合逻辑的。
这是目前为止人类认识世界最重要的一个思想工具之一。
但是,知道笛卡尔之前,「三段论」也只是一种非常初级的思维工具,还没有发展成为一个成熟的思想体系。</p>
<p>欧几里得的「<a href="https://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E5%8E%9F%E6%9C%AC">几何原本</a>」则将这个思维工具进一步发展了。
在「几何原本」中,欧几里得通过预设的五个不证自明的公设,直接推导出了整个几何系统。
整个过程简直是叹为观止,集优美与和谐于一身。
「几何原本」体现出的思想也是非常精彩: 从几个基本公设开始,利用逻辑不断演绎推导,最终能够展现出整个几何世界的全貌。
这充分体现出了理性主义的力量。</p>
<p>在此之后的笛卡尔更是将这种思想推广到了哲学领域,确立了理性主义的哲学体系: 从公设开始用演绎推理的方式推导出整个世界。
他提出的笛卡尔坐标系将代数与几何完美的融合到了一起,也证明了演绎推理不止可以应用在几何领域。
可以说,笛卡尔是当时数学的集大成者,也为整个科学发展提供了最重要的思想基石之一--理性主义。</p>
<h1>经验主义</h1>
<p>然而,仅仅拥有「理性主义」这一块基石,还不足以发展出现代科学的繁荣景象。
我们还欠缺另外一种思维工具。
之前说到的「理性主义」来源于数学家的努力,而下一个思维工具「经验主义」则是来自于自然科学家的不断探索了。</p>
<p>在「经验主义」诞生之初,其实为了推翻当时占垄断地位的「理性主义」思潮的。
经验主义者们批评「理性主义」主要集中一下几个方面:
1. 理性主义,或者说数学上的逻辑推理只是通向真理的桥梁,而不是真理本身
2. 假如所有的世间的一切真如理性主义所设想的都是建立在一些非常基本的基础假设之上的话,那么我们其实根本无法产生新的知识。
因为,在这种情况下,所谓新的知识其实只是从基础公设推导出来的,这些只是已经包含在了基础假设之中。
既然如此,我们为什么还要发展科学?</p>
<p>经验主义的观点立足于自然,认为我们应该通过自己的观察来理解世界: 通过观察自然界中许多个个别现象,然而总结出普遍的规律。
这样的方式称为「归纳法」。
经验主义者更加推重「归纳法」而不是「演绎法」。</p>
<p>当然,在自然科学家们提出这些批评之后,数学家们也提出了他们的反驳: 虽然自然科学家们通过观察自然,也许能获得新的知识,但是我们如何能肯定得到的知识是可靠的?
它们是直接从自然界中总结得出的,而没有经过严谨的逻辑推理,因此得到的结果并不可靠。</p>
<h1>比较</h1>
<p>下面的表格总结这两种思维方式的不同特点:</p>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">理性主义</th>
<th align="center">经验主义</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">代表人物</td>
<td align="center">数学家</td>
<td align="center">自然科学家</td>
</tr>
<tr>
<td align="center">思维方法</td>
<td align="center">演绎法</td>
<td align="center">归纳法</td>
</tr>
<tr>
<td align="center">优点</td>
<td align="center">结论可靠</td>
<td align="center">能够产生新知识</td>
</tr>
<tr>
<td align="center">缺点</td>
<td align="center">公设不一定可靠 不能产生新知识</td>
<td align="center">结论不可靠</td>
</tr>
</tbody>
</table>
<p>其实知道今天,这两派的争论也依然没有停歇,相互都没能完全说服对方。
但是,这却不妨碍现代科学依赖这两种思维方式进行快速发展。
其实,我认为调和这两种思想的功劳应该归功于我在上一篇博文中提到的「实用主义」。
我们不需要非要分清楚,谁对谁错。
我们只需要保证在当前条件下,我们的思维工具足够好用就可以了。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月9日写作并发表</li>
</ul>「哲学家们都干了些什么」读书笔记2019-03-09T00:00:00-07:002019-03-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-03-09:/reading-list/What-Do-Philosopher-Do/<p>「哲学家们都干了些什么」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">哲学家们都干了些什么</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">林欣浩</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">读客版</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787550242234</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>在他们开始烧书的地方,他们最终会烧人。</p>
<p>只有弱者才会去讲理,强者不需要讲理。</p>
<p>迄今为止用来使人变得道德的一切手段都是不道德的 --尼采</p>
<p>生活中给我们最大痛苦的,往往不是那些有大权力的强者,而是掌握了小权利的弱者</p>
<p>科学就是建立在经验主义基础上的,以实用主义为原则筛选出来的,可以被证伪的理论</p>
</blockquote>
<h1>综述</h1>
<p>这是一本哲学的科普书籍,作者以比较幽默的口吻阐述了哲学的发展历史,其中还夹杂了不少历史上著名哲学家的不少生平趣事。
阅读过程趣味性不少,但是在介绍哲学的时候,略去了一部分分支内容,有些遗憾。</p>
<h1>结构和细部</h1>
<p>全书一共分类两部分,第一部分「理性的崛起」,主要讲述了从苏格拉底到黑格尔的各家哲学流派的主要思想。
在这一段时间内,人们苦苦追求所谓的世界的真理,试图用一种宏大的哲学体系来解释这个世界上的一切事物。
而研究这种涵盖世间一切的学问,就是形而上学。</p>
<p>本书的第二部分,则更加注重说明了现代科学的发展是如何改变人们的哲学认知的。
在这个过程中,一些哲学家开始将目光放到人类意识本身上,而不是苦苦思索自然了,
比如叔本华、尼采等人。
两个部分详细的内容如下所示:</p>
<h2>理性的崛起</h2>
<ul>
<li>哲学最本质的问题:<ul>
<li>我是谁</li>
<li>我从哪来</li>
<li>我到哪去</li>
</ul>
</li>
<li>哲学的精神: 质疑一切</li>
<li>基督教层利用哲学进行传教</li>
<li>笛卡尔<ul>
<li>怀疑整个世界</li>
<li>如何严格的证明这个世界是真实的?</li>
<li>我思故我在</li>
<li>笛卡尔坐标系</li>
<li>确立了理性的哲学体系: 从公设开始用演绎推理的方式推导出整个世界</li>
<li>形而上学(metaphysics)</li>
</ul>
</li>
<li>二元论<ul>
<li>我们的心灵和心灵以外的东西</li>
<li>我们在自己的精神世界里是无敌的</li>
<li>发展到极致: 外界的一切都无法影响我的内心</li>
</ul>
</li>
<li>唯我论: 我么只能确认自己的存在,外界的一切存在不存在我不知道<ul>
<li>很难被反驳,我们永远可以质疑自己生活的世界是一片幻觉</li>
<li>我们不需要害怕任何事物,只要面对自己的内心就可以了</li>
</ul>
</li>
<li>史宾诺莎<ul>
<li>实体: 自己是自己的原因,外物不能摧毁它。</li>
<li>世间的一切都是实体的一部分</li>
</ul>
</li>
<li>科学家<ul>
<li>数学只是人类认识世界的标尺?</li>
<li>科学家利用归纳法认识世界: 通过观察多个个别的现象,总结出普遍的规律</li>
<li>数学家利用演绎法认识世界</li>
<li>演绎法无法创造新的知识</li>
<li>数学是通向真理的桥梁,但不是真理本身</li>
<li>归纳法永远只能立足于有限的事实之上,而不可能把所有的现实全部实验一遍</li>
<li>洛克: 不相信任何公设</li>
</ul>
</li>
<li>理性主义 v.s 经验主义<ul>
<li>理性主义:利用公设推理整个世界<ul>
<li>数学派哲学家</li>
<li>演绎法</li>
<li>无法产生新的知识;公设未必可靠</li>
</ul>
</li>
<li>经验主义: 利用归纳法理解整个世界<ul>
<li>科学派哲学家</li>
<li>归纳法</li>
<li>产生新的知识;结论不能保证绝对正确</li>
</ul>
</li>
</ul>
</li>
<li>机械论<ul>
<li>用物理学来解释包括人类意识在内的整个世界,这种观点成为机械论</li>
<li>如何判断一个人的意识消失了?</li>
<li>推论: 决定论. 未来是按照规律已经注定好了的</li>
<li>人没有自由意志?</li>
</ul>
</li>
<li>
<p>休谟</p>
<ul>
<li>"我"只是一堆经验片段的集合</li>
<li>经验之外的东西,我不知道</li>
<li>唯一可靠的两种东西:<ul>
<li>不依赖经验的知识</li>
<li>我们自己感受到的经验</li>
</ul>
</li>
<li>因果律未必是可靠的: 我们发现两件事总是同时发生,我们就期待它们能再次一起发生。但这其中并没有可靠的根据。</li>
<li>相关性不代表因果性</li>
<li>如何证明物理规律的普适性?</li>
<li>怀疑论 v.s 决定论</li>
</ul>
</li>
<li>
<p>康德</p>
<ul>
<li>人类无法真正理解这个世界</li>
<li>人类只能看到表象的世界</li>
<li>时间、空间、因果律是先于经验的</li>
<li>二律背反</li>
<li>不是所有的事物都可以通过理性来理解</li>
</ul>
</li>
<li>黑格尔<ul>
<li>辩证法: 这个世界是矛盾共存的的</li>
<li>一个正题总会存在一个反题与之对应</li>
<li>正题、反题最终会升华成为一个合题(产生新的正题和反题)</li>
<li>绝对精神是一种终极状态</li>
<li>历史不是人创造的,也不是个别事件堆砌的,历史有自己的必然的进程</li>
</ul>
</li>
</ul>
<h2>理性的陨落</h2>
<ul>
<li>叔本华<ul>
<li>康德的继承者</li>
<li>生命意志: 一股永不停歇的力量,它驱使着万事万物去运动,去发展</li>
<li>理性是短暂的,软弱的;生命意志确实永不停歇的</li>
<li>悲观主义: 生命意志是邪恶的,是痛苦的源泉。</li>
<li>苦行禁欲</li>
</ul>
</li>
<li>
<p>尼采</p>
<ul>
<li>叔本华的继承者</li>
<li>权力意志:<ul>
<li>强者: 积极向上,勇于进取,勇于牺牲,善于创造</li>
<li>弱者: 胆小,保守,善妒,虚伪</li>
</ul>
</li>
<li>两种道德: 弱者的道德(奴隶道德)</li>
<li>弱者的道德(奴隶道德):<ul>
<li>表面上: 同情,仁慈,谦卑,平等</li>
<li>本质上: 弱者为了掩盖对强者的恐惧、嫉妒和自私,借助奴隶道德去限制强者</li>
</ul>
</li>
<li>强者的道德(贵族道德):<ul>
<li>崇尚强大,特立独行,鄙视软弱,追求创新</li>
</ul>
</li>
<li>奴隶道德总是在禁止;规则道德则是在鼓励人们自由创造</li>
<li>尼采本人不反对奴隶道德,但是反对把奴隶道德强加在强者身上。(圣母心?章北海,韦德。)</li>
<li>生活中给我们最大痛苦的,往往不是那些有大权力的强者,而是掌握了小权利的弱者(强烈同意这句话)</li>
<li>超人: 不一定要是总统,将军;而是能够完全按照自己的意志行动、能够充分发挥自己的创造力,并且能够摆脱弱者束缚的强者。</li>
<li>尼采的价值不在于提出了一种新的形而上学,而是摧毁了传统的西方道德观</li>
</ul>
</li>
<li>
<p>进化论</p>
<ul>
<li>生物的基因信息是可以遗传给下一代的</li>
<li>在遗传的时候,基因会发生不可控的变异</li>
<li>进化论并不是「进化」而只是「演化」</li>
</ul>
</li>
<li>
<p>逻辑实证主义</p>
<ul>
<li>利用逻辑去解释一切事物</li>
<li>罗素、维特根斯坦</li>
</ul>
</li>
<li>
<p>实用主义</p>
<ul>
<li>对我们有用的就是真理,没用的就是谬误</li>
<li>启发: 遇到问题解决问题</li>
<li>例子: 西方国家形成工会机制,解决劳资矛盾,而不是诉诸武装革命;美国法律采用判例法,通过每一次的审判,不断纠正、完善国家法律。</li>
</ul>
</li>
<li>
<p>波普尔</p>
<ul>
<li>证伪主义</li>
<li>科学理论必须能提出一个可供证伪的事实。</li>
<li>所有的科学理论都是一种假说,科学家没有办法证实任何一种科学理论。</li>
<li>但是,科学理论可以给别人提供验错的机会。</li>
<li>不可证伪的命题不一定是错误的命题,而是无法用经验检验的命题</li>
<li>「科学」的进化论</li>
<li>没有绝对的真理,理论需要永远不停的改进</li>
<li>永远不会有一劳永逸的系统、制度,必须不断接受证伪,不断迭代更新</li>
</ul>
</li>
<li>
<p>证伪主义的问题</p>
<ul>
<li>人类永远无法消除实验误差,永远无法判定一个错误数据的出现是因为实验误差还是因为理论错误</li>
</ul>
</li>
<li>
<p>科学</p>
<ul>
<li>科学只是众多描述世界的工具中的一种</li>
<li>其他工具: 宗教、占星术、巫术</li>
<li>判断一个工具是否正确:<ul>
<li>经验主义: 能够被人切实的感受到经验,能够拿出证据证明论点</li>
<li>实用主义: 理论必须是实用的</li>
</ul>
</li>
</ul>
</li>
<li>形而上学<ul>
<li>人类是被理性束缚的物种</li>
<li>因为所谓的「神迹」,其实只是一种违反常规的事物。</li>
<li>而「常规」是一个理性的概念。</li>
<li>如果真的相信一种宗教,那么也就无所谓神迹不神迹的了。</li>
<li>形而上学无法回答人类的终极问题</li>
</ul>
</li>
<li>
<p>萨特</p>
<ul>
<li>存在主义</li>
<li>只有「我存在」这件事是唯一确定的</li>
<li>存在先于本质</li>
</ul>
</li>
<li>
<p>加缪</p>
<ul>
<li>虚无主义</li>
<li>整个世界是没有目的的,是荒谬的</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>整本书短小精炼,阅读体验非常好。
对于哲学史感兴趣的人,都应该读一读这本书。</p>
<h1>和我的关系</h1>
<p>以前虽然零星地看过一些书籍,但是还没有看过一本能够把历史上这么多哲学们有机统一起来的书籍。
这本书对我理解这个世界的帮助很大。
同时,也正是这本书促使我开始阅读「西方哲学史」这样的大部头著作。
目前正在慢慢啃「西方哲学史」,感觉非常有意思。</p>
<h1>更新日志</h1>
<ul>
<li>2019年3月9日写作并发表</li>
</ul>怀疑论2019-03-02T00:00:00-07:002019-03-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-03-02:/words/Skepticism/<p>因果论是否可靠?物理规律是否普世?</p><p>曾经读过一些怀疑主义的文章,当时阅读的时候,被这种思想震惊了一下。
一旦,以怀疑主义的眼光来看待这个世界,我们就没有必要继续发展科学了。</p>
<p>自从近代科学发展以来,我们认识世界的方法就是依靠不断观察这个世界,利用经验总结出关于这个世界的规则,这就说所谓的归纳法。
归纳法几乎是所有自然科学的基础方法论。</p>
<p>然而,怀疑主义的哲学家<a href="https://zh.wikipedia.org/wiki/%E5%A4%A7%E5%8D%AB%C2%B7%E4%BC%91%E8%B0%9F">休谟</a>却认为这样的方法论未必是对的。
在他看来,归纳法永远只能立足于有限的事实上面,而不可能把所有的现实的全部实验一遍。
比如,你看到苹果离开树枝之后就掉落到了地上,但你永远无法保证下一次苹果离开树枝之后还会掉落到地方。
你可能说这是一定会发生的,因为万有引力保证了苹果没有外力的支撑的情况下,一定会掉落到地上。
但是,需要明白的是,万有引力本身也是通过归纳法得到的结果,万有引力不足以成为充分的理由来保证下一次苹果还是会掉落的地上。
严格来说,我们永远无法保证。</p>
<p>这也许有点绕,但是仔细想想吧,我们只能依靠已经发生的事实来总结规律,但是谁又能保证将来在同样的情况下,同样的事一定会发生呢?
本质上来说,休谟质疑的就是「因果论」。
两件事先后发生,不代表一定存在了因果关系。
这样的思想可是动摇了整个科学发展的基石啊!
当我第一次阅读到相关的观点时候,确实被震撼了。</p>
<p>更进一步,除了怀疑「因果论」以外,怀疑主义者们更加怀疑的是,这个世界上的规则是不是普世的?
不能因为我们永远只观察到一种现象,就说明其他的现象就一定不会发生。
比如著名<a href="https://zh.wikipedia.org/wiki/%E9%BB%91%E5%A4%A9%E9%B5%9D%E6%95%88%E6%87%89">黑天鹅</a>的例子,在发现澳洲之前,人们普遍认为这个世界上只存在白天鹅。
但是在欧洲人登陆澳洲之后,才发现其实天鹅也可以是黑色的。
本质上,这一条怀疑其实是在怀疑这个世界上的规律是否具有普适性。
我们在地球上观察自然得出的各种各样的规律,是否是普世的,如果转移到其他星球上,这些规律是否还是成立?</p>
<p>怀疑论的这两点质疑,对于科学发展的基础方法论产生巨大的影响。
如果「因果论」不可靠,规律又未必是「普世」的,那么我们为什么还需要发展科学?</p>
<p>好在,后来出现了另外两种哲学思想,挽救了人类的科学发展。
它们分别是: <a href="https://zh.wikipedia.org/wiki/%E5%AE%9E%E7%94%A8%E4%B8%BB%E4%B9%89">实用主义</a>和<a href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E8%AF%81%E4%BC%AA%E6%80%A7">证伪主义</a></p>
<p>实用主义是说,我们不需要纠结我们所发现的规律是否就是真理,因为我们无从判断。
对于我们人类来说,能够指导我们对未来做出预测的理论,都可以是认为是真理;而对我们无用的理论,都可以认为是谬误。
这样的思想用一句谚语来说就是: 兵来将挡,水来土掩。
我们的行动准则就是遇到问题解决问题,不要太纠结所谓的终极真理。
这虽然听起来很功利,但是在生活中却是非常有效的一种策略。
比如,资本主义在发展过程中,发现如果对于工人阶级压榨得太过,会导致罢工甚至是暴力革命,于是他们就同意建立工会来保证工人的权益。而不是用暴力革命来建立一种新的社会制度。
再比如美国的判例法,通过每一次的判案来不断修正法律,而是死板的执行一套万年不变的呆板法律。
通过一次一小步的改进,不断完善系统,这就是试用注意的核心。</p>
<p>而由<a href="https://zh.wikipedia.org/zh-hans/%E5%8D%A1%E5%B0%94%C2%B7%E6%B3%A2%E6%99%AE%E5%B0%94">波普尔</a>提出的证伪主义是指,任何科学理论都必须能够提出一个可供证伪的事实,也就说,它能够提供别人验错的机会。
与之对应的就是宗教,宗教的一些论断其实是无法被证伪的。
比如,「上帝造人」这个说法其实是永远无法被证伪的,我们永远无法设计出一个实验来验证这个理论。
反过来说,「进化论」却是一种可以被证伪的理论,因为一旦我们某一天发现了和恐龙同一时代的人类化石,那么「进化论」就是错的。
因此,我们常说宗教不是科学的。
但是,需要牢记的是,<strong>不可证伪的命题不一定是错误的命题,而只是无法用经验检验的命题</strong>。
所以,我们还是需要对未知保持敬畏的。</p>
<p>结合实用主义和证伪主义,我们可以对怀疑论者这样的回答:
<strong>在人们发现反例来证伪一个理论之前,我们就认为这个理论是正确的。</strong>
这就是说,我们的行动准则可以是这样的:
- 质疑因果律? 没关系,我们就假设存在因果律,等将来某一天发现因果律不可靠的时候,我们再想办法解决。
- 质疑普适性?没关系,我们假设规律是具有普适性的,等将来某一天发现规律不普世的时候,我们再想办法解决。
- 在所谓的「某一天」之前的,我们就认为我们的目前的理论是正确的,并且可以用它来指导我们的生活。</p>
<p>这就是说,我们不假设这个世界上存在一个所谓永不出错的终极真理,我们永远利用的是手头上最「正确」的理论。
如果以后发现新的现象与现有理论不符合,我们就修改理论。
这就有点像是科学界中的进化论,科学家们不断演化,提出各种各样的新的理论,而我们人类总是选择最能符合现在所能观察到的现象的理论。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://zh.wikipedia.org/wiki/%E5%A4%A7%E5%8D%AB%C2%B7%E4%BC%91%E8%B0%9F">休谟</a></li>
<li><a href="https://zh.wikipedia.org/wiki/%E9%BB%91%E5%A4%A9%E9%B5%9D%E6%95%88%E6%87%89">黑天鹅</a></li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%AE%9E%E7%94%A8%E4%B8%BB%E4%B9%89">实用主义</a></li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E8%AF%81%E4%BC%AA%E6%80%A7">证伪主义</a></li>
<li><a href="https://zh.wikipedia.org/zh-hans/%E5%8D%A1%E5%B0%94%C2%B7%E6%B3%A2%E6%99%AE%E5%B0%94">波普尔</a></li>
<li><a href="https://book.douban.com/subject/6425061/">哲学家们都干了些什么</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2019年3月2日写作并发表</li>
</ul>控制自己的大脑2019-02-23T00:00:00-07:002019-02-23T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-23:/words/Control-Your-Mind/<p>人类的大脑其实并不完全受到人类主观意识的控制的。
比如,你明明想要减脂,却依然忍不住想要吃一口蛋糕;明明下周就是deadline了,你现在还想要看一部剧。
人脑其实远不如人们设想的那么理性。
但是,在现代社会,诱惑如此多的情况下,如何才能真正掌控自己的大脑,而不是被大脑掌控成为了一个很重要的问题。</p>
<p>首先,我们可以来分析一下,我们的大脑具有哪些已经不适合当前社会的特点:</p>
<ol>
<li>
<p>容易被短期诱惑所吸引。这一点已经通过大量的各种心理实验所证明。这也是容易理解的,我们的大脑成型于几万前,当时的人类还处于茹毛饮血的时代,处于一种吃了这顿不知下顿的状态。
同时,还需要时刻警惕其它大型猎食者的袭击。自然就进化出了短期目标优先的思维惯性。</p>
</li>
<li>
<p>趋易避难。面对两件难易程度不同的事情的时候,我们的大脑倾向于选择容易的事情,以减少不必要的损耗。然而,在当前的社会,如果总是做一些容易的事情,你永远无法走得更远。
在当前的社会,永远要选择做对的事情,而不是简单的事情。</p>
</li>
<li>
<p>大脑时刻处于准备接受信息的状态。这和我们大脑形成于原始的野生环境也是有很大关系的,我们大脑其实一直处于一种「警觉」的状态,一直在利用我们的各种感官分析处理周围发生的一切情况。在这样的机制下,我们的注意力很难集中,经常会被各种微博、新闻转移了注意力。</p>
</li>
</ol>
<p>工作生活阅历的增长,让我越来越觉得正是这些大脑的「本能」阻碍了我们在当前社会的继续成长。
当前社会 …</p><p>人类的大脑其实并不完全受到人类主观意识的控制的。
比如,你明明想要减脂,却依然忍不住想要吃一口蛋糕;明明下周就是deadline了,你现在还想要看一部剧。
人脑其实远不如人们设想的那么理性。
但是,在现代社会,诱惑如此多的情况下,如何才能真正掌控自己的大脑,而不是被大脑掌控成为了一个很重要的问题。</p>
<p>首先,我们可以来分析一下,我们的大脑具有哪些已经不适合当前社会的特点:</p>
<ol>
<li>
<p>容易被短期诱惑所吸引。这一点已经通过大量的各种心理实验所证明。这也是容易理解的,我们的大脑成型于几万前,当时的人类还处于茹毛饮血的时代,处于一种吃了这顿不知下顿的状态。
同时,还需要时刻警惕其它大型猎食者的袭击。自然就进化出了短期目标优先的思维惯性。</p>
</li>
<li>
<p>趋易避难。面对两件难易程度不同的事情的时候,我们的大脑倾向于选择容易的事情,以减少不必要的损耗。然而,在当前的社会,如果总是做一些容易的事情,你永远无法走得更远。
在当前的社会,永远要选择做对的事情,而不是简单的事情。</p>
</li>
<li>
<p>大脑时刻处于准备接受信息的状态。这和我们大脑形成于原始的野生环境也是有很大关系的,我们大脑其实一直处于一种「警觉」的状态,一直在利用我们的各种感官分析处理周围发生的一切情况。在这样的机制下,我们的注意力很难集中,经常会被各种微博、新闻转移了注意力。</p>
</li>
</ol>
<p>工作生活阅历的增长,让我越来越觉得正是这些大脑的「本能」阻碍了我们在当前社会的继续成长。
当前社会,我们比拼的不再是体力而是脑力。
我们不再需要时刻处于「警戒」状态的大脑,也不需要可以节省自己的能量了。
我们需要的是能够在短时间内就能高度集中注意力的大脑,需要的是能够进行长远规划的大脑,需要的是有足够耐心的大脑。</p>
<p>在我自己的实践中,我自己总结出了一些方法来慢慢纠正大脑进化遗留下来的问题。</p>
<ol>
<li>
<p>首先最重要的是,要认识到自己大脑有上述这些弊端。如果你有拖延症,不要责怪自己;如果你总是长时间刷新闻、刷抖音,不要责怪自己;如果你无数次尝试减脂,却总是坚持不下来,不要责怪自己。
你需要记住的是,你的问题,世界上任何一个人都通用拥有。你们大脑的构造是一模一样的,没什么不同。
千万不要因为这些事情而给自己增加压力。
清楚地认识到,这些问题是人类共通的问题是解决这些问题的第一步。
这是最基本的「元认知」。</p>
</li>
<li>
<p>利用大脑其他的特点来克服上述的缺点.</p>
<ol>
<li>我们的身体,包括我们的大脑其实都是喜欢规律化的事物。
规律的生活习惯有助于大脑发挥最大效能。比如,你可以把健身安排一个固定时间,每天3点到4点是健身的时间,雷打不动。
当你把一件事情固化到一段时间以内的时候,你不去做你的大脑都会觉得不舒服。</li>
<li>每天的工作、生活有一条清楚的界限.每天下班之后绝不考虑工作的事情,而工作的时候觉不考虑生活中的琐事。
一旦有一条清晰的界限,大脑就乐于停留在一个主题上,而不会随机乱想了。</li>
</ol>
</li>
<li>
<p>健脑。大脑是可以训练的。
我从去年开始进行冥想训练的,每天15分钟的冥想,效果非常显著。至少我发现自己的思维变得「齐整」得多了。
在开始冥想以前,我的思维其实挺混乱的。总是会有一些杂七杂八的想法在脑海中乱窜,既妨碍了我注意力的集中,也常常导致我失眠。
但是,当我学会冥想之后,我发现其实可以通过冥想来控制自己的意识,让自己平静下来。
自从冥想之后,我已经很少出现失眠的现象了。</p>
</li>
</ol>世界规则2019-02-16T00:00:00-07:002019-02-16T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-16:/words/The-Rule-of-World/<p>关于这个世界规则的疑问</p><p>最近在阅读关于哲学的科普性书籍: 「哲学家都干了些什么」,感觉很有启发性,引起了我不少的思考。
我不是学哲学专业的,只能以自己世俗的眼光来理解。</p>
<h1>规则一定是优美的?</h1>
<p>在众多哲学观点中,最吸引我的是关于这个世界规则的理解。</p>
<p>我的第一个疑问就是,这个世界的规则一定就是优美的吗?</p>
<p>历史上很多前人科学家在理解这个世界的时候,都是尽量以一种优美的模型来给这个世界建模的。
比如,为了满足「天体运行轨道一定是完美的圆」这一看似优美的假设,前代天文学家就用各种大圆套小圆的方式来使得模型符合观测数据,但殊不知他们的假设一开始就是错的。
这个世界的规则未必一定就是优美的。</p>
<ul>
<li>为什么这个世界上的<span class="math">\(\pi\)</span>是一个无限不循环小数?</li>
<li>为什么勾股定理是呈现出<span class="math">\(a^2 + b^2 = c^2\)</span>如此优美的一个公式?</li>
<li>为什么质能方程是如此优美的<span class="math">\(E = mc^2\)</span>?</li>
</ul>
<h1>我们的数学一定是最高效的?</h1>
<p>众所周知,数学是一切科学的基础,我们对于这个世界的认知都是建立在数学工具上面的。
需要注意的是,数学其实仅仅是一个<strong>工具</strong>而已
在「哲学家都干了些什么」这本书中,作者提到了一个很有意思的观点: 数学只是一个认识这个世界所使用的标尺。
既然是一种标尺,那么我们就可以采用不同的刻度。
而且不同的刻度选择,也许会导致认识世界的不同难易程度。
用英制和公制来类比,英制的长度单位是1英尺等于12英寸,而公制的长度单位是1分米等于10厘米。
很显然,公制单位的计算和换算都要比英制容易。
这就是使用不同标尺带来的不同难以程度。
我们没有理由认为我们发展出的数学就一定是一个最高效的认知世界的方法。</p>
<h1>我们认识的规则一定是正确的?</h1>
<p>我曾经看过这样一部科幻小说: 大意是存在一种外星文明,在他们的科技发展过程中,他们发现勾股定理是<span class="math">\(a^2 + b^2 = c^2 + \epsilon\)</span>, 其中<span class="math">\(\epsilon\)</span>是一个常量。
他们一切的科学技术都是建立在这样的公式之上的。
经过漫长的科技发展,他们最终发展出了宇宙航行的技术,然而,直到他们向外太空探索的时候,他们才发现,勾股定理的本来面貌其实是<span class="math">\(a^2 + b^2 = c^2\)</span>,并没有那个常量。
之所以他们得出那个常量,仅仅是因为他们的母星刚好处于一个巨大黑洞的附近,黑洞辐射场改变了他们的数学规律。
然而,一旦他们的飞船脱离了黑洞的影响,勾股定理就恢复了原本的面貌。</p>
<p>这其实是一个细思极恐的故事,想一想我们这个世界中的圆周率<span class="math">\(\pi\)</span>和自然常数<span class="math">\(e\)</span>,会不会有一种毛骨悚然的感觉?</p>
<h1>认知上限</h1>
<p>我们生活在这个世界上,我们显然会被这个世界的规则所制约,永远无法理解这个世界之外的东西。
也就是说,人类的认知是一定存在一个上限的。
这个上限就是我们这个世界的规则。
举一个例子,假如我们用正则表达式来描述世界的规则。
现在用两个正则表达式: <span class="math">\(a^{*} b\)</span>和<span class="math">\(b^{*} a\)</span>来表示两个世界。
在第一个世界中,我们可以利用规则来生成无限个新的字符串:ab, aab, aaab...
但是,在这个世界中的人们,永远无法获悉,其实还存在bba这样的字符串。
这就是上限。
我们永远被我们所生活世界的规则所束缚着。</p>
<h1>更新日志</h1>
<ul>
<li>2019年2月16日写作并发表</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>「自控力」读书笔记2019-02-16T00:00:00-07:002019-02-16T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-16:/reading-list/The-Willpower-Instinct/<p>「自控力」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">自控力</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">Kelly McGonigal</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2012-8</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787514205039</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>自知之明是自控的基础。
认识到自己的意志力存在问题,则是自控的关键。
</p>
<p>每当你试图对抗冲动的时候,无论是避免分散意志力、权衡不同的目标,还是让自己做些困难的事情,你都或多或少地使用了意志力。</p>
<p>最能带给我们动力的事是获得我们想要的,避开我们不想要的。将某种行为道德化,只会让我们对它的感觉更加矛盾。</p>
<p>情绪低落会是使人屈从于诱惑,摆脱罪恶感会让你变得更加强大。</p>
</blockquote>
<h1>综述</h1>
<p>这本书是专门从科学的角度来分析人类的「意志力」这个现象的。
通过综合各个社会、心理学的实验,对「意志力」进行了深入的探讨与分析,并给出相应的应对措施。
书中的一些新理论,未必一定是正确的,但是却给人一种新的考虑事情的角度。
值得一看。</p>
<h1>结构和细部</h1>
<h2>什么是意志力</h2>
<p>首先,我们改变我们对各种诱惑的观点。
我们屈从于各种非理性的诱惑其实是一种本能,既然是本能,不论你怎么反抗,最终都是会失败的。
因此,更好的策略不是去反抗本能,而是要学会利用这些本能去做到自己想要做的事情,而不会被短期诱惑带偏。</p>
<p>作者在书中,将意志力总结分为三种类型:
1. 我要做
2. 我不要
3. 我想要</p>
<p>我们日常生活中所有遇到的需要利用自己意志力的情况,都可以归结为上述这三种类型。</p>
<p>提高自己的意志力的第一法则就是要: 认识自己。
我们学会承认自己是一个脆弱的,会屈从于本能的人(所有人都是),正确地认识自己是提高意志力的第一步。</p>
<p>在承认这一点的情况下,我们要相信人脑是可以被塑造的。
大脑其实是一个动态学习的器官,你暴露给它什么样的信息;你执行什么样的行为,都会对大脑形成影响,逐渐改变大脑的结构。</p>
<h2>意志力的本能</h2>
<p>意志力是有两部分组成的: 精神和身体。</p>
<p>在精神方面,我们可以采用冥想的方式来重塑大脑。
冥想不是什么都不想,而是将注意力集中到一点上,提高大脑的专注力。</p>
<p>在身体方面,当我们遇到诱惑的时候,我们的第一反应应该是「三思而行」。
方面决策的过程,让自己的大脑拥有足够的时间进行分析。
在平时,增加日常的锻炼,保证充足的睡眠,良好的生活习惯能让我做出更加明智的决策。</p>
<h2>意志力的极限</h2>
<p>意志力其实也是一种资源,它就像是是肌肉,它被使用之后会渐渐疲惫,逐渐失去作用力。</p>
<p>肌肉模型带给我们的启示:
1. 把重要的事情安排的意志力最强的时候
2. 利用一些小事可以锻炼我们的意志力
3. 疲惫感也许只是大脑的一种能量保存机制,第一次感到疲惫也许不是身体真的无法继续下去了。</p>
<h2>道德许可效应</h2>
<p>如果把一件事看成是「正确」的,而不是「我们自己的目标」,大概率是不能持之以恒的。
想要坚持一件事情,不要想象它是对的还是错的,而要把它作为自己的想要的 。
真正需要考虑的是做一件事或不做一件事的最终目标是什么,而不应该用对或错来判断一件事该不该做。</p>
<p>更新自己的思想: <strong>取消许可,牢记理由</strong></p>
<p>道德框架会使得我们的意志力更加脆弱。
当我们将意志力挑战看成衡量道德水平的标准时,善行就会允许我们做坏事。</p>
<h2>把渴望当幸福</h2>
<p>最新的研究成果显示,真正趋势人类的其实不是奖励,而是对于奖励的渴望。
多巴胺给予人类的其实对奖励的渴望,而不是奖励本身的快感。
它控制的是行为,而不是快乐。
大脑其实是靠对快乐的承诺让你不断去狩猎、采集、工作和求爱,而不是让你直接感受快乐。</p>
<p>启示:
- 学会区分让我们生活有意义的真实奖励和让我们分散精力、上瘾的虚假奖励。
- 欲望没有好坏之分,重要是欲望将我们引向哪个方向,以及我们是否足够明智,知道什么时候该听从欲望的声音。</p>
<h2>压力会降低意志力</h2>
<p>最有效的解压方法:
- 体育活动
- 阅读
- 听音乐
- 按摩
- 散步
- 冥想
- 瑜伽</p>
<p>最没有效果的解法方法:
- 赌博
- 购物
- 抽烟
- 喝酒
- 暴饮暴食
- 玩游戏
- 上网
- 看电影或电视</p>
<p>「那又如何」效应==「破罐子破摔」</p>
<ul>
<li>自我批评会降低积极性和自控力,而且也是最容易导致抑郁的因素。</li>
<li>自我同情则会提升积极性和自控力</li>
<li>遇到挫折的时候,最重要的是要安抚自己,而不是吸取教训。</li>
</ul>
<p><strong>面对失败时的处理方式</strong>
1. 遇到挫折的时候,停下来感受并描述一下自己的感觉
2. 每个人都会失败,这是人生的一部分
3. 如果你的好朋友经历的同样的挫折,你会怎么安慰他?</p>
<p>为了避免压力导致的意志力失效,我们需要找到能让我们真正快乐的东西,而不是虚假的奖励承诺,也不是空洞的改变策略。</p>
<h2>延迟奖励</h2>
<p>即时奖励和未来奖励之间的战争,人类的大脑倾向于即时奖励而不是未来的奖励。
可行的方法:
1. 远离诱惑源,眼不见心不烦
2. 面对诱惑的时候,等待10分钟
3. 不想做一件对长期有利的事情的时候,先开始做10分钟,然而再允许自己放弃
4. 切断一切其他选择的可能性,让自己不得不做出「正确」的选择</p>
<p>「延迟折扣」现象: 等待奖励的时间越长,奖励对你来说的价值越低.</p>
<ul>
<li>当你知道什么会引起欲望的时候,将它放到视线之外,它就不再吸引你(眼不见心不烦)</li>
<li>10分钟法则:<ul>
<li>面对诱惑,我需要等待10分钟,如果10分钟之后你还想要,你就能拥有它。在这10分钟内一定要时刻想着长远奖励。</li>
<li>面对一件具有长远利益的事情,坚持做10分钟,然后允许自己放弃。</li>
</ul>
</li>
</ul>
<h2>思想反弹</h2>
<p>直面自身欲望,但不要付诸实践</p>
<ul>
<li>承认自己脑海中的欲望以及渴望某种事物的感觉</li>
<li>不要马上试着转移注意力或与之争论,接受这种想法或感觉,提醒自己「白熊」现象和「反弹」理论</li>
<li>意识到这种想法不受你控制,但可以选择不将这些想法付诸实践</li>
</ul>
<p>尝试把「我不要」改为「我想要」</p>
<p><strong>对内接受自我,对外控制行动</strong></p>
<h1>评价</h1>
<p>全书其实干货不少,分类层次也还算合理。
但是,具体的写作(翻译)不忍直视。</p>
<h1>和我的关系</h1>
<p>虽然其中的很多内容我自己在日常生活都在实践,但是我之前其实并没有多少这方面的理论知识,我只是根据经验实践了书中推荐的一些方法。
通读这本书之后,对意志力这一现象有更加的深入的理解了。
在面对诱惑的时候,我有了更多的方法来使自己避免走向错误的路径。</p>
<h1>更新日志</h1>
<ul>
<li>2019年2月16日写作并发表</li>
</ul>欲望2019-02-09T00:00:00-07:002019-02-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-09:/words/Desire/<p>欲望是水,能载舟亦能覆舟.</p><p>最近阅读了一些有关宗教题材的小说和书籍,发现其中很多内容都是关于宗教指导人们要摒弃自己的欲望,放下自己的欲望,把一切都奉献给神。
神职人员追求的是「灭人欲,存天理」的状态。
然而,我个人觉得任何追求这种状态的努力都是徒劳的,都是一种「非自然」的状态。</p>
<p>为什么?</p>
<p>因为,这些欲望是深植于我们的基因之中的(从这个角度上来说,人真的有自由意志吗?)
这些欲望保证了人类这个种群能够在大自然中不断繁衍下去。
任何一切试图泯灭欲望的尝试都是一种自我挣扎,最终只会让人更加痛苦。
因为,你是在反抗自己的天性。</p>
<p>欲望这个东西,就像是水一样,「能载舟亦能覆舟」。
一方面它是人类文明得以发展的原初动力;另一方面如果控制得不好,它也将会是一张催命符。</p>
<p>首先,人有欲望,这是人类的天性。
人有欲望是一件好事,连动物都有最基本的生存欲望,何况人呼?
人与动物的区别之处在于,在满足了基本的生存欲望之后,人类还有「更快、更高、更强」的欲望。
为了满足人类更多的欲望,人类发展科技、探索未知,创造出了文明。
所有这一切的本源推动力就是人类的欲望。</p>
<p>另一方面, 人类是一种群居性的生物,每个个体都需要相互帮助才能让整个族群生存下去。
然而,个体的欲望往往是和社会、他人的需求相矛盾的。
资源毕竟是有限的,你占有多了,别人就少了。
因此,当你的欲望无限膨胀的时候,你就会在不知不觉中占有了太多的资源,引起社会的不满,社会就会将你占有的资源以及你的肉体一起夺走。
历史上那么多骄奢淫逸最终亡国灭种的帝王,都是败于自己的无限扩张的欲望。</p>
<p>既然欲望是水,那么对它一昧的围追堵截,必然会失败的;
对于水,我们能做的只有通过主动引导,才能让自己达到一个身心舒适的状态。</p>
<h1>更新日志</h1>
<ul>
<li>2019年2月9日写作并发表</li>
</ul>「无尽世界」读书笔记2019-02-09T00:00:00-07:002019-02-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-09:/reading-list/World-without-End/<p>「无尽世界」读书笔记</p><table>
<thead>
<tr>
<th align="left"></th>
<th align="left"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Title</td>
<td align="left">无尽世界</td>
</tr>
<tr>
<td align="left">Author</td>
<td align="left">Ken Follett</td>
</tr>
<tr>
<td align="left">Edition</td>
<td align="left">读客出品</td>
</tr>
<tr>
<td align="left">Release Date</td>
<td align="left">2018年10月30日</td>
</tr>
<tr>
<td align="left">ISBN</td>
<td align="left">9787532775347</td>
</tr>
</tbody>
</table>
<h1>主要内容</h1>
<p>这套小说描写了在「圣殿春秋」之后200年,王桥镇上发生的故事。
主要人物有:
- 男主角梅尔辛. 他是一个头脑聪明的匠师(工程师),因为各种原因最终远走他乡,在意大利经历黑死病之后,回到家乡王桥镇成为了工会会长。
- 女主角凯瑞斯. 她是一个不断挑战权威的女人,拒绝一切教条主义。正因为她的质疑和行为,引起了教会的反感。教会指责她为女巫,因此她不得不放弃爱情加入教会成为了一名修女。在做了修女十二年之后,她最终放弃教会的誓言,重归世俗,与男主角梅尔辛成婚。
- 格温达。一个为了爱情奋不顾身的女子,也是一个苦命的人。出生在一个贫穷的家庭,父亲是一个无耻的无赖,曾经为了一头奶牛将格温达卖给了强盗。但是,她最终凭借自己的顽强逃出了强盗窝。后来她勇敢追求自己的爱人,并最终组成家庭。
- 拉尔夫。 他是梅尔辛的弟弟,是一个好勇斗狠的人。凭借他的勇武和无耻,最终成为了一名伯爵。可以说,故事中发生的大部分悲剧都是他造成的。最终他被自己的私生子杀死。
- 戈德温。一个无耻的教士,利用权谋成为了王桥修道院的副院长。他为人守旧,总是打着上帝的名义,拒绝一切违背自己意愿的事情。在黑死病期间放弃城镇,携带修道院全部珍宝出逃,还偷盗修女的财物用来修造自己的私人宫殿。</p>
<h1>感想</h1>
<p>这是肯福莱特中世纪三部曲中的第二部,但实际上和第一步「圣殿春秋」关系并不大。除了故事同样发生在王桥镇之外,几乎没有什么太大的联系。
然而,从故事框架和写作手法上来看,却和「圣殿春秋」非常相似。</p>
<p>纯从故事的角度来说,我觉得「无尽世界」的收尾收得并不好,感觉非常仓促。
戈德温的死和菲利蒙的失败都来得非常高突然,没有任何铺垫;凯瑞斯脱离教会重返世俗也显得很突兀。
这些细节上的处理,感觉是作者在收尾的时候强行扭转大的趋势,一下子将主角们从水深火热中解救出来。
这样的转折一下子很难让人接受。</p>
<p>关于故事结构,还一点我觉得处理得并不好。
关于国王的信,这封信是小说一开始就安排的伏笔,我还以为这将会是一个非常重要的伏笔,结果这封信仅仅是在最后最为一个筹码强行将「反派」菲利蒙搞走了。
对于这样的处理,我有点失望。</p>
<p>虽然有点小瑕疵,但是瑕不掩瑜。
这两部小说很好地向我展示了黑暗的中世纪普通民众的生活状态。
在那个时代,生活中所有的重心都是围绕着宗教展开的,教会是欧洲最大的权威,也是最大的地主。
教会控制着日常生活中的一切,教士们常常打着上帝的名义为自己谋利。</p>
<h1>更新日志</h1>
<ul>
<li>2019年2月9日写作并发表</li>
</ul>需求决定价值2019-02-02T00:00:00-07:002019-02-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-02:/words/Demand-Determines-Value/<p>常常被人忽视了的「需求决定价值」</p><p>曾经在一段很长的时间里,我一直会有一种不忿的感觉。
为什么那些在我眼中那些没有什么「水平」的工作,却从社会上赚取
了那么的金钱?
类似的感叹我曾经在<a href="http://zhouyichu.com/words/What-do-We-Purse/">我们应该追求什么</a>中进行过论述。
但是,其实当时没有得出什么结论,只是说服了自己,自己需要接受
这些客观存在的事实。
但是,在后来一段时间内,内心深处还是无法真正想清楚这种现象背后的原理。</p>
<p>其实,这是因为我忽略了一个最基本的经济学原理: <strong>需求决定价值</strong>.
在这条基本的原理面前,其他一切口号、道德、荣誉都是渣渣。</p>
<p>当我还在抱怨那些明星为什么唱一首歌就可以收入几十万乃至上百万
,而明明是在为人类未来做贡献的科研人员却只能拿着微薄的收入的
时候,我就完美忽略了<strong>需求决定价值</strong>的基本原理。
为什么明星的收入水平远大于优秀的科学家,其实很简单的。
因为,社会对于娱乐的需求远大于对科研的需求。</p>
<p>在工业革命之前,演员、戏剧等艺术形式都是为了贵族而存在的,当
农人们还在为了明年的口粮在地里挥汗的时候,他们是不会有什么精
神娱乐的需求的。
尤其是在中国古代,「戏子」就是一种对于当时那些表演艺术人员的
一种蔑称。
因为在那个时代,生存的需求远大于娱乐的需求。</p>
<p>然而,现代社会早已解决了温饱问题,有些地区甚至进去了小康状态
。
在这样的大条件下,社会的需求也发生了改变。
人们需要各种各样的娱乐活动来打发自己多余的时间,因此对于娱乐
的需求也就大大提高了。
娱乐业的人员的社会地位、收入水平也因此水涨船高了。</p>
<p>反过来看科研,大家都心知肚明,科学技术的发展是能够为社会创造
更大的福利的。
但是,它的福利效应却有着很长的周期。
普罗大众其实是很短视的,对于他们无法即时接触到、无法即时看到的东西,都不会产生足够的兴趣。
真正能够重视科研并且有能力资助的人毕竟是少数。
因此,科研本身的需求其实要远远比娱乐的需求少很多。
这样就导致了两方的从业人员收入水平的差异。</p>
<p>经济社会的发展其实都是尊崇的非常简单基本的原理的,从来都是赤
裸裸的。但是人们却经常被认为的口号、道德、荣誉所蒙蔽。
要想从社会上获得更多的财富,其实方向是很明确的,就是要在最大程
度满足人们的需求。</p>
<p>虽然,我提到过多次,所谓了口号、道德、荣誉蒙蔽了很多人的眼睛(
其中包括了我自己),让人们无法看清事情的本质。
但是,其实这些人类的发明的「谎言」对于人类的发展其实还是至关
重要的。
因为,人们的短视有可能会导致社会走向衰落。
如果所有人都只满足与眼前的需求,那人类文明何以继续发展?
如果所有人都尊崇动物本能趋利避害,战争期间谁还会冲锋陷阵?
口号、道德、荣誉这些「虚拟」的东西存在的原因就在于,当我们需
要去做一件违背我们天性的事情的时候,给我们一个合适的理由来说
服别人,同时也说服自己。</p>
<h1>更新日志</h1>
<ul>
<li>2019年2月2日写作并发表</li>
</ul>目标并不重要2019-02-02T00:00:00-07:002019-02-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-02-02:/words/Target-is-Not-Important/<p>目标并不是驱使我们行动的根本动力。</p><p>我们应该追求过程而不是目标本身。</p>
<p>最近在阅读「<a href="https://book.douban.com/subject/10773358/">意志力</a>」一书的时候,了解到了神经科学上对于人类快
感研究的最新成果。
在我们原来的认知中,我们认为人类的快感是一种被称为「[多巴胺
][]」的脑分泌物控制的。
然而,书中却给出了一中新的可能性。</p>
<p>「多巴胺」控制的其实不是快感本身,而是追求快感的过程。
换句话说,其实它控制的是人类对于快感的渴望。
研究人员在研究人脑对于快感的反应时发现,当被测试人被激发了某
种渴望的时候(比如巧克力、购物),他们大脑中分泌了很多的多巴胺
。
但是当他们真正获得他们想要的东西的时候,多巴胺的分泌却停止了
。这说明,多巴胺控制的其实是「渴望」而不是「快感」本身。</p>
<p>这样的新理论,我在直觉上就很快接受了。
因为它能够解释一些我们经常见到的事情。
这个理论能解释,为什么很多大仇得报的人会感到空虚;历经千辛万苦达成目标之后却依然感到空虚。
因为真正驱使我们的是对目标的渴望,而不是目标本身。</p>
<p>对于这些事情,我自己也是有切身体会的。
当年小高考的时候,憋了一股子劲想要拿到4A,在这个过程中,我发
展出了自己的学习方法和学习节奏,同时开始忽略身边的一切事物。
我的双眼只盯着最终的目标,心中万分渴望的就是那4个A.
最终,我如愿以偿的得到了4个A。
但是,在得知最终结果后的那几天,我却处于一种极度空虚的状态。
感觉整个世界都失去了意义。
现在想来,也许那个时候就是因为我大脑中的多巴胺含量从极高的状
态瞬间跌到了极低的状态。</p>
<p>明白了这些底层的生理过程,对我们的日常生活有什么启示呢?
我想主要有以下几点:</p>
<ol>
<li>目标是什么不重要的,更重要的是这个目标能够引起我们的渴望
。
其实,我们可以利用这个特点。
我们可以制定出一个能够引起我们渴望的「虚假目标」,但是在完成这个目标的过程中,我们达成自己真正的目标。
一个很简单的例子: 小时候考了满分我们就能得到更多的零花钱
。「更多的零花钱」是一个能够引起我们渴望的目标,而「好成
绩」却是对我们真正有意义的目标,可是它无法引起我们的渴望
。</li>
<li>一个固定的目标也许不是最好的选择,追求一种生活的目标状态
也许是一个更好的选择。因为,一旦一个目标是固定不变的,当
你失败的时候,你会感到深深的挫败感;而当你最终成功达成的
时候,你还是会收获一种空虚感。
但是,如果追求的是一种生活状态的话,那么你就永远处于一种
动态追寻的过程。因为,连你的目标都是一种不断变化的状态,那
么你的追求过程将永远不会结束。你将会永远处于一种「快感」
的状态。</li>
<li>追寻目标的过程,我们应该更加关注体会当下的过程。过程的体
验远远比最终的目标重要得多。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2019年2月2日写作并发表</li>
</ul>信息流模型2019-01-26T00:00:00-07:002019-01-26T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-01-26:/words/Information-Flow/<p>信息流模型能够帮助我们更好的决策</p><p>每周一文计划,带给我的不仅仅提高了写作能力这么简单。
我最直接的感受,它让我的思维永远处于活跃的状态。
就像一个蓄水池一样,阅读、学习、生活、工作都是在向这个蓄水池
里面注水,每周的写作(思考)就像是一个水泵一样,不断将注入蓄水
池中的水抽出,保证水池中的水不会溢出。
如此一来,整个池子就是出于一种活水的状态,是一种比较健康的状
态。</p>
<p>只有进水,没有出水,那就只是在接受信息(甚至都不能说是知识);
只有出水,没有进水,那就是在坐而论道。"回字的四种写法你知道
吗?"</p>
<p>将这个比喻推广到全社会的话,我们每一个个体都可以看成是一个信
息网络中的节点,每个人的日常都是接受上游节点发出的信息,然后
消化处理,然后向下游节点发出我们的信息。
而且,不同的领域通常会有不同的信息流链路。
金融信息的链路和科研信息的链路很大程度上是完全不同的链路,他
们相交的节点数是非常稀少的。</p>
<p>一个个体产生的和能够处理的信息量毕竟还是有限的。
为了最大程度上利用信息流,于是出现了一些超级节点,它们广泛的
吸收各方的节点信息,他们能够处理的量远远比个人来得多。
同样的,他们能够向下游提供的信息量也就更多了。
在互联网出现以前,超级节点就被称为「中介」。
他们这些超级节点的作用就在于减小其他普通节点获取信息流的成本
。
比如要租房,在没有中介的情况下,我们需要接受周围很多其他节点
的信息才能获得我们想要的信息。
但是,超级节点出现之后,我们只需要接受来自它的信息就可以了。
大大减小了获取信息的成本。</p>
<p>在互联网时代,类似的效应被再次放大。
各个互联网巨头不遗余力的抓取信息,为的就是成为信息流网络中最
大的那个超级节点,从而能使自己的信息流能够流向更多的下游节点
。
在这个过程中,这些超级节点就能产生具体的经济利益。
这些超级节点就像是整个信息流网络中的水泵,加速信息流的流动的
速度,从而产生更多的价值。</p>
<p>那么,对于我们每个人来说,如何才能利用这样的认知(建模)来帮助
自己,指导我们自己做出更好的决策呢?</p>
<ol>
<li>尽量要让自己往下游发送的信息能够吸引更多的人,当愿意接受你
的信息的人足够多的时候,你就能体现出自己的价值。
比如那些以文字为生的人,他们就是因为能够将自己的信息发
送到更多节点,他们才产生了经济价值。
比如科研人员,他们产生的信息包含了巨大的潜在价值,他们是
在未知领域开创新信息,正因为如此,科研人员的经济收入都是
比较好的.</li>
<li>尽量让自己接受和发送的信息流横跨多个不同的领域。在图论算
法中有这样一种概念: 「割点」。所谓的割点,就是说如果我们将这
个点及其相关的边从图中去掉,原来的图就会变成两个不连通的
子图。可以想见,割点就是联通两个子图的关键点。如果我们能
成为这样的「割点」,那我们就处于一种不可替代的位置,我们
的独特价值因此而体现。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年1月26日写作并发表。</li>
</ul>「力哥说理财 小白理财入门必修课」读书笔记2019-01-26T00:00:00-07:002019-01-26T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-01-26:/reading-list/Reading-Li-Ge-Financing/<p>「力哥说理财 小白理财入门必修课」读书笔记</p><table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Title</td>
<td align="center">力哥说理财 小白理财入门必修课</td>
</tr>
<tr>
<td align="center">Author</td>
<td align="center">邢力</td>
</tr>
<tr>
<td align="center">Edition</td>
<td align="center">N/A</td>
</tr>
<tr>
<td align="center">Release Date</td>
<td align="center">2016-5-1</td>
</tr>
<tr>
<td align="center">ISBN</td>
<td align="center">9787115420923</td>
</tr>
</tbody>
</table>
<h1>摘录</h1>
<blockquote>
<p>理财就是理生活,任何妄图把理财只是和投资捆绑在一起的行径都是可耻的,主要是失败的。理财君最大的特点是平衡。</p>
</blockquote>
<p>平衡的生活、平衡的理财。财务自由是一种状态,不是一个目标。</p>
<blockquote>
<p>理财是手段,幸福是目标!平衡才健康,生活更美好!</p>
<p>我们常常分不清楚我们需要什么和我们想要什么的区别。我们需要的清洁的水,而我们想要的是茅台、拉菲、普洱茶。你不喝茅台不会死,但不喝水会死。</p>
</blockquote>
<h1>综述</h1>
<p>这本书是典型的理财入门书籍,其中最核心强调了,理财的本质其实就是理生活。
具体的方法论总体来说只有一条: 复利效应。</p>
<h1>结构和细部</h1>
<h2>理财四君子</h2>
<ol>
<li>金钱君<ul>
<li>金钱本质上是购买力的凭证</li>
<li>钱乃身外之物,但是是身外之物中最重要的</li>
</ul>
</li>
<li>理财君<ul>
<li>理财不等于投资</li>
<li>理财不止是打理金钱,更是打理你的生活</li>
<li>定义: <strong>通过对现有和预期将来可以获得的各种资源的整合管理,实现个人一生生命满足感最大化</strong></li>
<li>平衡才是健康</li>
<li>理财系统<ul>
<li>消费规划</li>
<li>现金流规划</li>
<li>职业生涯规划</li>
<li>投资规划</li>
<li>置业规划</li>
<li>教育基金规划</li>
<li>子女财商教育规划</li>
<li>风险保障规划</li>
<li>税务规划</li>
<li>养老规划</li>
<li>遗产规划</li>
</ul>
</li>
</ul>
</li>
<li>通胀君<ul>
<li>GDP: 国民生产总值,一个国家过去一年新生产出来的全部财务总和</li>
<li>CPI: 消费者价格指数,物价指数</li>
<li>社会财富在不断增长,政府必须发行更多的货币,否则会出现通货紧缩。</li>
</ul>
</li>
<li>复利君<ul>
<li>银行都是单利收储,复利放贷</li>
<li>投资理财,要从娃娃抓起</li>
<li>投资一定要坚持、坚持,再坚持!</li>
<li>保住本金</li>
<li>时间<span class="math">\(\times\)</span>复利=财富原子弹</li>
</ul>
</li>
</ol>
<h2>理财第一步: 遏制消费欲望</h2>
<ul>
<li>开始记账,找出拿铁因子</li>
<li>选择适合自己的,不要跟随商家的促销噱头</li>
<li>学会管理自己的时间</li>
<li>生命周期模型</li>
</ul>
<h2>投资</h2>
<ul>
<li>三性合一: 安全性、收益性、流动性</li>
<li>市场无风险收益: 银行存款利率</li>
<li>资产配置:<ul>
<li>后防线: 存款、债券、债券基金、银行理财</li>
<li>中场: 房地产、信托、艺术品、股票</li>
<li>前锋线: 炒期货、炒外汇、炒黄金</li>
</ul>
</li>
<li>明确理财目标</li>
</ul>
<h2>迈向财务自由</h2>
<ul>
<li>穷人为钱工作,富人让钱为自己工作</li>
<li>财富不是指有多少钱,而是指在不进行任何劳动的前提下,还能按照你所期望的生活标准,一直生活下去的天数。</li>
<li>上班时间怎么做决定你当前的收入;业余时间做什么决定你未来财务</li>
</ul>
<h2>理财杂谈</h2>
<ul>
<li>婚前协议</li>
<li>分别财产制</li>
<li>大富翁的理财智慧<ul>
<li>先发优势</li>
<li>不进则退</li>
<li>集中火力,重点突破</li>
<li>一定要控制好现金流</li>
<li>以退为进</li>
</ul>
</li>
</ul>
<h1>评价</h1>
<p>这本书对于完全的理财新手来说,确实是一本非常有用的书。
它最重要的作用不是说明了具体的理财方法,而是明确了理财的目标和方法论,更新了人们对于理财的普遍认知。
但是,毕竟这本书是来源一个网络节目的,后半本书的内容就非常水
了,感觉完全是凑字数的。</p>
<h1>和我的关系</h1>
<p>这是我第二次阅读这本书,所以其中的很多观念并没有对我产生太多的冲击。
我期望的是,能够从这本书中学习到一些具体的、可操作的理财方法。
但是,这本书的大部分内容都是比较抽象的策略性说明,涉及到的具体操作手法比较少。</p>
<h1>更新日志</h1>
<ul>
<li>2019年1月26日写作并发表</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2018年度总结2019-01-19T00:00:00-07:002019-01-19T00:00:00-07:00Flyawaytag:zhouyichu.com,2019-01-19:/words/Summary-2018/<p>告别2018,迎接2019.</p><h1>前言</h1>
<p>又是一年结束时,今年相比<a href="http://zhouyichu.com/words/Summary/">去年</a>来说,今年要丰满了一些,去年积累的一些东西开始浮现出成果了。</p>
<h1>事业</h1>
<h2>科研</h2>
<p>科研方面,在辛勤工作了一年半之后,终于有了一些成果。
延续去年的两个研究方向,今年在这两个方向上都有了长足的进度:</p>
<ol>
<li>从前人的工作成果中受到了启发,提出了关于word meaning的一个
新的假设。
从这个新的假设开始,进一步提出了一个具有很强泛化性的word
embedding学习模型。
实验结果也比较理想,和现存的embedding模型比较,具有很强的
竞争性。
这部分工作已经投到了2019 NAACL会议上,目前还在审核中,希
望能够过审吧。</li>
<li>RST parser取得了state-of-art的结果,但是这其实只是一个副
产品,而我们真正的研究目标却不是这个。
真正的研究目标遇到了一些阻力,目前还在纠结中。</li>
</ol>
<h2>会议</h2>
<p>暑假的时候,参加了NAACL 2018在奥兰多举行的会议,这是我第一次参加顶会的会议。
三天的行程排得满满的,感觉非常充实。
各种talk和post,短时间内学习到了不少的新东西。</p>
<p><img alt="NAACL" src="http://zhouyichu.com/images/NAACL.jpeg"/></p>
<h2>课程</h2>
<p>今年我完成了我博士项目需要的最后两门课程:</p>
<ul>
<li>Structured Prediction</li>
<li>Computer Architecture</li>
</ul>
<p>从此以后,我就没有上课的需求了。
能够分配更多的时间在科研上面了。</p>
<h2>专业学习</h2>
<p>尽管已经不需要上课了,但是这并不代表我就能停止学习。
今年的其中一个学习目标就是要巩固基础的数学知识。
因此,今年自学(复习)了两门数学专业课:</p>
<ul>
<li><a href="https://book.douban.com/subject/2877309/">Linear Algebra Done Right</a></li>
<li><a href="https://book.douban.com/subject/1888111/">Convex Optimization</a></li>
</ul>
<p>线性代数还算是比较容易,只是从最简单的概念开始,重新梳理了一
遍自己关于线性代数的知识体系。
然而,对于凸优化来说,我就觉得有些吃力了。
其中的一些定理证明我无法完全掌握。</p>
<h1>生活</h1>
<h2>旅行</h2>
<p>今年春假的时候去了一趟赌城拉斯维加斯玩,体验了一把不夜城。</p>
<p><img alt="LasVegas" src="http://zhouyichu.com/images/LasVegas.jpeg"/></p>
<h2>读书</h2>
<p>今年的读书情况由于我采用了一套不同的管理体系,因此比较混乱,
2019的情况应该会好很多。
而且,今年增加了专业学习,因此自由阅读的时间变少了。
今年记录在案的阅读书籍一共有33本,这大概退化到了我2015年的水
平。
在这33本书中,我比较喜欢的有:</p>
<ul>
<li><a href="http://zhouyichu.com/reading-list/The-French-Lieutenant-Woman/">法国中尉的女人</a></li>
<li>圣殿春秋</li>
<li>罗马人的故事</li>
<li>中国历代政治得失</li>
<li>未来简史</li>
</ul>
<h2>健身</h2>
<p>从2016年开始,健身就已经成为了我生活的一部分。
今年的成果也算是比较显著的,体重从60kg增长到了70kg,体脂大概
维持在12%左右。
虽然体脂还是有一些偏高了,但是我已经算是满意的了。
毕竟体重整整增加了10kg了。
现在的画风是这样的:</p>
<p><img alt="workout" src="http://zhouyichu.com/images/workout-2018.jpeg"/></p>
<p>和去年相比,厚度上去了,但是腹部的脂肪也明显多了。
不管怎么样,今年继续努力吧。</p>
<h2>每周一文</h2>
<p>每周一文计划是我在2018年初答应自己需要完成的一个年度目标。
望文生义,所谓的每周一文计划就是要在整个2018年期间,保持每周
写一篇博文的进度。
我之所以确立这样的目标是为了:
1. 加深自己的思考深度,因为在最近几年的时间里,我每年都会做
年度总结。在这个过程中,我发现自己虽然每年确实阅读了不少
的书籍,但是很明显,思考的深度还不够,总是在被动的接受信
息,而不是自己生产知识。
长此以往,这是很致命的,
因此,我需要一个能够促使自己的深入思考的事件。
2. 能够提高自己的写作能力。在2018的前几个月,这个每周一文的
计划对我来说非常痛苦,因为我实在不知道该写些什么东西。
但是,后来随着写作进度的展开,写作渐渐变得不再是挤牙膏式
的了,而是能力比较流畅的写作。
这样的感觉其实很不错。</p>
<p>虽然说了这是周期为一年的每周一文计划,但是最终的只是坚持了46
周。
最后的6周,其中3周是因为要赶论文的deadline,只能忍痛放弃了;
deadline之后就又马上直接回国了,开启了宅男模式。
所以,最后六周的博文写作没能坚持下来。</p>
<p>这是一个非常有意义的实践,我打算再2019年继续实践这一小目标。</p>
<h1>感悟</h1>
<h2>思考远比阅读重要</h2>
<p>不管是在科研上还是在日常的阅读,又或者是日常工作中,我越来越
觉得自己的思考其实远比任何事情要重要。
别人的经验和方法永远是别人的,自己不去亲身实践并思考得出自己
的结论,是永远不会有进步的。</p>
<h2>读博士不仅仅是读博士</h2>
<p>读博不仅仅是做科研,更重要的是培养自己一种管理自己的能力.
科研成果、论文这些都是读博士期间的显式成果,而更为重要的内在
的能力。
所谓的能力,包括了:</p>
<ol>
<li>时间(精力)管理能力。读博期间的时间是比较自由的,在这种时
候,自律的生活方式将是至关重要的。</li>
<li>科学的思考能力。面对一个问题,首先要分析、试错然后得出结
论。面对一个非常复杂的问题,不要激动、不要沮丧,客观的分
析,一点一点往前拱,最终一定会有成果的。</li>
<li>Think big。永远不要将目光聚焦在具体的细节上,时刻记住自己
的最终目标,不要陷入细节的汪洋大海。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2019年1月19日 写作并发表</li>
<li>2019年1月20日 更新科研会议和旅行。</li>
</ul>失控的一周2018-11-17T00:00:00-07:002018-11-17T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-11-17:/words/One-Lost-Week/<p>过去的一周过得非常混乱。
完全打乱了我平时日常的工作节奏。
具体细节就不谈了,但是从这一周的情况来看,我对自己日常状态的掌控力还是太弱了,一旦遇到一些略微复杂的情况,一下子就措手不及了。
从这一周的实践中,我也发现了自己的落入的几个思维误区。</p>
<ol>
<li>
<p>进入了小巷思维。抓住一个方法死磕,然而这个方式却未必是解决问题的最佳方案。
这个时候,我需要做的是跳出具体的问题,从更大的角度来审视当前的困难。
由于deadline日益临近,如何使用最小的代价解决问题才是最重要的。
如果一个解决方案需要你花费更多的时间来学习,也许这并不是当前问题的最佳方案。</p>
</li>
<li>
<p>对自己的思维失去了掌控,任由自己的思维在错误的路径上一路狂飙,浪费了不少的时间。
一旦意识到自己的快要失去对思维的掌控的时候,最需要学会的是刹车。
及时掐断自己的思维,防止思维在错误的路径上越走越远。
思维的惯性其实比我们想象得还要强大,能够一路把你拖拽到荒无人烟的荒郊野外。
在这种时候,可以尝试不同的活动来转移自己的主意识,而让潜意识来继续思考问题。
比如散个步、去健身房撸一下铁等。</p>
</li>
<li>
<p>没能控制好自己的情绪。
越是紧张焦虑的时候,一点点小事就能彻底让人陷入疯狂。比如,在紧张的工作的期间,我发现自己买了才几个月的移动硬盘又坏了,TimeMachine的备份还有很多其他的数据都取不出来。
烦躁的情绪一下子掌控了我,我又花了2个小时去折腾硬盘的事情。
这完完全全是浪费时间的决定。
明明我有更重要的事情要去做,但是却任由我的情绪左右了我的判断。</p>
</li>
</ol>
<p>尽管这几点思维的误区我是一早就知道的,也时刻提醒自己该提防的就是这些误区。
然而,事实却啪啪地打脸了,我还是落入这些思维陷阱 …</p><p>过去的一周过得非常混乱。
完全打乱了我平时日常的工作节奏。
具体细节就不谈了,但是从这一周的情况来看,我对自己日常状态的掌控力还是太弱了,一旦遇到一些略微复杂的情况,一下子就措手不及了。
从这一周的实践中,我也发现了自己的落入的几个思维误区。</p>
<ol>
<li>
<p>进入了小巷思维。抓住一个方法死磕,然而这个方式却未必是解决问题的最佳方案。
这个时候,我需要做的是跳出具体的问题,从更大的角度来审视当前的困难。
由于deadline日益临近,如何使用最小的代价解决问题才是最重要的。
如果一个解决方案需要你花费更多的时间来学习,也许这并不是当前问题的最佳方案。</p>
</li>
<li>
<p>对自己的思维失去了掌控,任由自己的思维在错误的路径上一路狂飙,浪费了不少的时间。
一旦意识到自己的快要失去对思维的掌控的时候,最需要学会的是刹车。
及时掐断自己的思维,防止思维在错误的路径上越走越远。
思维的惯性其实比我们想象得还要强大,能够一路把你拖拽到荒无人烟的荒郊野外。
在这种时候,可以尝试不同的活动来转移自己的主意识,而让潜意识来继续思考问题。
比如散个步、去健身房撸一下铁等。</p>
</li>
<li>
<p>没能控制好自己的情绪。
越是紧张焦虑的时候,一点点小事就能彻底让人陷入疯狂。比如,在紧张的工作的期间,我发现自己买了才几个月的移动硬盘又坏了,TimeMachine的备份还有很多其他的数据都取不出来。
烦躁的情绪一下子掌控了我,我又花了2个小时去折腾硬盘的事情。
这完完全全是浪费时间的决定。
明明我有更重要的事情要去做,但是却任由我的情绪左右了我的判断。</p>
</li>
</ol>
<p>尽管这几点思维的误区我是一早就知道的,也时刻提醒自己该提防的就是这些误区。
然而,事实却啪啪地打脸了,我还是落入这些思维陷阱。
知道是一回事,但是做到却又是另外一回事了。</p>
<p>我认为的最佳的解决方案还是要「有节奏」的生活,将工作和生活尽量隔离,在工作的时候全身心投入,而在生活的时候彻底忘记工作(至少主意识需要忘记工作)。
虽然从局部来看,这似乎是降低效率的做法。
但是从长期来看,这显然是一种更加高效的策略。
因为人类的大脑、身体都是需要休息的,不可能永远处于工作状态。</p>
<p>有节奏的生活能够让大脑在工作时一直处于比较好的状态,但是如果大脑得不到充分的休息,一直处于工作状态(就像我本周的状态),它的效能会严重降低,甚至将你带入岔路,而你需要花费更多的精力才能回到正确的道路上.</p>
<h1>更新日志</h1>
<ul>
<li>2018年11月17日写作并发表</li>
</ul>自由2018-11-10T10:14:57-07:002018-11-10T10:14:57-07:00Flyawaytag:zhouyichu.com,2018-11-10:/words/Freedom/<p>因为家里父母的呵护,衣来伸手,翻来张口的状态,自然而然就觉得整个世界是围绕着自己旋转的。
每一个婴儿都会经历这样的一个状态。</p>
<p>后来长大了,才发现自己是生活在社会之中的,自由不是想干什么就干什么,而需要考虑别人的需求,因此自由就变成在「在不影响其他人的情况下,想干什么就干什么」.
当你妨碍到别人的自由的时候,你就会受到别人的道德谴或者法律的制裁。</p>
<p>后来,出门上大学,后来又出国留学,我又慢慢发现,其实人根本没有自由。
因为我们每个人都是在屈从于自己的欲望,而所谓的欲望, 我们根本无法控制。
「欲望」其实是基因「硬编码」在我们身体内的。
它在后台默默地控制着我们的思想、控制着我们的身体。</p>
<ul>
<li>我们为什么要结婚?因为基因需要产生下一代</li>
<li>我们为什么要努力学习找个好工作? 因为基因需我们生存下去,而更好的生存下去就意味着努力工作、升职加薪。</li>
<li>我们为什么喜欢吃垃圾食品而不是更为健康的粗粮?因为我们的基因告诉我们,我们需要摄入更多的脂肪,存储更多的热量。</li>
</ul>
<p>所有的一切都来自于基因「硬编码」在人体内的各种「欲望」。
刚开始,当我意识到这一点的时候,我是有点茫然的。
感觉一切都是虚幻的,所谓的「自由之意志,独立之精神」其实从来就不存在 …</p><p>因为家里父母的呵护,衣来伸手,翻来张口的状态,自然而然就觉得整个世界是围绕着自己旋转的。
每一个婴儿都会经历这样的一个状态。</p>
<p>后来长大了,才发现自己是生活在社会之中的,自由不是想干什么就干什么,而需要考虑别人的需求,因此自由就变成在「在不影响其他人的情况下,想干什么就干什么」.
当你妨碍到别人的自由的时候,你就会受到别人的道德谴或者法律的制裁。</p>
<p>后来,出门上大学,后来又出国留学,我又慢慢发现,其实人根本没有自由。
因为我们每个人都是在屈从于自己的欲望,而所谓的欲望, 我们根本无法控制。
「欲望」其实是基因「硬编码」在我们身体内的。
它在后台默默地控制着我们的思想、控制着我们的身体。</p>
<ul>
<li>我们为什么要结婚?因为基因需要产生下一代</li>
<li>我们为什么要努力学习找个好工作? 因为基因需我们生存下去,而更好的生存下去就意味着努力工作、升职加薪。</li>
<li>我们为什么喜欢吃垃圾食品而不是更为健康的粗粮?因为我们的基因告诉我们,我们需要摄入更多的脂肪,存储更多的热量。</li>
</ul>
<p>所有的一切都来自于基因「硬编码」在人体内的各种「欲望」。
刚开始,当我意识到这一点的时候,我是有点茫然的。
感觉一切都是虚幻的,所谓的「自由之意志,独立之精神」其实从来就不存在。
每个人都是屈从于各自的欲望。</p>
<p>不过,我又很快就释然了。
人或许没有自由选择自己的欲望是什么,但是至少可以选择对欲望的反应。
我们可以选择无条件的屈从自己的欲望,也可以选择苦行僧式的生活,永远处于和自己的欲望进行抗争的状态。</p>
<p>这两种方式都不是我想要的。
我认为真正好的状态应该是一种自我觉知的状态。
我们不应该无条件顺从自己的欲望,也不应该像苦行僧一样完全抵制自己的欲望,我们应该学会控制的欲望。
当欲望来临时,学会管理、控制它。
在合适的时间、合适的地点满足自己的欲望,但是又不会被欲望完全控制。
满足自己的欲望的时候,不会感到羞愧;压抑自己的欲望的时候,不会感到痛苦。
做到一种浑然一体的感觉。
这才是真正的自由。</p>
<p>其实,这就可以归结到人们常常说的,要学会「自律」.
人的心智其实是有惯性的,一旦开始放纵自己的欲望,它就会越来越大;同时,人的心智也是由弹性的,不断抑制自己的欲望,总有一天它还是会爆发出来的。
自律,就是一种学会调节、控制自己欲望的行为方式。
它不会刻意放纵,也不会永远抑制。
真正的自律是一种能够做到兼顾内外的动态平衡的能力,一种自我感知能力。</p>
<h1>更新日志</h1>
<p>2018年11月10日 写作并发表</p>语言和意识的界限2018-11-03T00:00:00-06:002018-11-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-11-03:/words/Language-Consciousness-Limitation/<p>语言是人类交流最重要也是表达能力最强的一种手段。
但是,在我看来,语言却不是一种足够高效的交流手段。
由于我自己是从事NLP的研究工作的,对于人类语言这一现象,有着一些自己的思考。
下面的三个问题一直萦绕在我的脑海中。</p>
<h1>语言是否有界限?</h1>
<p>首先我想要说的是,语言的表达能力是有界限的。
对于很多人类内心的情绪感受,是无法准确用语言描述出来的。
但是,这些感受却是真实的人类意识的一部分。
因此,在很多文学作品中,都是用环境、对话等方式来刻画人物的内心,而不是直接描写。
比如古诗词中的「风萧萧兮易水寒」、「国破山河在,城春草木深」等。
都是通过环境描写来承托人物内心。
不是因为作家们不愿意直接描写内心感受,而是很多情绪、心境是无法用文字来准确表述的。
中文中的「只可意会,不可言传」说的就是这种情况。
我认为这就是语言表达能力的界限。</p>
<h1>语言的界限是否是意识的界限?</h1>
<p>语言就像是意识的一种近似,虽然可以很接近,但永远无法等同。
我认为语言的界限并不是意识的界限,而是意识表达的界限。
比如,疼痛这一个感觉。
每个人对于疼痛的感受是不同的,而且永远无法相互理解。
男人永远无法体会女人生产时的痛苦。
男人只能通过女人生产时的叫喊、动作以及事后的描述了理解这种疼痛,但是却永远无法真正理解。
所有的语言都无法准确描述和传达这样一种疼痛感受。</p>
<p>在确定了语言的界限是意识表达的界限之后 …</p><p>语言是人类交流最重要也是表达能力最强的一种手段。
但是,在我看来,语言却不是一种足够高效的交流手段。
由于我自己是从事NLP的研究工作的,对于人类语言这一现象,有着一些自己的思考。
下面的三个问题一直萦绕在我的脑海中。</p>
<h1>语言是否有界限?</h1>
<p>首先我想要说的是,语言的表达能力是有界限的。
对于很多人类内心的情绪感受,是无法准确用语言描述出来的。
但是,这些感受却是真实的人类意识的一部分。
因此,在很多文学作品中,都是用环境、对话等方式来刻画人物的内心,而不是直接描写。
比如古诗词中的「风萧萧兮易水寒」、「国破山河在,城春草木深」等。
都是通过环境描写来承托人物内心。
不是因为作家们不愿意直接描写内心感受,而是很多情绪、心境是无法用文字来准确表述的。
中文中的「只可意会,不可言传」说的就是这种情况。
我认为这就是语言表达能力的界限。</p>
<h1>语言的界限是否是意识的界限?</h1>
<p>语言就像是意识的一种近似,虽然可以很接近,但永远无法等同。
我认为语言的界限并不是意识的界限,而是意识表达的界限。
比如,疼痛这一个感觉。
每个人对于疼痛的感受是不同的,而且永远无法相互理解。
男人永远无法体会女人生产时的痛苦。
男人只能通过女人生产时的叫喊、动作以及事后的描述了理解这种疼痛,但是却永远无法真正理解。
所有的语言都无法准确描述和传达这样一种疼痛感受。</p>
<p>在确定了语言的界限是意识表达的界限之后,我真正关心的问题其实是,<strong>人类整体</strong>对自然的理解是否存在一个极限。
想象一下这样一种情况:
一个类似爱因斯坦式的人物,在未来的某一天突然悟出了宇宙的真理,他对于宇宙的理解可以解释宇宙中所有的现象。
但是,他对于宇宙的理解却无法用人类现存的语言描述出来。
也就是说,他虽然解开了宇宙中最重要的秘密,但是却无法把它传播给其他人。
对于人类整体来说,相当于依然处于蒙昧的状态。
因此,虽然语言的界限也许并不会阻碍意识进一步理解自然,但是它却会阻碍人类整体对于自然的理解。</p>
<p>相对的,如果有一种和人类很类似的外星生物,唯一不同点是他们的交流方式是「心灵感应」。
一个个体能够直接将自己的意识投射给另外一个个体(有点类似大刘笔下的三体星人)。
这样的交流方式比人类利用语言进行交流效率高太多了,一旦一个超级个体悟出了真理,那就相当于整个群体得到了真理。
如果,未来我们将要面对的是这样的外星生命,人类还有胜算吗?</p>
<h1>意识是否有界限?</h1>
<p>另外一个更加重要的问题是,人类的意识到底是否有界限呢?
我暂时还不能得出什么坚实的结论,但是我倾向于人类的意识是存在界限的。
人类的意识是建立在经验之上的,对于不存在于我们经验之中的事物,我们的意识是无法达到的。
比如,假如全世界的人都是聋子,或者说,有一种没有听觉器官的智慧生物,他们的意识范围中永远不会出现有关「音乐」的概念,这就是他们的意识的界限。</p>
<p>我们人类拥有听觉、视觉、味觉、触觉、嗅觉这种五种感官,我们对世界的感知就是通过这五种最基本的「传感器」来完成的。
但是,并没有理由因此而认为这就是所有可能存在的感官了。
或许,会有一些外星智慧生物他们的感官系统比人类要复杂得多,他们能够感知到我们人类无法感知的事物。
因此,他们的意识所能达到的范围就会比人类广泛。
他们创造出的科技可以远远领先于人类,而且人类可能永远无法理解他们的科技水平,因为意识界限完全锁死了人类的理解能力。</p>
<h1>更新日志</h1>
<ul>
<li>2018年11月3日写作并发表</li>
</ul>道德的本质2018-10-27T00:00:00-06:002018-10-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-10-27:/words/The-Natural-of-Morality/<p>本文总结了我对「道德」的一些思考结果。</p><p>我之前在博文<a href="http://zhouyichu.com/words/Good-and-Evil/">性本善,性本恶</a>中提到过,「道德」出现的原因是因为人类需要进行合作,既然是合作,那么群体中的个体必然要需要符合某一种行为准则,这样的行为准则就被称为「道德」(其中的部分内容后来逐渐演变为了「法律」)。</p>
<p>我们可以类比一下经济学中的理论。
经济学之父亚当斯密在200多年前就提出了「看不见的手」的理论: 社会中每个个人都在追求自己的利益最大化,最终导致了全社会的利益最大化。
尽管到目前为止,我还无法完全理解其中的原理。
但是,至少亚当斯密的理论向我们指明了这样一种模式: 当群体中的全部个体都尊崇某一种行为准则的时候,群体中就会出现某种社会秩序,这种社会秩序可能会使群体发展得更好,也可能使得群体的发展慢慢没落。</p>
<p>举例来说,在中国古代,中原地区的人拥有较为先进的文明,拥有一套较为完整的「道德」准则;而四周的少数民族则被称为「蛮族」。
随着时间的推移,所谓的「蛮族」会慢慢被「王化」了,逐渐被融入「中华民族」之中。
其实,这个过程本质上就是一种更好的行为准则(道德标准)代替另外一种行为准则(道德标准)的过程。
中原地区的人民很早就拥有了一整套的礼仪标准用来规范人与人之间的交往,这套标准的基本规范是要求人们讲究礼仪,尊重长者,爱护弱小的人;而同时期「蛮族」的道德尊则依然还是丛林法则,弱肉强食。
虽然在短期内,尊崇「丛林法则」的蛮族拥有较高的武力,但是依然被同化进了中原文化的文化圈。
为什么?
因为中原地区的行为准则在当时的条件下能够更好的形成群体之间的合作关系,最大化合作的效率。
因此,「蛮族」被同化的过程就是一种道德代替另外一种道德的过程。</p>
<p>在经济学中,「个体利益最大化」这一行为准则将会导致「社会全体利益最大化」;
而在社会学中,「遵守道德」这一行为准则将会导致「社会合作效率最高」。
他们之间的区别在于,经济学中的行为准则是具体的的,从来没有改变过的;但是社会学中的行为准则,即所谓的道德,却是抽象的,随着不同的时代的变化而变化的。
这就引起了我的思考,究竟什么样的原则决定了能在最大程度上实现人类群体合作的效率最大化的道德准则呢?
每个时代不同的道德标准也许只是这个原则的具体体现而已。
换句话说,是什么决定了一件事是道德还是不道德的?
这个问题困扰了我很久很久,直到我最近在阅读「今日简史」的时候,作者尤瓦尔·赫拉利在书中的一句话点醒了我:</p>
<blockquote>
<p>道德的重点并不是“遵守神圣的诫命”,而是要“减少痛苦”</p>
</blockquote>
<p>这句话的上下文是在对道德和宗教进行对比。
作者在无意中指出了所谓的「道德」的本质: <strong>减少痛苦</strong>,包括自己和别人的。
这就对了,每个个体的痛苦感受会降低个体的工作效率.
这就像是人类群体合作过程中的「摩擦力」,只有不断降低这种摩擦力,人类群体的合作效率就能不断提高。</p>
<p>比如,杀人放火是不道德的,因为他们会造成受害者的痛苦,从而降低他们在社会生产中的效率;扶助救济他人是道德高尚的,是因为被救济的人能够重回社会,为社会生产贡献力量.</p>
<p>所以,道德的本质其实就在于<strong>减少痛苦</strong>,包括自己和别人的,从而达到社会合作的效率最大化。
其实,这也说明了为什么在不同时代下,人类会发展出不同的道德准则。
因为不同的历史时期拥有不同的生产力水平,不同的生产力水平则对人类合作方式会有不同的要求,不同的合作方式需要不同的道德准则来提高合作效率,这就产生了不同的道德准则。</p>
<p>另外需要注意的是,人类社会具有一定程度的「自适应」能力,能够自动匹配到更优的道德准则。
一些国家也许会坚守原来的道德准则,但这就注定了它会被采用了更好的道德准则的国家所「消灭」,不管是征服还是同化。
而现今留存下来的,都是经过多次迭代演化适应了当前生产力的道德准则。
也许,这就是所谓的「历史的潮流」吧?</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://book.douban.com/subject/30259720/">今日简史</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年10月27日写作并发表</li>
</ul>读书笔记:圣殿春秋12018-10-20T00:00:00-06:002018-10-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-10-20:/reading-list/Pillars-of-the-Earth-Part-I/<p>「圣殿春秋」第一部读书感想</p><p>作者: Ken Follett</p>
<h1>主要内容</h1>
<p>这是我第一次阅读背景设定是中世纪的小说。
这只是这部小说的第一部分,这一部分的内容节奏有些缓慢。
主要出场的人物有:</p>
<ul>
<li>建筑匠汤姆一家</li>
<li>网桥修道院副院长菲利普</li>
<li>反叛的巴塞罗缪伯爵</li>
<li>阴险的汉姆雷一家</li>
</ul>
<p>第一部的内容比较简单,主要描述如下几件事:
- 汤姆一家为了生计四处奔波,在他妻子在野外生产去世之后,又和艾伦走到了一起。
- 巴塞罗缪伯爵阴谋反叛刚刚继承王位的新国王,但是反叛事实被揭露,最终自己被抓获。
- 修士菲利普收养了被汤姆遗弃的新生儿,并成功成为了王桥修道院的新院长
- 汉姆雷一家是抓捕巴塞罗缪伯爵的主力。</p>
<p>这些剧情目前看来还是比较分散的,感觉只是一些背景设定。
但是在这个过程中,作者却埋下了好几个暗线。
比如,艾伦和网桥修道院到底有什么瓜葛,杰克到底是谁的儿子;杰克放火烧了修道院这件事后面多半会被重新翻出来;菲利普最终是否会发现他收养的婴儿就是汤姆的儿子?
我相信后面的中下两部会是这些冲突点爆发的地方。</p>
<h1>感想</h1>
<p>之前肯叔的世纪三部曲的时候,我就感到他的作品都是慢热型的。
所以,虽然「圣殿春秋」的这个第一部并没有太过精彩的地方,但是我对它的后续发展还是很期待的。
看小说的最佳的体验是作者描述的故事能够以一种读者能够接受的结局收尾,但是又能以一种出乎意料的方式来收尾。
看完整部小说,能够有一种意料之外,情理之中的快感。
我认为这样的小说才算得上一部优秀的小说。</p>
<p>按照这个标准,这第一部的「圣殿春秋」显然不属于这个范畴。
故事展开的平铺直叙,人物之间的冲突也不是很激烈,几乎没有什么大的冲突。
就像我之前谈到的那样,第一部的叙述只是在搭建整个故事的背景设定,埋下一条条需要的引线。</p>
<h1>更新日志</h1>
<ul>
<li>2018年10月20日写作并发表</li>
</ul>学习的三重境界2018-10-20T00:00:00-06:002018-10-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-10-20:/words/Three-Levels-of-Learning/<p>读书学习了二十多年,慢慢形成了自己对于学习的认知。
本篇文章分享了我自己对于学习的思考。
首先我将学习分为了三重不同的境界,这三重境界有着不同的先后关系。
另外,我对「信息」和「知识」也做出了非常个性化的定义:</p>
<ul>
<li>信息: 任何来自外界的输入</li>
<li>知识: 根据接受的信息更新自己的思维模式、行为准则之后得出的思维成果</li>
</ul>
<h1>第一重境界: 搜集信息</h1>
<p>这是学习过程中最基本的,其实最常见的。
每个人一生下来,就在不断的接受外界的信息,大脑不断记忆处理这些信息,慢慢形成我们最基本的意识。
比如,小时候我们要学习红灯停、绿灯行;过马路要走人行横道等最基本的现代社会规则。
再大一点,我们要学习基本的加减乘除、读书写字.
但是,实际上,个人认为这些只是「信息」,还称不上是「知识」。
这些「信息」是未来形成「知识」的基础。
一直到初高中时代,我们在学校所有的学习过程,本质都是不断接受、累积更多的信息。
当然也有少数优秀的人,在初高中时代就慢慢形成了自己的世界观、形成了自己的思维范式,但这毕竟是少数 …</p><p>读书学习了二十多年,慢慢形成了自己对于学习的认知。
本篇文章分享了我自己对于学习的思考。
首先我将学习分为了三重不同的境界,这三重境界有着不同的先后关系。
另外,我对「信息」和「知识」也做出了非常个性化的定义:</p>
<ul>
<li>信息: 任何来自外界的输入</li>
<li>知识: 根据接受的信息更新自己的思维模式、行为准则之后得出的思维成果</li>
</ul>
<h1>第一重境界: 搜集信息</h1>
<p>这是学习过程中最基本的,其实最常见的。
每个人一生下来,就在不断的接受外界的信息,大脑不断记忆处理这些信息,慢慢形成我们最基本的意识。
比如,小时候我们要学习红灯停、绿灯行;过马路要走人行横道等最基本的现代社会规则。
再大一点,我们要学习基本的加减乘除、读书写字.
但是,实际上,个人认为这些只是「信息」,还称不上是「知识」。
这些「信息」是未来形成「知识」的基础。
一直到初高中时代,我们在学校所有的学习过程,本质都是不断接受、累积更多的信息。
当然也有少数优秀的人,在初高中时代就慢慢形成了自己的世界观、形成了自己的思维范式,但这毕竟是少数。</p>
<h1>第二重境界: 形成思维范式</h1>
<p>在搜集了足够多的信息之后,慢慢就会形成自己的世界观和思维范式。
这里所说的「思维范式」,我是借鉴了托马斯·库恩在「<a href="https://book.douban.com/subject/1123740/">科学革命的结构</a>」中对于「科学范式」的定义。
我将这个概念转移到了人的身上,所谓「思维范式」就是一个人的认知体系、思维模式。
任何一个正常人在学习成长的过程中,必然会经历这一过程,不管是有意识还是无意识的。
通常来说,我认为一般是从无意识开始的。
形成的思维范式在无形中决定了你对一件事的思考角度、行为模式等。
比如,面对失败是逃避还是面对;面对成功你是谦虚还是骄傲等。
你所有的行为、思考都是在这个思维范式的框架之下的。
需要强调的是,这第二重境界在大部分情况下大脑会自发地完成的,不受主观意识的控制。</p>
<h1>第三重境界: 更新思维范式</h1>
<p>第三重境界是最难的,而且也不是所有人都能达到的。
我认为学习的第三重境界就是能够有意识的自主更新自己的思维范式。
不断提升、强化思维方式,以帮助自己在未来做出更好的决策。
而在这个不断提升、强化的过程中,慢慢形成的自己的行为准则,看待世界的方式、思维方式等才是真正属于自己的「知识」。
这里和第二重境界最重要的区别在于,这是在<strong>自主地、有意识地</strong>更新自己的思维范式。</p>
<p>所以,从这个角度来说,任何一本书对除了作者以外的人来说,都是属于「信息」。
即使你读了这本书,也不代表你拥有和作者相同的思维范式,这本书的作用只在于向你展示别人的思考成果,这是别人的「知识」,对你来说这只是「信息」。
只有通过自己的思考,利用这些「信息」提升了自己的思维范式之后,才能说我学习到了更多的「知识」。
举例来说,我现在所写的这篇文章就是我在接受消化了各方不同的「信息」之后,经过我自己思考之后的产物,这篇文章的「信息」来源包括:</p>
<ol>
<li>王国维关于学习的三重境界</li>
<li>「科学革命的范式」一书中对于「科学范式」的定义,我借用了这部分概念来定义「思维范式」</li>
<li>李笑来的「通向财富自由之路」</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%BE%8C%E8%A8%AD%E8%AA%8D%E7%9F%A5">元认知</a>的概念(第三重境界其实就是在发挥元认知的作用)。</li>
</ol>
<p>即使有个人和我一样阅读上述的这些材料,也不一定会写出这篇文章。
这篇文章是我这个个人的思维产物,对我来说这就是我的「知识」,因为我更新了我对学习的理解和认知;而对于任何一个读者来说,我的这篇文章只是有一个信息而已。</p>
<p>从这个角度就能解释什么是「书呆子」了,所谓的「书呆子」其实只是在接受信息,并没有将其消化提升自己的思维范式的人。</p>
<h1>终生学习者</h1>
<p>在工业革命以前,在青春期成型的思维模式已经足够一个人生活一辈子了。
为什么?
因为当时的社会发展缓慢,几百年来可以说毫无变化,同样一个思维范式足够使用一辈子了。
而现在是处于信息时代,科技发展日新月异,每天都会出现新的思想,新的事物。
一个万年不变的思维范式显然已经不够用了。
因此,在当前这个时代,只有做到学习的第三重境界的人才能更好的生存下去。
这就意味着,我们要不断接受更多的有效信息、不断思考、不断更新自己的思维范式。</p>
<p>在现代社会,终生学习者已经不是可选项了,而是每个人的刚需,是不得不选的一个选择.</p>
<h1>参考资料</h1>
<ul>
<li>[科学革命的范式][]</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%BE%8C%E8%A8%AD%E8%AA%8D%E7%9F%A5">元认知</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年10月20日写作并发表</li>
</ul>历史是任人打扮的小姑娘2018-10-13T00:00:00-06:002018-10-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-10-13:/words/History/<p>越是阅读历史,越是觉得我们距离历史的真相越来越远。</p>
<p>「三国志」和「三国演义」的差距已经令人咋舌了,原来以为这只是「演义」和「正史」之间的差别。
但是,翻开其他的正史,其中的人物形象也是可以具有不同的解读方式的。
而且这些不同的解读方式,完全可以按照现代人的需要来任意修改。</p>
<p>当前的中国社会是蓬勃发展的,推崇实力、讲究实用,大家都在疯狂的赚钱。
因此,在这种大环境下,对历史人物的解读也是朝着实用主义的方向发展的。
比如,我们可以对比新旧三国演义的电视剧就能看到,老版的电视剧基本是按照原著拍摄的,而原著明显是站在刘备的立场上来写作的。
重点在强调名义的正统性。
而新版的电视剧明显是给了曹操更多的着墨,把曹操塑造成了一个凭自己的智谋上位的勇者。
而这一形象正是这个时期中国社会喜闻乐见的。</p>
<p>前朝的历史永远是后朝的人在写,同时后朝人永远是在否定前朝人。
因此,我们永远无法看清历史的真相。
史书真的可信吗?
当时写史书的人就像现代拍摄「三国」电视剧的导演一样,只是根据当时的社会风向、当权者的需要对史实进行修改。</p>
<p>从这个角度来说,其实,指鹿为马不是什么不可能的事情。
几千年的历史积淀,不知道已经积淀了多少鹿和马了,可悲的是,我们永远无法区分他们了。</p>
<p>面对真真假假的历史,我们该如何处之 …</p><p>越是阅读历史,越是觉得我们距离历史的真相越来越远。</p>
<p>「三国志」和「三国演义」的差距已经令人咋舌了,原来以为这只是「演义」和「正史」之间的差别。
但是,翻开其他的正史,其中的人物形象也是可以具有不同的解读方式的。
而且这些不同的解读方式,完全可以按照现代人的需要来任意修改。</p>
<p>当前的中国社会是蓬勃发展的,推崇实力、讲究实用,大家都在疯狂的赚钱。
因此,在这种大环境下,对历史人物的解读也是朝着实用主义的方向发展的。
比如,我们可以对比新旧三国演义的电视剧就能看到,老版的电视剧基本是按照原著拍摄的,而原著明显是站在刘备的立场上来写作的。
重点在强调名义的正统性。
而新版的电视剧明显是给了曹操更多的着墨,把曹操塑造成了一个凭自己的智谋上位的勇者。
而这一形象正是这个时期中国社会喜闻乐见的。</p>
<p>前朝的历史永远是后朝的人在写,同时后朝人永远是在否定前朝人。
因此,我们永远无法看清历史的真相。
史书真的可信吗?
当时写史书的人就像现代拍摄「三国」电视剧的导演一样,只是根据当时的社会风向、当权者的需要对史实进行修改。</p>
<p>从这个角度来说,其实,指鹿为马不是什么不可能的事情。
几千年的历史积淀,不知道已经积淀了多少鹿和马了,可悲的是,我们永远无法区分他们了。</p>
<p>面对真真假假的历史,我们该如何处之?我们还能从历史中学到经验吗?</p>
<p>我认为,我们从历史中学习到的经验其实也是由我们的需要决定的。
当我们的社会阶层分化严重的时候,我们会批评胡雪岩官商勾结;而当我们的社会百废待兴,需要实业救国的时候,我们又会说胡雪岩是红顶商人.
这些不同的解读都是由我们的需求来决定的。
所以,其实,我们并不能从历史经验中学习到什么,我们只是利用历史来佐证我们想要做的事情。</p>
<p>就像标题所说的,历史就是一个任人打扮的小姑娘。
当我们需要的时候,我们可以给她带上帽子、披上围巾;当我们不需要的时候,我们可以直接让她一丝不挂。</p>
<h1>更新日志</h1>
<ul>
<li>2018年10月13日写作并发表</li>
</ul>社会的进化与演化2018-10-06T00:00:00-06:002018-10-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-10-06:/words/Social-Adjustment-and-Evolution/<p>之前在<a href="http://zhouyichu.com/words/Adjustment-and-Evolution/">演化与进化</a>中说过,生命的演变过程只是演化而不是进化。
生命只是在不断适应周围的环境,它并没有一个确定的进化方向。
现在觉得,其实同样的思想可以应用在社会发展上面。</p>
<p>我们常常认为社会的发展总是朝着更加高级、更加平等、更加自由的方向上发展,但是我认为这可能是一种错误的期盼。
我们的社会结构只是在不断适应生产力的发展。
不同社会模式之间不存在高低的差别,只有是否适应当前的生产力环境的差别。
并没有什么事物保证未来人类社会就应该是更加尊重人权、每个人都是平等的。
这只是自由主义的宗旨,而自由主义目前看来是最适合当前生产力水平的一种社会模式。
但并不代表,将来它依然是。</p>
<p>20世纪的主义之争(法西斯主义、共产主义、自由主义)其实本质上就是不同社会模式之间的竞争。
如果站在旁观者的角度来看,这些主义之间其实并没有什么优劣高下之分。
真正的差别在于他们能否适应当前人类社会生产力水平。</p>
<p>举例来说,中国古代一直是一种中央集权的模式,而且这种模式延续了2000多年。
生活在那些时代的人也基本是没有所谓的人权的,不知道什么是自由。
但是这并不妨碍古代中国一直是处于领先世界的位置。
为什么?
因为当时的集权式的社会形态能在最大程度上匹配当时的生产力水平。
农业时代生产力水平低下,需要依靠集权的方式来凝聚国力。</p>
<p>然而到了18世纪,工业革命彻底改变了生产力的水平,极大的提高了工业生产效率。
同时19世纪的科学发展,再次推动了生产力的前进。
过去两个世纪的生产力发展,使得当时主流的社会模式变得不再契合,因此各种各样新的社会模式开始出现。
不同的国家选择了不同的模式来度过危机。
英国走向了自由主义、德国走向了集权主义 …</p><p>之前在<a href="http://zhouyichu.com/words/Adjustment-and-Evolution/">演化与进化</a>中说过,生命的演变过程只是演化而不是进化。
生命只是在不断适应周围的环境,它并没有一个确定的进化方向。
现在觉得,其实同样的思想可以应用在社会发展上面。</p>
<p>我们常常认为社会的发展总是朝着更加高级、更加平等、更加自由的方向上发展,但是我认为这可能是一种错误的期盼。
我们的社会结构只是在不断适应生产力的发展。
不同社会模式之间不存在高低的差别,只有是否适应当前的生产力环境的差别。
并没有什么事物保证未来人类社会就应该是更加尊重人权、每个人都是平等的。
这只是自由主义的宗旨,而自由主义目前看来是最适合当前生产力水平的一种社会模式。
但并不代表,将来它依然是。</p>
<p>20世纪的主义之争(法西斯主义、共产主义、自由主义)其实本质上就是不同社会模式之间的竞争。
如果站在旁观者的角度来看,这些主义之间其实并没有什么优劣高下之分。
真正的差别在于他们能否适应当前人类社会生产力水平。</p>
<p>举例来说,中国古代一直是一种中央集权的模式,而且这种模式延续了2000多年。
生活在那些时代的人也基本是没有所谓的人权的,不知道什么是自由。
但是这并不妨碍古代中国一直是处于领先世界的位置。
为什么?
因为当时的集权式的社会形态能在最大程度上匹配当时的生产力水平。
农业时代生产力水平低下,需要依靠集权的方式来凝聚国力。</p>
<p>然而到了18世纪,工业革命彻底改变了生产力的水平,极大的提高了工业生产效率。
同时19世纪的科学发展,再次推动了生产力的前进。
过去两个世纪的生产力发展,使得当时主流的社会模式变得不再契合,因此各种各样新的社会模式开始出现。
不同的国家选择了不同的模式来度过危机。
英国走向了自由主义、德国走向了集权主义、俄罗斯走向了共产主义。</p>
<p>最终事实证明,自由主义是最为契合当前时代生产力的社会模式。
但,我并不认为自由主义就是万年不变的真理。
一旦生产力水平再次发生质的变化,新的社会模式会再次出现,代替现有的自由主义。
新的社会模式可能更加集权、也可能更加自由。
一切都是由生产力水平决定的。</p>
<p>对于未来,尤瓦尔•赫拉利就在「<a href="https://book.douban.com/subject/26943161/">未来简史</a>」中提出了一个比较黑暗的未来社会形态。
随着人工智能、机器学习继续不断发展,生产力水平越来越高,同时也变得越来越智能。
最终将会发展到不需要人工参与就能大规模的生产。
这就将会导致大量的工人找不到工作,这些被机器代替工作的人将会形成一个新的阶级——「无用阶级」。
现代社会的基本共识之所以是「平等自由」,是因为现代社会还是需要每个个体做出贡献。
既然每个人都参与到社会生产中,那么政府就应该保证每一个人的权利。
但是,一旦形成这样一群「无用阶级」的话,整个社会形态就会发生变化。
社会不需要这些人就能保持运转,那么为什么还需要保护这些人的权利呢?
仔细想想其实挺可怕的。
当然,我并不认为赫拉利的未来一定会发生,但是我认为我们不应该假设未来社会就一定是更加公正、更加平等的。</p>
<p>从这个角度来说,现代社会的认知共识: 「每个人都是自由平等」其实是非常脆弱的。
因为大自然中并没有什么事物能够保证这一点。
社会的发展并不是朝着所谓更高级的方向前进,它只是在不断演化,以更加适应当时的生产力水平。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://book.douban.com/subject/26943161/">未来简史</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年10月6日写作并发表</li>
</ul>神奇的人脑2018-09-29T00:00:00-06:002018-09-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-29:/words/Human-Mind/<p>人脑真的是一个非常神奇的东西。本文总结了一些自己对于人脑发展的一些思考.</p><p>人脑真的是一个非常神奇的东西。</p>
<h1>远古时代</h1>
<p>在远古时代,人类还在茹毛饮血的时期,我们祖先的大脑就已经成型了。
对于当时恶劣的生存环境,大部分动物都是在生理上飞速进化,比如更尖锐的爪子、更强壮的肌肉、更灵敏的感官等。
而我们人类的祖先,却在进化之路上走出了截然不同的道路。
人类在智力上发生了进化。
在当时弱肉强食的时代,这是极其「高瞻远瞩」的选择,因为身体上的弱势,很有可能在充分发挥这份智力之前就已经被其他生理上更强壮的动物所灭绝了。
幸运的是,我们的祖先最终在丛林法则中胜出了。
依靠智能,创建了社会、形成了合作关系、开始使用工具,逐步走到了食物链的顶端。</p>
<p>回顾这段历史,简直就是不可思议。
很难想象,在人类还在丛林中和野兽搏斗的时代,人类的大脑就已经具有理解微积分这种抽象概念的潜力了。
这是远远超出当时的时代要求的。
我个人觉得这已经是进化论所无法解释的了。
之前在<a href="http://zhouyichu.com/words/Adjustment-and-Evolution/">演化与进化</a>就讨论过,达尔文进化论的思路其实并不是「进化」,只是「演化」而已。
所以按照进化论的思路,我们的祖先应该优先演化出更加适合生存的东西,比如坚固的牙齿、强状的身体等。
演化的过程是不会考虑几万年后人类是否能够理解微积分的。
如此一想,不禁让人产生怀疑,难道真有一只「神之手」创造出了人类这一独一无二的物种?</p>
<h1>数字时代</h1>
<p>在人类利用这个独一无二的大脑创造出了人类文明之后,历史走到了我们当前所处的时代。
在人类产生历史之后,按照计算机的思路来说,人脑一直在发挥着两种最重要的功能: <strong>记忆</strong>和<strong>计算</strong>.</p>
<p>人脑具有强大的记忆能力,而人类的认知过程也是从记忆开始的。
比如,我们需要记住我们的父母是谁、需要记住红灯行绿灯停还需要记住地球是环绕着太阳运行的。
所有的这一切记忆,都是每个人类个体在现代社会生存的基础。</p>
<p>除了,记忆能力,人脑还具有「计算」能力。
这里的计算并不是指加减乘除等简单的算术,而是指一切需要消耗脑力思考的问题。
比如个人职业选择、今晚做什么晚饭等。
这些脑活动本质就是「计算」,它需要调用记忆中的相关食物,进行计算之后得出结果。</p>
<p>人类就是靠着这两种最基本的能力,一直从远古时代走到了现在的数字时代。
然而,尽管在远古时代,人类是远远领先当时的时代的;但是在数字时代,人脑的记忆和计算能力已经快跟不上这个时代了。
现代科学的发展,为人类整体创造出了大量的知识,而随着这些知识越来越多,对于下一代人类,将会花费更多的时间才能全部学习完成,然后又要花费更多的时间来增加新的知识。
那我们可以扩展的极致,未来某一天,当人类积累的知识变得非常庞大,庞大到一个人花费一辈子的时间来学习也无法全部学习完成的时候,人类对于自然的理解也将达到极限。
这是否是「神之手」给人类设下的极限,我不得而知。
但是,我知道,达到那个是时间点的时候,一定是人脑潜力发展到极限的时候。</p>
<p>由此看来,人类文明的发展历史其实就是人类从0%使用大脑到100%使用大脑的过程。</p>
<h1>更新日志</h1>
<ul>
<li>2018年9月29日 写作并发表</li>
</ul>读书笔记:一本书读懂财报2018-09-23T00:00:00-06:002018-09-23T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-23:/words/A-Book-Understanding-of-financial-Statement/<p>「一本书读懂财报」读书笔记</p><p>作者: 肖星</p>
<h1>摘录</h1>
<blockquote>
<p>企业一辈子只做了三件事: 经营、投资和融资</p>
</blockquote>
<p>简单明了的总结</p>
<blockquote>
<p>资产和费用之间有一个很大的共同之处,就是都得花钱。但如果这笔钱可以换来一个队将来有用的东西,那它就是一个资产。如果这笔钱花完了就完了,那它就是费用。</p>
<p>看懂资产负债表,能得知投入的本金是否得到保障;而看懂利润表,则能得知投入的本金有没有赚到钱。</p>
<p>所有企业都在进行一个从现金开始又回到现金的经营过程。</p>
<p>当我们谈到利润最大化的时候,本质上是在说企业追求收益的重要性;而我们说现金为王的时候,则是在说企业需要关注风险</p>
</blockquote>
<h1>综述</h1>
<p>本书是非常优秀的会计入门书,它帮助我建立了对于财务审计的基本思想框架。</p>
<p>前四章分别阐述了会计审计中最重要的三张表: 资产负债表、利润表和现金流表
之后又用了五章的篇幅说明了如何使用者三张表来分析一家企业的运营状况。</p>
<h1>结构和细部</h1>
<h2>企业的经济活动</h2>
<ul>
<li>经营活动、投资活动、融资活动三种活动的循环往复,财务报表描述这些经济活动。</li>
<li>企业的根本目的: <strong>盈利</strong></li>
<li>基本要求: 本金不遭到损失</li>
</ul>
<h2>资产负债表: 投入的本金能否得到保障</h2>
<p>资产负债表是一个时点概念。</p>
<h3>资产</h3>
<ol>
<li>会计恒等式: 资产=负债+股东权益</li>
<li>流动资产项目: 可以在一个经营周期内变现或运用的资产<ul>
<li>货币资金</li>
<li>应收账款</li>
<li>其他应收账款</li>
<li>产成品</li>
<li>存货</li>
<li>待摊费用</li>
</ul>
</li>
<li>非流动资产项目: 不能在一个循环之内就将自己完全变现的资产<ul>
<li>长期投资</li>
<li>固定资产</li>
<li>无形资产</li>
</ul>
</li>
</ol>
<h3>负债</h3>
<ol>
<li>流动负债: 企业一年内必须支付的账款<ul>
<li>短期借款</li>
<li>应付账款</li>
<li>其他应付账款</li>
<li>应付工资</li>
<li>应交税款</li>
</ul>
</li>
<li>非流动负债<ul>
<li>长期借款</li>
<li>长期应付款</li>
</ul>
</li>
</ol>
<h3>股东权益</h3>
<ul>
<li>股本</li>
<li>未分配利润</li>
</ul>
<h2>利润表: 本金有没有赚到钱</h2>
<ul>
<li>营业收入: 卖出产品所获得的收益</li>
<li>营业成本: 卖出的产品</li>
<li>营业费用: 公司销售、杂项与管理费用</li>
<li>营业外支出</li>
<li>营业外收入</li>
<li>利润=销售收入-销售成本-费用</li>
<li>利润表主要回答两个问题:<ol>
<li>有没有赚到钱</li>
<li>在哪里赚到钱</li>
</ol>
</li>
</ul>
<h2>现金流表</h2>
<ul>
<li>相当于流水账</li>
<li>可以了解现金增减的原因: 解释了资产负债表上货币资金增减变化的原因</li>
</ul>
<h2>影响财务数据的因素: 环境、战略、执行力</h2>
<h3>环境</h3>
<ul>
<li>五力模型<ul>
<li>供应商议价能力</li>
<li>购买者议价能力</li>
<li>潜在竞争者进入的能力</li>
<li>替代品的替代能力</li>
<li>行业内竞争现在的竞争能力</li>
</ul>
</li>
<li>战略<ul>
<li>成本领先战略: 毛利率低,高周转。努力降低成本,薄利多销</li>
<li>差异化战略: 高毛利,低周转。使自己的产品差异化</li>
</ul>
</li>
</ul>
<h2>财务分析: 理解三张表</h2>
<ul>
<li>同型分析</li>
<li>比例分析</li>
<li>偿债能力</li>
<li>企业的运营能力</li>
</ul>
<h1>评价</h1>
<p>内容非常好,但是结构上略显凌乱。
虽然看得出经过了编辑整理,但是章节划分上还是觉得有提高的余地。</p>
<h1>和我的关系</h1>
<p>帮助我建立最基本的财务分析思维框架,算是带我入门了。</p>
<h1>脑图</h1>
<p><img alt="Financial" src="http://zhouyichu.com/images/financial-statement.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年9月23日写作并发表</li>
</ul>如何坚持做一件事2018-09-22T00:00:00-06:002018-09-22T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-22:/words/Keep-Doing/<p>来美国生活之后,渐渐养成了一些个人认为比较好的学习、生活习惯。
对于如何坚持完成一件事,我也有了一些自己的心得,想要在这里分享一下。</p>
<p>首先,在这篇文章中我谈论的需要坚持的事情都是属于「低频率高强度反馈」的事情。
比如每天的读书、健身、运动等习惯。
为什么说是「低频率高强度反馈」呢?
因为当你坚持完成这些事情的时候,你无法收到即时反馈,只有当你坚持足够长的时间内之后,这些事情的正向反馈才会慢慢显露出来。
但是,一旦效果开始展露出来,一定会产生非常巨大的效果。</p>
<p>然而,很多人在很多时候都无法坚持到效果展现就在中途放弃了(包括过去的我)。</p>
<p>本片文章将会说明我是如何学会坚持一件事情的。</p>
<h1>认识到积累的重要性</h1>
<p>我觉得要坚持做一件「低频率高强度反馈」事,首先要认识到这是一个长期的过程。
要有足够的心理预期,这些事情不是一朝一夕就能看到结果的。
不要妄想坚持一周、一个月就能看到结果。
我经常用一句话来告诫自己: 「人们常常会高估自己一年内能做到事情,但是会低估五年内能做到的事情」.
对于我来说,「读书」和「健身」已经被我视为我终生的事业。
所以,即使现在不展露出效果来,我也不焦躁、不担心。
我已经把它们作为终生的事情,不会基于一时的失败而放弃他们 …</p><p>来美国生活之后,渐渐养成了一些个人认为比较好的学习、生活习惯。
对于如何坚持完成一件事,我也有了一些自己的心得,想要在这里分享一下。</p>
<p>首先,在这篇文章中我谈论的需要坚持的事情都是属于「低频率高强度反馈」的事情。
比如每天的读书、健身、运动等习惯。
为什么说是「低频率高强度反馈」呢?
因为当你坚持完成这些事情的时候,你无法收到即时反馈,只有当你坚持足够长的时间内之后,这些事情的正向反馈才会慢慢显露出来。
但是,一旦效果开始展露出来,一定会产生非常巨大的效果。</p>
<p>然而,很多人在很多时候都无法坚持到效果展现就在中途放弃了(包括过去的我)。</p>
<p>本片文章将会说明我是如何学会坚持一件事情的。</p>
<h1>认识到积累的重要性</h1>
<p>我觉得要坚持做一件「低频率高强度反馈」事,首先要认识到这是一个长期的过程。
要有足够的心理预期,这些事情不是一朝一夕就能看到结果的。
不要妄想坚持一周、一个月就能看到结果。
我经常用一句话来告诫自己: 「人们常常会高估自己一年内能做到事情,但是会低估五年内能做到的事情」.
对于我来说,「读书」和「健身」已经被我视为我终生的事业。
所以,即使现在不展露出效果来,我也不焦躁、不担心。
我已经把它们作为终生的事情,不会基于一时的失败而放弃他们。</p>
<h1>回顾</h1>
<p>坚持一件事第二重要的是「记录与回顾」。
一定要做好自己的记录,以便时时回顾自己近期的状况。
有了记录,我们就能从全局的角度来看待整个事情,而不需要纠结与当下具体的操作。
比如,如果你追踪你每周健身的次数和时间的话,你就能掌握自己到底处于什么样的状态。
是一周一次还是一周四次,是按照计划还是早已脱离计划。
坚持做一件事,并不是说一次例外都不能有。
例外总是会有的,但是这并不可怕。
你只需了解自己的整体状况是足够好的就行了。
比如已经连续2周每周4次健身了,那么本周跳过一天休息一下未尝不可。
坚持一件「低频率高强度反馈」的事情,不需要处处纠结于每个具体的事情,只需要在大方向上保持坚持和进度就可以了。
要给自己的足够的弹性空间。
这是坚持一件事非常重要的一点。
因为,过去多次失败的经历告诉我,一次失败可能就会导致整个坚持的计划失败。</p>
<h1>技巧</h1>
<p>在明确了基本的方法论之后,我还想谈一下具体的操作方法。</p>
<ol>
<li>
<p><strong>固定时间做固定事情</strong></p>
<p>这其实是一个很好的习惯。
因为一旦形成了固定时间做固定的事情的习惯,你想要不做都是难的。
想想你每天早上刷牙和洗脸的习惯,这不就是最典型的「固定时间做固定的事」。
你还记得你上次早上忘记刷牙和洗脸是什么时候吗?</p>
</li>
<li>
<p><strong>感知问题所在</strong></p>
<p>这涉及到对「元认知」的理解。
简单来说,当你由于今天要不要去健身的时候,你就要认识到自己正在处于摇摆不定的状态。
认知到自己的这种状态是很容易倾斜的。
这个时候,你就需要一些「咒语」来提醒自己,不能让自己放弃所坚持的事情。
(咒语的概念来自于<a href="https://book.douban.com/subject/7001105/">毅力-如何培养自律的习惯</a>一书)
对于我个人来说,我常用的两句咒语是:
- 做正确的事,而不是简单的事情
- 在逆境中坚持才能区别出普通人和精英</p>
</li>
</ol>
<h1>参考资料</h1>
<ul>
<li><a href="https://zh.wikipedia.org/wiki/%E5%BE%8C%E8%A8%AD%E8%AA%8D%E7%9F%A5">元认知</a></li>
<li><a href="https://book.douban.com/subject/7001105/">毅力-如何培养自律的习惯</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年9月22日写作并发表</li>
</ul>读书笔记:Writing The Doctorial Dissertation2018-09-15T16:43:12-06:002018-09-15T16:43:12-06:00Flyawaytag:zhouyichu.com,2018-09-15:/reading-list/Writing-The-Doctorial-Dissertation/<p>「Writing The Doctorial Dissertation」读书笔记</p><p>作者: Davis, Gordon B.; Parker, Clyde A.; Straub, Detmar W.</p>
<h1>综述</h1>
<p>本书提供了一种系统化的方法来指导学生完成博士论文。</p>
<h1>结构和细部</h1>
<p>本书从头到尾描述了一个好的博士论文的研究过程应该是怎么样的。
首先是要提前做好规划,预估需要花费的时间,系统化追踪每天的研究进度。
根据书中的描述,一个合格的博士论文通常长度在200页左右,需要花费2500的小时的工作量。</p>
<p>接着从知识工作的特点、博士论文的选题、和老板的沟通等方面展开了论述,讲解了在读博士期间各个阶段需要认真对待的事情。</p>
<p>其中比较有价值的建议包括:</p>
<ol>
<li>减少和老板沟通的成本。比如提前写好meeting的agenda;每次meeting都做好笔记、所写的材料都以大纲的形式给出简略版。</li>
<li>提前规划好研究活动,做好时间的分配</li>
<li>做好生活和研究的平衡,不要因为太过痴迷研究和忽略了家人。</li>
</ol>
<h2>Writing Proposal</h2>
<p>通常来说,博士论文的proposal包括了以下几个部分:</p>
<ol>
<li>Summary</li>
<li>Hypothesis, problem or question</li>
<li>Importance of topic</li>
<li>Theorretical base for the research</li>
<li>Prior research on topic</li>
<li>Research approach</li>
<li>Limitations and key assumptions</li>
<li>Contribution to knowledge</li>
<li>Description of proposed chapters in dissertation</li>
</ol>
<p>博士研究的过程其实就是不断改进、完善proposal的过程,当你最终确定了一个proposal的时候,你也就得到了你的博士论文。</p>
<h1>评价</h1>
<p>这确实是一本好书,对于刚刚开始博士生涯的学生来说,确实是一本不错的书籍。</p>
<h1>和我的关系</h1>
<p>由于这本书是从事社会课题研究的研究者所写的,因此在内容上有很多的建议对于CS来说并没有什么太大的借鉴意义。
而且,我自己目前已经形成了一套自己的研究习惯,而这些习惯和本书中给出的建议很相似。
因此,尽管这是一本不错的书,但是对于我来说,其实并没有提供什么太有价值的新思想。</p>
<p><img alt="Dissertation-Management-Approach" src="http://zhouyichu.com/images/Dissertation-Management-Approach.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年9月15日写作并发表</li>
</ul>官僚体系的历史作用2018-09-15T00:00:00-06:002018-09-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-15:/words/Bureaucrat/<p>大约半年前,我写过一篇博文<a href="http://zhouyichu.com/words/Union-of-World/">天下合久必分,分久必合</a>来分析为什么中国的历史,一直都是一个统一的大国形象出现的。
当时写作的时候,觉得自己的分析是正确的。
然而,经过这半年的阅读和思考,我现在认为当时的分析还是不够全面的。
这里面的原因其实还有很多,今天想要说的是另外一个至关重要的原因: <strong>强大的官僚体系</strong></p>
<p>我一直在思考,为什么中国每次都能够从战乱中浴火重生,重新形成一个强大稳定的帝国。
在<a href="http://zhouyichu.com/words/Union-of-World/">天下合久必分,分久必合</a>里,我认为是因为中国大地上一直有着一种「天下」的概念,每一代的帝王或军阀,都无不以「一统天下」为己任。
然而,这种「天下」的意识只能回答问题的一方面: 为什么会再次形成一个大帝国?
问题的另外一个方面: "为什么大帝国能够稳定持续的存在一两百年",这种「天下」的意识就无法解释了。</p>
<p>我一直比较喜欢将中国的历史和罗马的历史进行比较,罗马和中国一样,在历史上都是以一个超级大国的形象出现的。
然而,罗马帝国雪崩之后就再也没有恢复过往日的辉煌。
而中华大地上,尽管征战不断,但是最终依然会形成一个稳定的大帝国,和平稳定会再次统治。</p>
<p>为什么?</p>
<p>其中一个非常重要的原因就是中国人发明了强大的官僚体系来管理庞大的国家。
对比当时的罗马帝国 …</p><p>大约半年前,我写过一篇博文<a href="http://zhouyichu.com/words/Union-of-World/">天下合久必分,分久必合</a>来分析为什么中国的历史,一直都是一个统一的大国形象出现的。
当时写作的时候,觉得自己的分析是正确的。
然而,经过这半年的阅读和思考,我现在认为当时的分析还是不够全面的。
这里面的原因其实还有很多,今天想要说的是另外一个至关重要的原因: <strong>强大的官僚体系</strong></p>
<p>我一直在思考,为什么中国每次都能够从战乱中浴火重生,重新形成一个强大稳定的帝国。
在<a href="http://zhouyichu.com/words/Union-of-World/">天下合久必分,分久必合</a>里,我认为是因为中国大地上一直有着一种「天下」的概念,每一代的帝王或军阀,都无不以「一统天下」为己任。
然而,这种「天下」的意识只能回答问题的一方面: 为什么会再次形成一个大帝国?
问题的另外一个方面: "为什么大帝国能够稳定持续的存在一两百年",这种「天下」的意识就无法解释了。</p>
<p>我一直比较喜欢将中国的历史和罗马的历史进行比较,罗马和中国一样,在历史上都是以一个超级大国的形象出现的。
然而,罗马帝国雪崩之后就再也没有恢复过往日的辉煌。
而中华大地上,尽管征战不断,但是最终依然会形成一个稳定的大帝国,和平稳定会再次统治。</p>
<p>为什么?</p>
<p>其中一个非常重要的原因就是中国人发明了强大的官僚体系来管理庞大的国家。
对比当时的罗马帝国,不管是王政时代、共和时代还是后来的帝国时代,罗马的官方统治机构其实是非常零散的。
比如最重要的一个的差别就在于税收,中国古代有一整套的官僚体系来收税;而罗马的统治阶级却只是直接将税收的事情外包给私人机构执行。
如此重要的国家财政来源却承包给私人机构来执行,虽然节省了大量的人力物力,但是也失去了对国家的最基本的控制力。
而税收仅仅只是一个例子而已。
在阅读「罗马人的故事」中出现的罗马官职屈指可数: 执政官、护民官、财务官、总督。
对比中国的历史,中国政府的管理机制却是异常的庞大,从最早的三公九卿到后来的三省六部,无一不是庞大的官僚机构。
不仅如此,中国古代的公务人员还分为官和吏,还区分不同的等级。</p>
<p>除了负责正常政务的官僚,中国古代还设立了各种各样的监察机构,比如御史台等。
这些机构确保了地方管理不会肆意妄为,不会割土自立。
中国还拥有科举制度用来选拔人才,不断扩充官僚体系,为统治阶级输入新鲜血液。
完整的政治制度是中国古代能够维持庞大帝国的重要原因之一。</p>
<p>中国的历朝历代就是依靠如此强大的官僚体系维持帝国的统治的。
这在西方历史上我是没有看到过的。
古代西方没有足够的成熟的政治制度,无法对庞大的帝国进行有效的管理,由此产生的结果就是,庞大的帝国也许能够因为英明神武的国王而得以维持,但是因为没有稳定的政治制度,一旦国王去世,他的帝国也随之分崩离析。
因此,欧洲的历史就是小国林立的历史。
即使能够武力统一,也无法维持。</p>
<h1>更新日志</h1>
<ul>
<li>2018年9月15日 写作并发表</li>
</ul>读书笔记:世界上最简单的会计书2018-09-08T00:00:00-06:002018-09-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-08:/reading-list/The-Accounting-Game/<p>「世界上最简单的会计书 」读书笔记</p><p>作者:达雷尔•穆利斯 / 朱迪丝•奥洛夫</p>
<h1>摘录</h1>
<blockquote>
<p>资产负债表的编制目的就是在人和物之间建立一种联系,它表明了你在生意中所拥有的东西以及这些东西与那些拥有它的人之间的关系</p>
</blockquote>
<h1>综述</h1>
<p>这本书是非常好会计入门书,以非常生动的例子讲解了最基本的现代会计记账流程和原则。
全书以一个小男孩创业的过程,说明在整个企业经营过程中各种账务的记录和分析。
原来一直以为记账就是记账,只要如实记录交易就可以了。
但是,通过这本书,了解到了什么是复式记账,这是现代财务的基础。
对我来说,有一种打开了新世界大门的感觉。</p>
<h1>结构和细部</h1>
<p>全书用了前四章的内容讲解说明了企业经营中可能遇到的各种各样的问题,以及这些问题是如何影响财务报表的。
财务报表主要有三张表组成:
1. 资产负债表
2. 收益表
3. 现金流表</p>
<p>其中本书着重强调介绍了资产负债表,这是三张表中最重要的一张表。</p>
<p>在剩下的章节中,作者介绍了现代财务系统中不同的结算方式、资本化、折旧等一些列的内容。</p>
<h2>资产负债表</h2>
<ul>
<li>资产负债表就像是一个快照,它是在某一个时间点对企业的一个整体评估。</li>
<li>资产负债表由三部分组成:<ul>
<li>资产: 企业目前所有可以利用的资源</li>
<li>负债: 未来必须付出的经济利益</li>
<li>所有者权益: 指企业所有权人对企业剩余资产的请求权
其中「资产=负债+所有者权益」这个等式在会计行业中称为「会计恒等式」。这是整个会计行业的基础等式。</li>
</ul>
</li>
</ul>
<p>简单来说,资产负债表左边说的是,钱被拿去做了什么(资产),右边说的是企业的钱从哪来(负债+所有者权益)</p>
<ul>
<li>成本&费用<ul>
<li>成本: 产品生产过程中需要的经济资源</li>
<li>花费: 剔除产品生产成本之外企业经营所需要的花费</li>
</ul>
</li>
</ul>
<h2>利润表</h2>
<p>资产负债表是快照,利润表则是一台放映机。
它所呈现的在一定的经济周期内,企业所得所有利润。</p>
<ul>
<li>毛利=销售收入-销售成本</li>
<li>净利润=毛利-费用</li>
</ul>
<h2>现金流表</h2>
<p>在制作上述两张表的时候,一般遵循的是权责发生制。</p>
<ul>
<li>权责发生制: 对于发生的交易都进行会计核算,无论是否支付或收到</li>
<li>收付实现制: 只记录发生的现金交易</li>
</ul>
<p>而现金流表是按照收付实现制进行记录的,它描述的是整个企业所拥有的现金量。</p>
<h1>评价</h1>
<p>这确实是一本非常好的入门书籍。
尽管从会计专业的角度来说,这本书也许过于幼稚了。
但是对于我这样的会计门外汉来说,这本书是最好不过的入门书籍。</p>
<h1>和我的关系</h1>
<p>我之所以想要开始了解学习财会知识,是因为我决定要好好打理的自己的财富状况。
虽然,之前也有一段时间坚持记账。
然而我发现单纯的记账并没有什么效果。
直到我发现了复式记账这种方式以及三大财务表。
虽然这些记账方式为了企业而发明出来,但是没人说这不能应用到个人和家庭财务管理上面。
单纯的记账实在无法反映出一个家庭的真实财务状况。</p>
<h1>更新日志</h1>
<p>2018年9月8日写作并发表</p>为什么word embedding不能是一维的?2018-09-08T00:00:00-06:002018-09-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-08:/words/Word-Embedding-Dimension/<p>自从开始接触word embedding之后,其实我一直在思考为什么word embedding必须是高维的?
要知道,即使只有一个维度,只要它是一个实数,理论上它也能够包含无穷的信息。
可是,为什么word embedding必须是高维的?</p>
<p>虽然这个问题不影响我去理解各种各样的embedding模式,但是在学习和使用embedding的过程中,总觉得缺了一点什么的东西,让我无法彻底理解word embedding.</p>
<p>知道最近我开始阅读关于embedding最早的几篇论文,尤其是Hinton在三十多年前的<a href="http://web.stanford.edu/~jlmcc/papers/PDP/Volume%201/Chap3_PDP86.pdf" title="Distributed Representation">Distributed Representation</a>,我才慢慢开始理解所谓的embedding到底是什么东西。</p>
<p>首先,回到我最初提出的问题,为什么embedding不能是一维的?多维的向量能够表示的信息,我用一个实数也能表示,因为实数域本是就是无限的,我们可以把任何信息编码为一个实数。
那么高维的优势到底在什么地方呢?</p>
<p>根据Hinton的分析,高维度embedding的优势在于泛化性。
一个实数确实可以表示无穷的信息,但是它缺乏足够的泛化性。
比如,假设我用维度为4的embedding来表示「猫」和「狗」的概念。
「猫」和「狗」这概念具有很强的相似性: 它们都是人类的宠物,都是哺乳动物。
因此,它们的embedding应该具有很强的相似性。
比如「猫」这个概念的embedding可以是 …</p><p>自从开始接触word embedding之后,其实我一直在思考为什么word embedding必须是高维的?
要知道,即使只有一个维度,只要它是一个实数,理论上它也能够包含无穷的信息。
可是,为什么word embedding必须是高维的?</p>
<p>虽然这个问题不影响我去理解各种各样的embedding模式,但是在学习和使用embedding的过程中,总觉得缺了一点什么的东西,让我无法彻底理解word embedding.</p>
<p>知道最近我开始阅读关于embedding最早的几篇论文,尤其是Hinton在三十多年前的<a href="http://web.stanford.edu/~jlmcc/papers/PDP/Volume%201/Chap3_PDP86.pdf" title="Distributed Representation">Distributed Representation</a>,我才慢慢开始理解所谓的embedding到底是什么东西。</p>
<p>首先,回到我最初提出的问题,为什么embedding不能是一维的?多维的向量能够表示的信息,我用一个实数也能表示,因为实数域本是就是无限的,我们可以把任何信息编码为一个实数。
那么高维的优势到底在什么地方呢?</p>
<p>根据Hinton的分析,高维度embedding的优势在于泛化性。
一个实数确实可以表示无穷的信息,但是它缺乏足够的泛化性。
比如,假设我用维度为4的embedding来表示「猫」和「狗」的概念。
「猫」和「狗」这概念具有很强的相似性: 它们都是人类的宠物,都是哺乳动物。
因此,它们的embedding应该具有很强的相似性。
比如「猫」这个概念的embedding可以是<span class="math">\(<1,10,1,2>\)</span>,「狗」的embedding可以是<span class="math">\(<2,20,3,4>\)</span>。
而这两个embedding的相似性体现在其前两个维度是1比10的比率,这是一种pattern,也许这种pattern表示的是「人类宠物」这一抽象概念。
而如果,我们将「猫」和「狗」这两给概念编码为两个实数,它就失去了这种pattern的表示。
这种pattern的优势在于,它不限于「猫」和「狗」这两个概念,同样的pattern可以出现在其他概念的embedding中。
比如,金鱼的embedding可以是<span class="math">\(<3,30,1,30>\)</span>,它同样包含了「人类宠物」这一pattern。
即使我们不知道它表示的是什么,我们也能知道它表示一定是某一种「人类宠物」。
这就是泛化性。
这是只有一个维度的embedding难以做到的事情。
维度越高,那么embedding能够包含的pattern就越多,因此在一般情况下,高维的embedding通常要比低维的质量要高。</p>
<p>当年刚接触embedding概念的时候,最惊艳的是觉得它最大的优点在于使得很多语义上的抽象概念变得可计算了。
任何一个语义、抽象概念都可以表示为空间中的一个向量,而我们对于向量可以应用各种计算。
在理解了泛化性之后,我发现这才是embedding真正的优势。
它可以将一个抽象表示打散成多个维度上面的表示,从而形成一系列的pattern,而这些pattern是可以出现其他不同的embedding中的,这大大增加了这种表示方式的泛化能力。
而可计算的特点仅仅是这种泛化性的一个副作用而已。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://web.stanford.edu/~jlmcc/papers/PDP/Volume%201/Chap3_PDP86.pdf">Distributed Representation</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年9月8日写作并发表</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>美国两年2018-09-01T00:00:00-06:002018-09-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-09-01:/words/Two-Years-In-USA/<p>在美国生活整两年了,在这期间经历了不少的事情,接触到了很多和中国体制不一样的地方。
虽然,两年前已经写过了来到美国初体验(<a href="http://zhouyichu.com/words/First-Month-In-USA/">First-Month-In-USA</a>),但是这两年里又有了很多新感触,想要记录一下。</p>
<h1>看病</h1>
<h2>费用</h2>
<p>看病的问题是全世界所有国家的老大难问题。
我在美国也经历过几次去医院看病的经历,总体感受只能说是很国内的情况完全不一样。
首先,如果没有保险,在美国是根本看不起病的。
去年9月份的时候,我去校医院做了一次胃镜。
几个月之后我收到一张高达3500刀的账单......
而国内同样的胃镜,只需要几百块吧。
幸好学校是给办了保险的,保险覆盖之后,我仍然需要支付672刀。
这和国内依然有很大差距。
在美国,实在是生不起病。
从我个人的经验来说,从费用上比,国内的看病成本其实是要比美国低的。</p>
<h2>流程</h2>
<p>美国的看病流程也和国内有很大的不同。
美国看病都是需要提前预约的,一些小病大概1周内能够预约得到。
但如果需要做一些大的检查,比如拍X片、胃镜这些检查,你能够预约到的时间很有可能是几个月之后了。
比如,今年我又要去做胃镜的复查。
我7月份打电话预约,最早只能预约到9月份。
所以,在美国不仅看病贵,而且预约也非常得慢。</p>
<h2>设备和态度</h2>
<p>不过,对于美国的医疗条件和医生的职业态度我还是很认可的。
去年我第一次预约看医生的时候,首先是来一个护士对你做一些最基本的检查 …</p><p>在美国生活整两年了,在这期间经历了不少的事情,接触到了很多和中国体制不一样的地方。
虽然,两年前已经写过了来到美国初体验(<a href="http://zhouyichu.com/words/First-Month-In-USA/">First-Month-In-USA</a>),但是这两年里又有了很多新感触,想要记录一下。</p>
<h1>看病</h1>
<h2>费用</h2>
<p>看病的问题是全世界所有国家的老大难问题。
我在美国也经历过几次去医院看病的经历,总体感受只能说是很国内的情况完全不一样。
首先,如果没有保险,在美国是根本看不起病的。
去年9月份的时候,我去校医院做了一次胃镜。
几个月之后我收到一张高达3500刀的账单......
而国内同样的胃镜,只需要几百块吧。
幸好学校是给办了保险的,保险覆盖之后,我仍然需要支付672刀。
这和国内依然有很大差距。
在美国,实在是生不起病。
从我个人的经验来说,从费用上比,国内的看病成本其实是要比美国低的。</p>
<h2>流程</h2>
<p>美国的看病流程也和国内有很大的不同。
美国看病都是需要提前预约的,一些小病大概1周内能够预约得到。
但如果需要做一些大的检查,比如拍X片、胃镜这些检查,你能够预约到的时间很有可能是几个月之后了。
比如,今年我又要去做胃镜的复查。
我7月份打电话预约,最早只能预约到9月份。
所以,在美国不仅看病贵,而且预约也非常得慢。</p>
<h2>设备和态度</h2>
<p>不过,对于美国的医疗条件和医生的职业态度我还是很认可的。
去年我第一次预约看医生的时候,首先是来一个护士对你做一些最基本的检查,比如血压、心跳等,然后才是专业的医师过来为你诊断。
医生的态度非常好,会详细询问你的症状,而当你提问时,他站立的笔直,就像是在聆听领导说话一样。
这边的医疗设备也非常的好,我做胃镜是全身麻醉的,一共有三位医护人员。一个做胃镜的医师、一个麻醉师还有一个护士。
从头到尾的体验都是非常好的。
这些专业人士真的是非常专业!</p>
<p>就从设备和医护人员的态度上,美国确实要比中国好太多了。
国内的胃镜默认只是对你咽喉和嘴部进行麻醉,胃镜过程中你还会不断反胃将胃酸吐出来,整个过程是非常难受。</p>
<h1>车祸处理</h1>
<p>今年上半年我很不幸的发生了一起小车祸。
车祸并不严重,但是还是把警车、消防车、救护车全给招来了。
整理流程其实处理的还是很快的,填好了一张表格之后就解决了。
后面就是全部交给保险公司处理了。
出车祸那天,我只比平时晚一个小时到实验室。
后续的事故处理也非常简单,只是需要打过几个电话,和保险公司进行沟通,确定事故责任。
几乎没有花费我多少的时间。
虽然发生车祸是一件很不幸的事情,但是后续的处理流程的体验还是很好的。
我不太清楚国内车祸处理的流程,这里也不太好对比。</p>
<h1>退货政策</h1>
<p>另外一个让我留下深刻印象的事情是,美国的退货政策。
你买的任何东西,只要不是吃的,几乎都可以在期限内进行免费退货。
去年11月黑五的时候,我在网上买了好几件衣服,但是寄到之后发现尺寸和样式都不合适,于是拿到实体店去退货。
工作人员什么都没问,直接扫码接受了。
前后退货过程只有几分钟,非常简单快捷。</p>
<p>其实,类似的退货政策国内曾经也是有过的。
可惜,这种政策被很多群众给玩坏了,现在国内的很多公司都没有这种政策了。</p>
<h1>更新日志</h1>
<ul>
<li>2018年9月1日写作并发表</li>
</ul>我们真的需要文法吗?2018-08-25T11:03:17-06:002018-08-25T11:03:17-06:00Flyawaytag:zhouyichu.com,2018-08-25:/words/Grammar-Necessary/<p>词性标记(POS Tagging)、句法树分析(Dependency Parsing, Discourse Parsing)、语义角色标注(Semantic Role Labeling)都是自然语言处理(NLP)中的经典任务,些任务有些已经几乎可以说是成熟的技术了,比如词性标记,而有些依然是非常困难的任务,比如Discourse Parsing。
这些任务都有一个共同的特点,那就是他们的这些需要预测的目标其实都是由语言学家们定义出来的。
每次阅读到这些任务的论文的时候,我脑海中一直有着这样一种疑问: 为了让机器理解自然语言,我们真的需要这些信息吗?</p>
<p>我的怀疑来源于两方面的思考</p>
<ol>
<li>
<p><strong>文法信息是语言本身的一部分</strong>. 在几万前,人类的始祖发明使用语言的时候,他们是没有这些所谓的句法、文法、词性标记这些概念的,但是这并不妨碍他们发展出语言。
当然,这个论断未必是对的。
在和同组的同事讨论的时候,也有人指出,语言中的这些规则可能是有当时的一些掌权者规定出来的,未必一定就是自然演化的结果。
我不否认这样的可能性,但我还是倾向于语言是自然演化的结果。
语言是自然演化的结果,这又说明了什么呢?
这说明,这些文法、句法的规则本质上是不存在的,它们只是对自然现象(语言)的一种非常粗糙抽象总结 …</p></li></ol><p>词性标记(POS Tagging)、句法树分析(Dependency Parsing, Discourse Parsing)、语义角色标注(Semantic Role Labeling)都是自然语言处理(NLP)中的经典任务,些任务有些已经几乎可以说是成熟的技术了,比如词性标记,而有些依然是非常困难的任务,比如Discourse Parsing。
这些任务都有一个共同的特点,那就是他们的这些需要预测的目标其实都是由语言学家们定义出来的。
每次阅读到这些任务的论文的时候,我脑海中一直有着这样一种疑问: 为了让机器理解自然语言,我们真的需要这些信息吗?</p>
<p>我的怀疑来源于两方面的思考</p>
<ol>
<li>
<p><strong>文法信息是语言本身的一部分</strong>. 在几万前,人类的始祖发明使用语言的时候,他们是没有这些所谓的句法、文法、词性标记这些概念的,但是这并不妨碍他们发展出语言。
当然,这个论断未必是对的。
在和同组的同事讨论的时候,也有人指出,语言中的这些规则可能是有当时的一些掌权者规定出来的,未必一定就是自然演化的结果。
我不否认这样的可能性,但我还是倾向于语言是自然演化的结果。
语言是自然演化的结果,这又说明了什么呢?
这说明,这些文法、句法的规则本质上是不存在的,它们只是对自然现象(语言)的一种非常粗糙抽象总结(文法规则)。
或者,另外一种说法就是这些所谓的文法信息本身就是语言本身的一部分. 那么,我们真的有必要单独把这部分信息抽离出来吗?</p>
</li>
<li>
<p><strong>人类不需要文法一样能学习掌握语言</strong>. 一个小孩在成长过程中是从大人的言行中学习获得语言能力的。
想象一下,在古代遍地都是文盲的时候,大部分农民都是不识字的,他们不懂得文法、不懂得句法,却依然能够使用自然语言和他人进行交流。
这说明,这些句法、文法信息是包含在语言中的,人类不需要特意地去学习这些规则,一样能学会使用自然语言。
这再次印证了,人类学习语言是不需要这些信息的。</p>
</li>
</ol>
<p>现在,我们的任务是希望机器能获得同样的能力。
正常的想法是,让机器在最大程度上模拟人类的学习过程,跳过这些条条框框的规则,直接从语言本身理解语义。
然而,这对机器来说,实在太困难了。
我认为主要的原因还是因为目前的机器学习模型还不够强大,无法从语言本身中学习得到这些规则。
因此,我们需要人为的总结出这些规律,然后灌输给机器,让机器能够更加容易地学习。
但是,这只是一种折中方案,是一种不得已的妥协。
我相信,未来一旦出现了更加的强大的学习模型,这些所谓的文法规则其实是不需要的。</p>
<p>总结来说,从短期发展来说,这些文法、句法信息是有助于机器理解语义的;但是从长期来看,尤其是当具有更强学习能力的模型、具有更强计算能力的机器被开发出来之后,这些辅助的信息未必就是必须的了。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月25日写作并发表</li>
</ul>利率2018-08-19T11:08:39-06:002018-08-19T11:08:39-06:00Flyawaytag:zhouyichu.com,2018-08-19:/words/Interest-Rate/<p>复利效应的另一个重点</p><p>在之前<a href="http://zhouyichu.com/words/Persistence/">所谓坚持</a>的中,我强调了所谓的坚持,其核心在于必须保证每一次的练习都要比上一次更进一步,即使是非常小的一步。
因为,只有这样,才能发挥「复利效应」,逐渐将你带向你的目标。
今天,我想要说的是在这个「复利效应」中另外一个重要的因素,那就是「利率」.</p>
<p><img alt="Table" src="http://zhouyichu.com/images/table.png"/></p>
<p>仔细观察上图,图中的第一行表示的是不同的利率,第一列表示坚持的年限,初始资源都是一个单位。
我们可以看到,在同样的初始资源情况下,不同利率导致的收益完全是不同的。</p>
<p>比如,当利率只有10%的时候,我们需要19年才能收获6.12个单位的资源;而当利率是35%的时候,我们只需要6年就能收获6.05个单位的资源。
其中的时间差距非常之大。</p>
<p>这也说明了,同样是利用复利效应,所谓的「长期」对不同的人是完全不同的概念。</p>
<p>上面这个表格告诉我们,最重要的确实是要保持「进度」,但是我们如果能将每次的「进度」逐步扩大,那么我们就能在更短的「长期」内收获更多的东西。</p>
<p>那么如何才能使得我们的「利率」不断扩大呢?</p>
<p>那就是我们的学习和思考能力。</p>
<p>要坚持做一件事对我来说,已经不是什么难的事情。
但是这还不够,我需要学习以更有效率的方式去完成。
比如,科研这件事。
过去两周我经历了极大的方法论改变,彻底改变了我科研的方式。
我不再纠结具体的代码实现、数据整理等,而是更加关注阅读和思考。
在反复思考推敲之后,再决定执行哪些实验。
这样看似慢了,但其实极大的提高了科研效率。
每一次的实验都能让我更加靠近我想要的成果。
而不是像以前那样,像没头苍蝇一样,胡乱的跑实验,但却不知道这个实验结果能为我带来些什么新的认识。</p>
<p>这些不同的做事方式,就代表着图中不同的利率水平。
利率越高,在同样的时间内,你的收获就越多.</p>
<p>然而,虽然道理我们都明白。
但是,实际操作确实很困难的。
因为,现实生活并不像数学那么简洁直观。
我们无法用数字来衡量生活中的一切事物。
只能通过自己的不断摸索和思考来提高自己的「利率」,从而让自己更快的积累和成长。</p>
<h1>参考资料</h1>
<ul>
<li>「财富自由之路」第三十讲</li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年8月19日</li>
</ul>Think Big2018-08-11T00:00:00-06:002018-08-11T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-08-11:/words/Think-Big/<p>自从上周和老板谈过之后,我开始改变自己的做研究的风格。
过去的我,总是聚焦去理解论文中的细节;自己工作的时候也是类似的情况,不停思考的是,代码结构怎么样才是最好的,怎么去实现才是最高效的。
然而,这一切都不是科研工作应该有的工作方式。
这是Programmer的思维方式,而不是researcher的。</p>
<p>作为一个科研工作者,我们需要考虑的是当前这份研究工作能否增加人类的整体的智慧。
比如,过去我一直纠结一个损失函数,它的预期效果一直和实验结果不符合。
我纠结了这个问题很长一段时间。
然而,老板却告诉我,他根本不关心这个损失函数,因为我们的提出的想法和这个损失函数没有关系。
这个损失函数只是一个具体的实例,只是一种具体的实践,它只是「a means to the end」, 它没有那么重要。</p>
<p>我更应该考虑的是,这部分工作能够为人类社会提供什么新的知识。</p>
<p>这一周我一直遵循老板的建议,远离所有代码,远离所有具体的模型。
单纯只是思考和阅读论文,构建自己的big picture.
当我从「对人类社会」的贡献这个角度来审视科研工作的时候,我感觉一切都改变了。
原本惊为天人的工作变得很平凡,而原本觉得很无聊的分析却变得鞭辟入里。</p>
<p>比如,当年在国内读研的时候,当阅读到Mikolov的著名论文「Efficient estimation …</p><p>自从上周和老板谈过之后,我开始改变自己的做研究的风格。
过去的我,总是聚焦去理解论文中的细节;自己工作的时候也是类似的情况,不停思考的是,代码结构怎么样才是最好的,怎么去实现才是最高效的。
然而,这一切都不是科研工作应该有的工作方式。
这是Programmer的思维方式,而不是researcher的。</p>
<p>作为一个科研工作者,我们需要考虑的是当前这份研究工作能否增加人类的整体的智慧。
比如,过去我一直纠结一个损失函数,它的预期效果一直和实验结果不符合。
我纠结了这个问题很长一段时间。
然而,老板却告诉我,他根本不关心这个损失函数,因为我们的提出的想法和这个损失函数没有关系。
这个损失函数只是一个具体的实例,只是一种具体的实践,它只是「a means to the end」, 它没有那么重要。</p>
<p>我更应该考虑的是,这部分工作能够为人类社会提供什么新的知识。</p>
<p>这一周我一直遵循老板的建议,远离所有代码,远离所有具体的模型。
单纯只是思考和阅读论文,构建自己的big picture.
当我从「对人类社会」的贡献这个角度来审视科研工作的时候,我感觉一切都改变了。
原本惊为天人的工作变得很平凡,而原本觉得很无聊的分析却变得鞭辟入里。</p>
<p>比如,当年在国内读研的时候,当阅读到Mikolov的著名论文「Efficient estimation of word representations in vector space」,简直惊为天人。
他的工作成果给整个NLP领域开启了一个新的热点方向。
然而,现在随着阅读论文的增多和思考的深入,现在觉得他的这部分工作也不是那么的具有深刻思想性<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。
其实,word embedding这个概念早在30年前(1987年)就由Hinton在「Parallel Distributed Processing」的第三章中提出了。
之后相关的研究工作一直都在进行,只是由于计算能力的问题,而无法流行起来。
而Mikolov真正的贡献不是在于提出了word embedding,而是他开发了一种极为高效的算法,能将word embedding从大语料中训练出来,这才是他工作的最大贡献。
但是,他的工作和Hinton比起来,那就差了一个档次了。</p>
<p>作为一个研究者,我们更需要像Hinton那样从一个更高的层次思考问题.
尽管不是每个人都能成为Hinton那样的大神,但是我们需要从更高层次上来指导我们自己的研究工作。
把自己的目光提高,不停地问自己,自己的研究工作的真正贡献在哪里。
真正的贡献不是设计一个新损失函数、一个新的正规化方式,而是一种更高层次的思想。
要成为一个科学家,首先要成为一个哲学家。
怪不得大部分学科的博士学位都是带有「哲学博士」头衔的。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月11日写作并发表</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>我不是说他的工作不重要,但是我觉得缺乏了一种内在哲学性思维。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>读书笔记:活着2018-08-11T00:00:00-06:002018-08-11T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-08-11:/reading-list/To-Live/<p>「活着」读书笔记</p><p>作者: 余华</p>
<h1>主要内容</h1>
<p>地主富二代福贵年轻时挥霍家财,黄赌毒无一不沾。
在倾家荡产之后,幡然醒悟。
和家人一起过起了清贫的生活。
但是,命运没有放过他。
他经历了儿子被抽血而死、女儿难产而死、妻子积劳而死、女婿事故而死、外孙因饥饿而死等各种人间悲剧。
到老一个人形单影只地活着。</p>
<h1>感想</h1>
<p>最早接触到「活着」是小时候看的陈创主演的电视剧「福贵」。
当时断断续续地看,并不能完全看懂,但是,我知道这是一个悲伤的故事。
直到最近,我才真正阅读了余华的原著「活着」。
也许是因为先看了电视剧的原因,总觉得原著小说的各个人物不够丰满,故事也比我原想得要小得多。</p>
<p>尽管是一个不长的故事,但是却能感到活着是多么的不容易。
他的家人都是淳朴善良的,家珍对这个不争气的丈夫不离不弃,即使在他万贯家财一朝空的时候,也选择留下来;他的女儿凤霞从小就担负了家里的各种体力劳动,家珍得病之后,更是要照顾家里家外;他的儿子有庆天天割草喂牛,为了不磨破鞋子,大冬天拎着鞋子在雪地中跑来跑去;他的女婿工作任劳任怨,不嫌弃凤霞的聋哑。
命运却不愿意放过福贵。
他的家人至亲一个接一个离他而去,而他眼睛也逐渐变得浑浊,但却仍然保有光彩。
他这是看透了命运,看透了人生。
生而为人是没有意义的,活着就是最大的意义。</p>
<p>作者的文笔很犀利。
短小而精炼的笔触更加能体现出一种悲剧色彩,留下了极大的想象空间。
几乎白描的手法,整个故事就像是一个枯萎萧瑟的枯树,树叶凋零,却仍然顽强地活着。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月11日写作并发表</li>
</ul>读书笔记:法国中尉的女人2018-08-04T11:47:46-06:002018-08-04T11:47:46-06:00Flyawaytag:zhouyichu.com,2018-08-04:/reading-list/The-French-Lieutenant-Woman/<p>「法国中尉的女人」读书笔记</p><p>作者: 约翰·福尔斯</p>
<h1>主要内容</h1>
<p>本篇小说以怪异的手法写作了19世纪一个名为查尔斯的男人的和当时社会习俗的挣扎。
一个三十多岁的贵族,是一个19世界维多利亚时代人们眼中的绅士,彬彬有礼,一举一动都符合当时的绅士要求。
然而,他又接受了在当时比较前沿的达尔文主义。
这一切都是稳定的,因为他的前卫思想并没有和落后的社会桎梏产生冲突。
直到他遇到了那个被称为「法国中尉的女人」的人,她的出现直接引发了查尔斯内心关于新与旧的挣扎矛盾。
她是一个比他更加前卫的女性,追求自己,最求自由。</p>
<p>小说最有趣的地方在于,作者安排了三个完全不同的结局。
第一个结局是完全符合19世纪的社会对于人们的要求的,查尔斯彻底放弃了对她的执念,回归到一个好丈夫、好绅士的形象。
第二个结局是一个大团圆的结局,查尔斯解除婚约,并且在两年后找到了萨拉及其女儿。我想这是最符合20世纪人们对于爱情故事结局的期盼。
而第三个结局就显得更加残酷。两年后的查尔斯确实找到了萨拉,但是却又被无情的拒绝了。尽管萨拉是爱着他的,但是她为了保持自由独立而选择放弃心中所爱。你可以说她残忍,可以说她冷血,但她确实是追寻着自己内省最渴望的事情。这是属于21世纪的结局。</p>
<h1>感想</h1>
<p>作者的大部分人生是属于20世纪的,但是他的作品却能深刻揭露了19世纪、20世纪、21世纪三个时代社会的脉搏。
实在让人不得不佩服。</p>
<p>小说中打破次元壁的写法,同样令人耳目一新。
完全没有出戏的感觉,反而有一种更加真实的感觉。
仿佛时间就此停滞,读者的目光随着作者的笔触发生了变动,从不同的角度对小说人物进行了刻画。
就像是在看电影,有时候是长镜头,有时候是短镜头,有时候又是定格。
可以说,作者提供了一种360度立体感来塑造人物形象。</p>
<p>我个人是更喜欢第三种解决的(也许是因为我生活在21世纪吧),因为这样的结局更能让人产生深刻的思考。
当内心真正的渴望和所爱的人发生冲突的时候,该如何选择。
这似乎是一个没有答案的问题。
而作者在最后安排这样的第三种结局,证明了作者内心真正认可的也许就是这样一个结局。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月4日写作并发表</li>
</ul>科研狗的自省2018-08-04T00:00:00-06:002018-08-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-08-04:/words/Research-Thinking/<p>过去几周一直处于很焦虑的状态。
主要原因是科研上没有产出,同届的小伙伴们都已经发表了他们的第一篇论文了。
而我却依然两手空空。</p>
<p>我常常在脑海中想象我所知道的科研人员,他们是在第几年的时候发表他们的第一篇论文的。
不断说服自己,不断给自己找理由,不断告诉自己还有足够的时间。
但是,这种焦虑的感觉依然挥之不去。</p>
<p>在和老板交流的时候,他告诫我需要''Thinking big'',日常的工作不要陷入简单重复的''fake work''.
要做到真正的谋定而后动。
任何一项科研工作,都需要思考它的价值在哪里,它是如何帮助人类更好地理解这个世界的。
这其中的贡献才是最重要的。
而具体的,你用了什么损失函数、用了什么特殊的技巧、得到了更好的抽象表示则是相对比较细节的问题了。
任何一篇发表的工作,都需要有其背后的哲学思想。
而这哲学思想,才是对人类社会最大贡献。</p>
<p>而更加细节问题是实现和代码。
这是最容易陷入''fake work''的地方,看似你每天都在工作,都在写代码,都在跑实验。
然而,很大一部分工作可能只是浪费时间而已。
只有谋定而后动的行动,才可能是切实有用的。
任何一段代码、一个实验都要有的它的意义。
在设计一组实验的时候,需要明确的知道,如果这组实验符合预期,它将会证明什么;如果结果不符合预期,它又能让我们学会什么。</p>
<p>老板的告诫给我敲响了警钟。
我觉得我在很大程度上就是陷入了他所说的''fake work'' …</p><p>过去几周一直处于很焦虑的状态。
主要原因是科研上没有产出,同届的小伙伴们都已经发表了他们的第一篇论文了。
而我却依然两手空空。</p>
<p>我常常在脑海中想象我所知道的科研人员,他们是在第几年的时候发表他们的第一篇论文的。
不断说服自己,不断给自己找理由,不断告诉自己还有足够的时间。
但是,这种焦虑的感觉依然挥之不去。</p>
<p>在和老板交流的时候,他告诫我需要''Thinking big'',日常的工作不要陷入简单重复的''fake work''.
要做到真正的谋定而后动。
任何一项科研工作,都需要思考它的价值在哪里,它是如何帮助人类更好地理解这个世界的。
这其中的贡献才是最重要的。
而具体的,你用了什么损失函数、用了什么特殊的技巧、得到了更好的抽象表示则是相对比较细节的问题了。
任何一篇发表的工作,都需要有其背后的哲学思想。
而这哲学思想,才是对人类社会最大贡献。</p>
<p>而更加细节问题是实现和代码。
这是最容易陷入''fake work''的地方,看似你每天都在工作,都在写代码,都在跑实验。
然而,很大一部分工作可能只是浪费时间而已。
只有谋定而后动的行动,才可能是切实有用的。
任何一段代码、一个实验都要有的它的意义。
在设计一组实验的时候,需要明确的知道,如果这组实验符合预期,它将会证明什么;如果结果不符合预期,它又能让我们学会什么。</p>
<p>老板的告诫给我敲响了警钟。
我觉得我在很大程度上就是陷入了他所说的''fake work''。
看似忙碌,却没有进度。
而且,再加上CS科研本身的特点,我们总是需要赶deadline,从一个deadline到另外一个deadline。
这样的环境迫使从业人员更加倾向于短期的目标而忽视了长期的目标。
而想要成为一个优秀的科研从业者,我必须学会在纷杂的环境中学会看清自己的方向。</p>
<p>基于此种认识,我决定要改变自己的工作方式。
将更多的时间分配到思考和阅读上面,而具体的代码、实验则只有在必须的时候才切实进行。
尽最大程度上减少自己制造''fake work''的机会。</p>
<p>同时,我也需要调整自己的心态,不要被外部的信息所干扰。
记得两年前在<a href="http://zhouyichu.com/words/Learning-from-Swimming/">从游泳中学会的事</a>的博文中,我已经感悟到了要掌握自己节奏的重要性。
没想到,两年后的自己又犯了同样的错误。
其实,这两年来,我一直是按照自己的节奏来生活工作的。
但是,一旦发现周围的人的领先了一步,我又不由自主的开始焦虑起来。</p>
<p>不要焦虑、不要焦虑、不要焦虑,重要的事说三遍。
焦虑除了让自己分心以外,没有任何作用!</p>
<p>过去的一周,我最大的收获就是对以下十六个字又有了更加深刻的理解。
<strong>不要焦虑,做好自己;谋定后动,一击必中</strong></p>
<h1>更新日志</h1>
<ul>
<li>2018年8月4日写作并发表</li>
</ul>科研狗的自省22018-08-04T00:00:00-06:002018-08-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-08-04:/words/Research-Thinking-2/<p>在上篇博文中,我表达了我焦虑的情绪,以及我打算采取的应对策略。
但是我还想要深入分析一下,为什么我会产生这样的焦虑感。</p>
<p>表面上来看,是因为我身边的人都有了成果,而我没有,因此我感到「被同龄人抛弃了」。
这是一种普遍存在的焦虑感.
我从两个方面对这种焦虑感进行了分析,一个是外在的原因,一个是内在的原因。</p>
<p>先说外部的原因,外因可以归结为我错误将幸福感来源定位于基于比较的方式。
以我自己为baseline,对比对象是所有你身边的同龄人。
我不知道为什么人会在下意识做出这样的思维模式,但是这样的思维模式具有非常大负面影响。</p>
<p>首先,这是一种基于比较的思维模式。
当你比你的对比对象落后时,你就觉得焦虑,失落;而当你比你的对比对象领先的时候,你就感觉自我良好。
但是,想象如果这的比较发展到极致是什么情况?
最终的结果是,你终将会被别人比下去,毕竟这个世界上优秀的人太多了。
基于比较的自我感觉良好是不可靠的。</p>
<p>基于比较的思维模式的另外一个问题是,它只能比较显露出的东西,无法比较内在的思考深度和能力。
要知道,一个人表现出来的东西和他真正内在懂得的东西未必是一致的。
心理学上就有两种不同的心理模式: 表现形人格和进取型人格。
表现形人格更加关注自己在别人面前的表现,更加关注成功这一事件本身,在他们的眼中只有「成功」和「失败」两种状态。
进取型人格则更加关注自己的成长变化,不在乎自己在别人面前的表现,他们明白任何学习 …</p><p>在上篇博文中,我表达了我焦虑的情绪,以及我打算采取的应对策略。
但是我还想要深入分析一下,为什么我会产生这样的焦虑感。</p>
<p>表面上来看,是因为我身边的人都有了成果,而我没有,因此我感到「被同龄人抛弃了」。
这是一种普遍存在的焦虑感.
我从两个方面对这种焦虑感进行了分析,一个是外在的原因,一个是内在的原因。</p>
<p>先说外部的原因,外因可以归结为我错误将幸福感来源定位于基于比较的方式。
以我自己为baseline,对比对象是所有你身边的同龄人。
我不知道为什么人会在下意识做出这样的思维模式,但是这样的思维模式具有非常大负面影响。</p>
<p>首先,这是一种基于比较的思维模式。
当你比你的对比对象落后时,你就觉得焦虑,失落;而当你比你的对比对象领先的时候,你就感觉自我良好。
但是,想象如果这的比较发展到极致是什么情况?
最终的结果是,你终将会被别人比下去,毕竟这个世界上优秀的人太多了。
基于比较的自我感觉良好是不可靠的。</p>
<p>基于比较的思维模式的另外一个问题是,它只能比较显露出的东西,无法比较内在的思考深度和能力。
要知道,一个人表现出来的东西和他真正内在懂得的东西未必是一致的。
心理学上就有两种不同的心理模式: 表现形人格和进取型人格。
表现形人格更加关注自己在别人面前的表现,更加关注成功这一事件本身,在他们的眼中只有「成功」和「失败」两种状态。
进取型人格则更加关注自己的成长变化,不在乎自己在别人面前的表现,他们明白任何学习、改变、进步都是需要一个过程的。
而基于比较的思维模式,更加容易变成表现型人格,从而限制了自己的成长。</p>
<p>另外一个导致我焦虑的内因应该是我太缺乏耐心了。
这是现代人的通病。
因为缺乏耐心,所以很难沉下心来完成一件事。
人的天性是缺乏耐心的,我们更加关注当下的瞬时的价值。
这在很多书籍中都有过论述。
而我也犯了同样的错误。
正是因为缺乏耐心,想要迫不及待的发表成果。
殊不知,每个人都是有自己的节奏的,别人的节奏不一定适合你。
奥巴马47岁当选总统,特朗普70岁当选总统,王德顺60岁开始健身,80岁上T台。</p>
<p>这些例子足以证明,别人身上的轨迹套在你身上不一定适用。
要从内在培养自己的信心,培养自己的步伐。
不要因为自己暂时的阻滞而看轻自己,不要因为进展缓慢而沮丧,做好自己,保持节奏。</p>
<h1>更新日志</h1>
<ul>
<li>2018年8月4日写作并发表</li>
</ul>线性代数-特征值和特征向量2018-07-29T00:00:00-06:002018-07-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-29:/words/Linear-Algebra-Eigenvalue-Eigenvectors/<p>在之前的<a href="http://zhouyichu.com/words/Linear-Algebra-Linear-Map/">向量代数-线性映射</a>和<a href="http://zhouyichu.com/words/Linear-Algebra-Vector-Space/">线性代数-向量空间</a>笔记中,我尝试了以简单语言和逻辑描述了向量空间的定义和线性映射的定义。
在这篇笔记中,我将会尝试以最简单的又不脱离基本的数学定义来说明矩阵的特征值和特征向量。</p>
<h1>特征值和特征向量</h1>
<p>在之前的笔记中,我提到过子空间的概念,我们来回顾一下这个概念:</p>
<blockquote>
<p>一个向量空间<span class="math">\(V\)</span>的子空间<span class="math">\(U\)</span>定义为: <span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个子集,且<span class="math">\(U\)</span>也是一个向量空间。</p>
</blockquote>
<p>这个定义很简单,它给出了子空间概念的两个关键:
- 是某个向量空间的子集
- 本身也是向量空间</p>
<p>同时,在另外一篇笔记中,我们也说明了<strong>线性映射</strong>的概念:
线性映射就是一个将向量从一个空间映射到另外一个空间的函数,且这个函数满足两个特殊的条件.</p>
<p>现在,我们来考虑一种特殊的线性映射: <strong>将向量映射到自身空间的线性映射。</strong>
我们用<span class="math">\(\mathcal{L}(V)\)</span>表示<span class="math">\(\mathcal{L}(V,V)\)</span>.
这种特殊的线性映射我们称为算子(Operator).
这种特殊的线性变换非常重要 …</p><p>在之前的<a href="http://zhouyichu.com/words/Linear-Algebra-Linear-Map/">向量代数-线性映射</a>和<a href="http://zhouyichu.com/words/Linear-Algebra-Vector-Space/">线性代数-向量空间</a>笔记中,我尝试了以简单语言和逻辑描述了向量空间的定义和线性映射的定义。
在这篇笔记中,我将会尝试以最简单的又不脱离基本的数学定义来说明矩阵的特征值和特征向量。</p>
<h1>特征值和特征向量</h1>
<p>在之前的笔记中,我提到过子空间的概念,我们来回顾一下这个概念:</p>
<blockquote>
<p>一个向量空间<span class="math">\(V\)</span>的子空间<span class="math">\(U\)</span>定义为: <span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个子集,且<span class="math">\(U\)</span>也是一个向量空间。</p>
</blockquote>
<p>这个定义很简单,它给出了子空间概念的两个关键:
- 是某个向量空间的子集
- 本身也是向量空间</p>
<p>同时,在另外一篇笔记中,我们也说明了<strong>线性映射</strong>的概念:
线性映射就是一个将向量从一个空间映射到另外一个空间的函数,且这个函数满足两个特殊的条件.</p>
<p>现在,我们来考虑一种特殊的线性映射: <strong>将向量映射到自身空间的线性映射。</strong>
我们用<span class="math">\(\mathcal{L}(V)\)</span>表示<span class="math">\(\mathcal{L}(V,V)\)</span>.
这种特殊的线性映射我们称为算子(Operator).
这种特殊的线性变换非常重要,因为它将我们面对的问题限定在同一个向量空间中。
可以知道,一个算子对应的矩阵表示一定是<span class="math">\(n\times n\)</span>的一个方阵(<span class="math">\(n\)</span>向量空间的维度)</p>
<p>OK,我们现在知道了子空间和算子是什么了。</p>
<p>如果把这两个概念结合起来,我们就能给出不变子空间的定义:</p>
<blockquote>
<p>如果<span class="math">\(T\in \mathcal{L}(V)\)</span>且<span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个子空间,<span class="math">\(U\)</span>中的任意一个元素经过<span class="math">\(T\)</span>映射之后,依然是<span class="math">\(U\)</span>的元素,那么<span class="math">\(U\)</span>就被称为<strong>不变子空间</strong>.</p>
</blockquote>
<p>也就说,<span class="math">\(U\)</span>中的元素经过<span class="math">\(T\)</span>的映射之后,依然是<span class="math">\(U\)</span>的元素。而<span class="math">\(T\)</span>是定义在<span class="math">\(V\)</span>上的线性映射。
我们此时关心的其实不是所有的不变子空间,我们在意的其实只是维度为<span class="math">\(1\)</span>的不变子空间。</p>
<p>我们可以将维度为<span class="math">\(1\)</span>的子空间表示为:</p>
<div class="math">$$
U=\{\lambda v:\lambda\in F\}=span(v)
$$</div>
<p>注意,这只是一个维度为<span class="math">\(1\)</span>的子空间,它还不是不变子空间。
那么,如果我们想要它变为一个不变子空间呢?那么根据不变子空间的定义,那么一定存在一个<span class="math">\(\lambda\)</span>使得:
</p>
<div class="math">$$
Tv=\lambda v
$$</div>
<p>而此时上述等式中的<span class="math">\(v\)</span>和<span class="math">\(\lambda\)</span>就被称为特征向量和特征值。</p>
<p>Ok.我现在来梳理一下概念的流程:</p>
<p>根据向量空间和线性映射的定义,我们特别指出了一种特别的线性映射: 算子。算子是将向量映射到自身空间的线性映射。
然后,通过子空间的定义,我们又给出了不变子空间的定义。
而,特征向量其实描述的就是某个线性空间中的维度为<span class="math">\(1\)</span>的不变子空间。</p>
<p>这个可能有点绕,更加直观的解释是,一个向量经过<span class="math">\(T\)</span>的映射之后,方向不变。
只是改变了长度,这样的向量就被称为特征向量。</p>
<p>根据这些定义,我们可以知道:
1. 每一个特征向量其实描述的就是当前线性空间中的维度为<span class="math">\(1\)</span>的不变子空间。
2. 特征向量只会发生在方阵身上,因为特征向量是定义在算子上的,而算子的矩阵表示一定是一个方阵。</p>
<h1>特征值和特征向量的物理意义</h1>
<p>那么,我们又有疑问了,数学家们为什么要定义出特征向量和特征值呢?他们为什么如此重要,以至于我们需要给他们一个特殊的名字呢?</p>
<p>在回答这个问题之前,我们先来看一下,特征向量有哪些性质。
最重要的一条性质,就是<strong>特征向量之间都是线性无关的。</strong>
这是非常重要的一条性质,还记得我们曾在该系列的第一篇<a href="http://zhouyichu.com/words/Linear-Algebra-Vector-Space/">文章</a>中指出,一组向量如果线性无关,那么该向量空间中的任意一个元素都能被这组线性无关的向量表示。</p>
<p>这个性质就非常棒了。
也就是说,<span class="math">\(V\)</span>中的任意一个元素都能被这组特征向量表示。</p>
<p>仔细想想,定义在<span class="math">\(V\)</span>上面的线性算子<span class="math">\(T\)</span>本质描述的其实就是一种映射,一种运动。而这种运动一定是由方向和大小组成的。
回忆一下,我们高中做过的物理题目。
当我们为一个物体做受力分析的时候,我们需要考量的是什么?我们需要考虑就是力的方向和大小。
还记得我们是怎么分析的吗?对于一个力,通常的做法是将其进行分解,分解成多个方向上的分力,然后对分力进行单独分析。</p>
<p><img alt="Force" src="http://zhouyichu.com/images/Force.jpg"/></p>
<p>而此处的特征向量其实做的是类似的工作,特征向量就像受力分析中的分力。
线性映射<span class="math">\(T\)</span>描述的运动的方向,可以分解为多个特征向量。
<span class="math">\(T\)</span>所描述的运动在这些方向上的前进大小是最大的,因此这些特征向量才如此重要。</p>
<p>这样,我们就可以做出如下的类比关系:
1. <span class="math">\(T\)</span>就是物理习题中需要的分析的一个受力方向
2. 但是这个受力方向太过复杂,一时之间我们无法理解。那么我们将其分解为重力方向、摩擦力方向等等各种不同的方向。而矩阵的特征向量就像是这些各个方向上的分力方向.</p>
<p>之所以能把特征向量看成是“分方向”,是因为这些特征向量是相互线性无关的,因为就能够描述任意一个空间中的向量。
而所谓的特征值,就是对应的特征向量方向上的前进距离,可以类比为各个分力方向上的分力大小。
由此,更进一步,我们就可以知道,这个分力越大,就说明这个方向上的权重就越大,包含的信息就越多。
因此,特征值分解常常作为信息压缩的方法。</p>
<p>当然,最后需要指出的是。
在这个类比中,分力的方向其实不止一种。
也就说,特征值分解只是矩阵分解中的一种。
还存在其他的分解方式,能达到同样的效压缩信息的作用。
比如SVD分解 。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://www.amazon.com/Linear-Algebra-Right-Undergraduate-Mathematics/dp/3319110799/ref=sr_1_1?ie=UTF8&qid=1530890765&sr=8-1&keywords=Linear+algebra+done+right">Linear Algebra Done Right</a></li>
<li><a href="https://www.zhihu.com/question/21874816">如何理解矩阵特征值</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年7月29日写作并发表</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>读书笔记:酸痛拉筋解剖书2018-07-29T00:00:00-06:002018-07-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-29:/reading-list/Stretching/<p>「酸痛拉筋解剖书」读书笔记</p><p>作者: 布拉德·沃克</p>
<h1>综述</h1>
<p>这是一本非常严谨的讲述拉筋伸展的书。
综合讲述了到目前为止,人类对拉筋伸展的研究成果。
它主要回到了这样的问题: 「拉近伸展的意义」</p>
<h1>结构和细部</h1>
<p>本书的第一章首先描述了人体的肌肉组成,骨骼的构成原理,肌肉的发力原理,让人对人体的物理构造有了较深的理解。
从这部分内容中,我学习到了:
1. 肌肉组织有三种不同的分类
- 慢缩红肌: 这种肌肉具有较强的耐力
- 快缩中间肌:
- 快缩白肌: 较强的爆发力,但是缺乏耐力
2.大部分的肌肉都是成组的:
- 主动肌: 一个动作中承担主要发力的肌肉
- 对抗肌: 动作中伸长的肌肉,使得主动肌可操作
- 协同肌: 协助主动肌,协调方向
3. 一共存在三种肌肉运动
- 向心性收缩
- 离心性收缩
- 静力性收缩</p>
<p>接着第二章中,作者又说名了拉筋伸展的作用。
拉筋伸展运动主要可以分为两类:</p>
<ul>
<li>静态拉伸</li>
<li>动态拉伸</li>
</ul>
<p>书中对各个分类进行了全面的论述。</p>
<p>之后,全书的剩余部分列出了对全身的各个肌肉的拉伸动作。
这本书的后半部分可以作为拉筋伸展的工具书,想要拉伸某个肌肉的时候,可以从这本书中查询相应的拉伸动作。</p>
<h1>评价</h1>
<ul>
<li>内容: 3</li>
<li>结构: 4</li>
<li>写作: 4</li>
</ul>
<h1>和我的关系</h1>
<p>虽然我开始规律健身已经很长一段时间了,但是对于拉伸放松这个领域还是非常陌生的。
平时的训练中也没有加入拉伸这一个项目,希望能通过这本书,慢慢掌握拉伸的要点。</p>
<h1>脑图</h1>
<p><img alt="拉伸" src="http://zhouyichu.com/images/stretching.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年7月29日写作并发表</li>
</ul>演化与进化2018-07-28T00:00:00-06:002018-07-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-28:/words/Adjustment-and-Evolution/<p>前几天在网上看到了另外一个关于「<a href="https://zh.wikipedia.org/wiki/%E8%B4%B9%E7%B1%B3%E6%82%96%E8%AE%BA">费米悖论</a>」的可能解释。
该解释的大意是,可能是人们错误估计了宇宙中产生生命的可能性,即使产生了生命,也错误地估计演化出智慧生物的可能性。
实际上人类在宇宙中可能是唯一的智慧生命。</p>
<p>这个解释和其他所有的「费米悖论」解释都一样,都只是一个猜想,没有确实的证据证明。
但是,这个解释吸引我的原因在于,它给出的论证过程中有一点非常有趣: <strong>生命的演变过程只是在演化而不是在进化。</strong></p>
<p>现代社会已经普遍接受达尔文的进化论思想了<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,然而,知道最近我才意识自己对达尔文的观点有一个很大的误解。
我错误地认为达尔文是在说,生物都是在不断进化的,向着更高级的方向进化;但是,实际上达尔文只说,生物是在不断演化的,并没有说是在进化。
演化和进化的区别在于,<strong>演化可能只是在不断适应周围的环境,没有一个方向性的演变;而进化则带有方向性的思想,由一个低级的状态走向一个更高级的状态。</strong>
「自私的基因」中说,生命的本质只是为了传承基因,形成复杂生命体更加有利于传承基因,仅此而已。
这个世界上并没有一个神之手在推动生命向着更高级、更智能的方向发展。
各个生物只是极尽所能的适应环境生存下来。
从这个角度上说,也许产生智慧才是无数种演化过程中意外产生的结果。</p>
<p>由此,将同样的理论应用到人类社会同样适用。
大部分人(包括我自己)其实只是在不断演化以适应周围的环境,而这样的演化只是为了维持生存这一个最基本的需求。
然而 …</p><p>前几天在网上看到了另外一个关于「<a href="https://zh.wikipedia.org/wiki/%E8%B4%B9%E7%B1%B3%E6%82%96%E8%AE%BA">费米悖论</a>」的可能解释。
该解释的大意是,可能是人们错误估计了宇宙中产生生命的可能性,即使产生了生命,也错误地估计演化出智慧生物的可能性。
实际上人类在宇宙中可能是唯一的智慧生命。</p>
<p>这个解释和其他所有的「费米悖论」解释都一样,都只是一个猜想,没有确实的证据证明。
但是,这个解释吸引我的原因在于,它给出的论证过程中有一点非常有趣: <strong>生命的演变过程只是在演化而不是在进化。</strong></p>
<p>现代社会已经普遍接受达尔文的进化论思想了<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,然而,知道最近我才意识自己对达尔文的观点有一个很大的误解。
我错误地认为达尔文是在说,生物都是在不断进化的,向着更高级的方向进化;但是,实际上达尔文只说,生物是在不断演化的,并没有说是在进化。
演化和进化的区别在于,<strong>演化可能只是在不断适应周围的环境,没有一个方向性的演变;而进化则带有方向性的思想,由一个低级的状态走向一个更高级的状态。</strong>
「自私的基因」中说,生命的本质只是为了传承基因,形成复杂生命体更加有利于传承基因,仅此而已。
这个世界上并没有一个神之手在推动生命向着更高级、更智能的方向发展。
各个生物只是极尽所能的适应环境生存下来。
从这个角度上说,也许产生智慧才是无数种演化过程中意外产生的结果。</p>
<p>由此,将同样的理论应用到人类社会同样适用。
大部分人(包括我自己)其实只是在不断演化以适应周围的环境,而这样的演化只是为了维持生存这一个最基本的需求。
然而,观察那些很牛的人,他们似乎突破了某种界限,在向着更好状态进化。
由此,我意识到,尽管大自然中并没有「进化」这一说法;但是人类社会确实存在的。
一个每天不断奔波仅仅是为了糊口的人,其实他只是在原地打转的演化,不断适应新的环境来保证自己的存在。
而优秀的人会制定计划、执行计划、不断深化提高自己,这相当于自己给自己制定了一个进化的方向。
虽然一开始这两种人可能差不多,但是一旦把时间拉长,进化的威力就能发挥出来。
不断进取的人就能从不断演化的循环中脱颖而出,进化到一个更高的层次。</p>
<p>当然,进化之路的方向并不是唯一的。
这个世界上有这种无数条进化的方向。
但是,最重要的是要明白,自己的状态到底是在演化还是在进化。
进化的过程其实是非常痛苦的.
生物群体的演化过程总是会有大量的个体死亡而让更加适应环境的个体存活下来.
在个人的进化之路上,我们同样需要经历痛苦。
不断修正自己的行为模式,不断改变自己的思维方式。不断吸收新的思想。
就像尼采所说的:「凡不能毁灭我的,必使我强大。」</p>
<h1>参考资料</h1>
<ul>
<li>费米悖论</li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年7月28日写作并发表</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>虽然依然会有不同的观点,但达尔文主义还算是主流思想。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>为什么要财务自由2018-07-28T00:00:00-06:002018-07-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-28:/words/Why-Finance-Freedom/<p>电影「阿甘正传」中有这样一个场景,阿甘的母亲去世之后,他一直住在自己的家里,没有再回到他的捕虾公司。他的合伙人丹尼尔中尉用他的钱买了当时最红火的苹果公司的股票,并对阿甘说,他们再也不用为钱而担心了。
阿甘面对这个财务自由的喜讯,表现的很平静,只是说句:「又少了一件需要考虑的事情。」</p>
<p>当时看到这一段的时候,其实不太理解。
面对这样一个天大的喜讯,阿甘却显得无动于衷。
当时的我,只能将其归结为阿甘的迟钝。</p>
<p>然而,多年后,我才渐渐明白,财务自由是什么。</p>
<p><strong>财务自由永远不是真正的目标,但却是通向目标的必要条件。</strong>
只有财务自由了,你才有足够的精力追求你真正想要的东西。
就像阿甘所说,财务自由只是意味着「又少了一件需要考虑」的事情。</p>
<p>渔夫和富人的故事在网上流传甚广,它的两个不同结局也很有意思。
故事是这样的: 一天渔夫和一个富人同时在海边晒太阳,富人劝说渔夫每天多努力一点,多捕点鱼,慢慢变得富有。
然后就可以天天逍遥自在的躺在沙滩上晒太阳了。
但是,渔夫却说,我现在就逍遥自在的躺着晒太阳啊。
渔夫的回答是这个问题故事的第一个结尾。
很明显,它是想告诉人们,不需要太过追求财富,而是要学会享受当下,就能和富人过一样的生活。</p>
<p>但是,这是真的吗 …</p><p>电影「阿甘正传」中有这样一个场景,阿甘的母亲去世之后,他一直住在自己的家里,没有再回到他的捕虾公司。他的合伙人丹尼尔中尉用他的钱买了当时最红火的苹果公司的股票,并对阿甘说,他们再也不用为钱而担心了。
阿甘面对这个财务自由的喜讯,表现的很平静,只是说句:「又少了一件需要考虑的事情。」</p>
<p>当时看到这一段的时候,其实不太理解。
面对这样一个天大的喜讯,阿甘却显得无动于衷。
当时的我,只能将其归结为阿甘的迟钝。</p>
<p>然而,多年后,我才渐渐明白,财务自由是什么。</p>
<p><strong>财务自由永远不是真正的目标,但却是通向目标的必要条件。</strong>
只有财务自由了,你才有足够的精力追求你真正想要的东西。
就像阿甘所说,财务自由只是意味着「又少了一件需要考虑」的事情。</p>
<p>渔夫和富人的故事在网上流传甚广,它的两个不同结局也很有意思。
故事是这样的: 一天渔夫和一个富人同时在海边晒太阳,富人劝说渔夫每天多努力一点,多捕点鱼,慢慢变得富有。
然后就可以天天逍遥自在的躺在沙滩上晒太阳了。
但是,渔夫却说,我现在就逍遥自在的躺着晒太阳啊。
渔夫的回答是这个问题故事的第一个结尾。
很明显,它是想告诉人们,不需要太过追求财富,而是要学会享受当下,就能和富人过一样的生活。</p>
<p>但是,这是真的吗?渔夫和富人真的是过一样的生活吗?
很明显,他们的生活是完全不一样的。</p>
<p>故事的另外一个结局是: 渔夫晒了两个小时的太阳之后,不得起身开始繁重的捕鱼工作。而富人可以悠闲自在的晒太阳晒到天黑。
渔夫为了养家糊口,必须每天下海捕鱼,不管是刮风还是下雨,他都必须下海,不然一家老小就要饿死。
而且,他的生活严重依赖外部环境,天气差了,他要担心捕鱼的产量会减少;捕鱼的人多了,他又担心市场的渔价会下降,影响自己的收入。
而对于富人来说,今天的太阳晒够了。第二天他可以坐着私人飞机去卢浮宫欣赏「蒙娜丽莎」。
渔夫的生活只是在那两个小时内和富人一样,其他时间他都要为了生计而不断奔波,不断忧虑各种各样的事情。</p>
<p>我认为,这个寓言故事的第二个结尾才是揭露这个社会的本质。
故事中的渔夫就像是中产阶级,每天过着看似光鲜的生活,但是却只是在原地打转,为了维持光鲜的生活,不断牺牲自己宝贵的注意力和时间。
真正的自由是,是你可以有选择不的权利,可以选择自由支配自己时间的权利。
然而,渔夫却没有这样的权利,他不得不花费自己的时间养家糊口。</p>
<p>相反,真正做到财务自由的人,不需要考虑这些事情。
他可以把自己最珍贵的注意力和时间花费到任何一个他感兴趣的地方。
就像阿甘所说的,「又少了一件需要考虑的事情」。
由此节省下来的时间和精力,才是你真正自由的部分。</p>
<p>财务自由也许不是幸福生活的充分条件,但是肯定是必要条件。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月28日写作并发表</li>
</ul>读书笔记:一平米健身2018-07-28T00:00:00-06:002018-07-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-28:/reading-list/Workout-in-Home/<p>「一平米健身」读书笔记</p><p>作者: 斌卡</p>
<h1>综述</h1>
<p>正如本书的书名所传达的,这本书主要回到了这样的问题:「在现代快节奏的生活下,如何健身」。
注意,这本书与其他书不同的地方在于,它更加侧重于在家健身。
这就是所谓的「一平米」健身。
书中介绍的各种动作和训练计划都是针对在家中的训练,而不是健身房的训练。</p>
<h1>结构和细部</h1>
<p>和很多健身书籍一样,本书首先介绍了一些关于健身的基本理论。
主要包含了:
- 节食和减肥的关系: 节食绝不是一个合理的减脂方式。
- 自重训练和器械训练的对比:自重训练受限于重量、角度、阻力方向等条件,很难达到和器械健身类似的健身效果。
- 如何建立自己的训练计划
- 训练的顺序、动作配比</p>
<p>在这些理论分析之后,大部分章节都是针对某一个部位进行展开分析。
本书可以看成是在家中的训练手册。</p>
<h1>评价</h1>
<p>和斌卡的上一本书「硬派健身」很类似,本书的每一个论点都有相应的科学报告、论文支撑,比较令人信服。
是不可多的健身入门书籍。</p>
<ul>
<li>内容: 4</li>
<li>结构: 4</li>
<li>写作: 4</li>
</ul>
<h1>和我的关系</h1>
<p>这本书的中的重点是在家的健身方式,而我目前的条件,是允许我每天出现在健身房的。
因此,书中推荐各个训练动作也许并不适合我。
但是,书中讲述的各种原理、肌肉组成和发力原则等,还是很有帮助的。</p>
<h1>脑图</h1>
<p><img alt="一平米健身" src="http://zhouyichu.com/images/Workout-in-Home.png"/></p>
<h1>更新日志</h1>关于「成功」的思考2018-07-21T00:00:00-06:002018-07-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-21:/words/About-Success/<p>长久以来,成功学大行其道。
这些书籍无一不是从很多所谓的成功人士身上寻找异于常人的特点,然后声称这些只要做到这些特点,任何人都能一样的成功。
这个逻辑,看似无懈可击, 但其实还是有问题的。</p>
<p>问题在于「<a href="https://zh.wikipedia.org/wiki/%E5%80%96%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE">幸存者偏差</a>」。</p>
<p>所谓幸存者偏差是指,你的样本本身是带有偏见的,样本本身无法代表整体。
比如,在上面的例子中,那些成功学书籍的作者都是从所谓的成功人士身上寻找特质,殊不知,也许拥有同样特质的人大多是是失败的,你并没有看到他们。
这样,就能很容易把那些从「成功」人士身上总结出来的特质作为「成功」的必要条件了。
再比如,你在春运的火车进行调研,那么你调研的每一个对象都会告诉他买到了回家的车票,那么由此你就会得到今天的春运压力不大,每个人都能买到回家的车票。
但是,稍有常识的人都知道,这样的调研是没有意义的。
你的样本根本不具有代表性。
因此,只从「幸存者」身上寻找他们「幸存」的条件,其实是非常可笑的。</p>
<p>想象一下,假设这个世界上存在着一套隐藏的筛选机制,没有人能知道这套筛选机制是怎么样的。
我们只能看到被这个机制筛选出来的人和事。
如果我们只从被筛选出来的人和事上总结规律,对筛选机制建模,那得到的结论恐怕不太可能是正确的。
因为,我们只从正例中学习 …</p><p>长久以来,成功学大行其道。
这些书籍无一不是从很多所谓的成功人士身上寻找异于常人的特点,然后声称这些只要做到这些特点,任何人都能一样的成功。
这个逻辑,看似无懈可击, 但其实还是有问题的。</p>
<p>问题在于「<a href="https://zh.wikipedia.org/wiki/%E5%80%96%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE">幸存者偏差</a>」。</p>
<p>所谓幸存者偏差是指,你的样本本身是带有偏见的,样本本身无法代表整体。
比如,在上面的例子中,那些成功学书籍的作者都是从所谓的成功人士身上寻找特质,殊不知,也许拥有同样特质的人大多是是失败的,你并没有看到他们。
这样,就能很容易把那些从「成功」人士身上总结出来的特质作为「成功」的必要条件了。
再比如,你在春运的火车进行调研,那么你调研的每一个对象都会告诉他买到了回家的车票,那么由此你就会得到今天的春运压力不大,每个人都能买到回家的车票。
但是,稍有常识的人都知道,这样的调研是没有意义的。
你的样本根本不具有代表性。
因此,只从「幸存者」身上寻找他们「幸存」的条件,其实是非常可笑的。</p>
<p>想象一下,假设这个世界上存在着一套隐藏的筛选机制,没有人能知道这套筛选机制是怎么样的。
我们只能看到被这个机制筛选出来的人和事。
如果我们只从被筛选出来的人和事上总结规律,对筛选机制建模,那得到的结论恐怕不太可能是正确的。
因为,我们只从正例中学习,而不从反例中学习,这样的学习机制是不完备的。
在这样的条件下,几乎是不可能还原出筛选机制是什么样的。</p>
<p>世界上大多数人都渴望能够知道这样的筛选条件是什么,如果知道了,我们就能以最短距离的方式成为「成功」人士。
然而,除了「幸存者偏差」导致的认知偏差以外,还存在一个重要原因,使得能够成为「成功」人士困难重重。</p>
<p>那就是,这样的筛选条件<strong>可能</strong>是动态变化的!</p>
<p>想想历史就知道了。
不同的历史时代,出现了不同的成功人士。
战乱时代,成功人士就是武将霸者;和平时代,成功人士就是书生儒家。
不同时代的筛选标准是不同的。</p>
<p>如果从机器学习的角度来考虑这个问题,那么这个学习问题就有着两个本质性的特点:
1. 正反例不平衡,存在着大量的范例,正例很少。但是,我们能看到却往往是那些正例。
2. 数据不是I.I.D的,也就是说这些样本可能来自于不同的分布,是不同筛选机制下的产物。</p>
<p>面对如此复杂的问题,难怪世界上的成功人士永远是少数。</p>
<p>那么,针对这样的情况,我们有什么应对策略呢?
老实说,我也不知道。
针对上面分析的两个问题,我只能给出非常朴素的方案:</p>
<ol>
<li>不要只从成功者身上学习,也要从失败者的角度来学习。比如吴晓波的书「大败局」、「激荡三十年」等,其中有很多失败者的案例,非常值得学习。</li>
<li>认清当前时代的大势所趋。比如现在中国正在崛起,人工智能是未来的发展方向等。但是,认清大势也是一个非常复杂的问题, 不是一两句话就能讲清楚的。</li>
</ol>
<h1>参考资料</h1>
<ul>
<li>Wiki: <a href="https://zh.wikipedia.org/wiki/%E5%80%96%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE">幸存者偏差</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年7月21日写作并发表.</li>
</ul>全局化的人生2018-07-21T00:00:00-06:002018-07-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-21:/words/Structure-Life/<p>在之前的几篇博文中,我经常强调了「全局化」思想的重要性。我最新的体会是,不止是要用「全局化」的眼光看待这个世界,更要用「全局化」的思想看待自己。</p><p>在之前的几篇博文(<a href="http://zhouyichu.com/2018-04-08-Positive.md">保持积极的心态</a>, <a href="http://zhouyichu.com/2018-03-04-Structure.md">结构化</a>)中,我经常强调了「全局化」思想的重要性。
我最新的体会是,不止是要用「全局化」的眼光看待这个世界,更要用「全局化」的思想看待自己。</p>
<p>什么叫用「全局化」的眼光看待自己?
那就是要知道自己现在处于你人生中的哪一个位置,并且知道自己的下一站在哪里。
比如,我现在是博士第二年,是处于一个高效学习、高效产出,但还需要更多的科研训练的时期。
我的下一站就是博士毕业,彼时彼刻,我希望自己能够拥有独立展开科学研究的能力。</p>
<p>明确地知道自己当下所处的状态,并且了解自己将要走向的下一个状态,这样的「全局」观点能对自己的生活产生非常强的指导性作用。</p>
<p>在日常的生活中,我们不需要要太过关注自己当下遇到的困难,只要想想一周之后的自己将会是什么样的,一周之后的自己将会在哪里。
眼下这些困难其实就变得可有可无了。
这和李笑来老师提到过的「活在未来」的思想模式很类似。</p>
<p>站在一个更高的角度看待自己,很多事情都变得渺小了。</p>
<p>「全局化」思维的另一个好处在于,它可以让你变得更加有耐心,不再那么急躁。
过去,当我还没有掌握「全局化」思想的时候,总是会很焦虑。
常常会有一种「被同龄人抛下」的焦虑感,这样的焦虑感时刻伴随着我。
后来,经过慢慢的摸索,自己总结出了「全局化」思想之后,类似的焦虑感就逐渐消失了。
我清楚地知道我处于我人生中的哪一个阶段,并且知道自己的下一站在哪里。
这样的认知带给我很大的安全感。
有一种重新夺回了自己生活的掌控感的感觉。
之所以会有「被同龄人抛下」的焦虑,其实是因为你不知道的所处的位置,只聚焦于当下的事物。
当你把是视角抬高一点,从全局看待自己的人生的时候,这样的焦虑自然就消失了。</p>
<p>如何才能变得具有「全局化」的眼光呢?
我的个人经验是,首先要学会规划,规划自己的生活。
在做规划的时候,你自然地就会开始考虑自己的未来是什么样的。
但是,需要知道的是,做计划其实也是一个系统工程。
一下子是很难做出一个合理的规划的。
只有不断规划,不断失败之后,才会慢慢掌握自己能力的边界在哪里。
在清楚地知道自己的行动力边界在哪的时候,才能制定出既符合自己目标,也符合自己能力的规划。</p>
<p>一旦制定出合理的规划之后,剩下的就是执行了。
因为明确地知道自己将会走向哪里,自己的执行过程将会变得心无旁骛,不管周围的景色如何变化,自己的目标始终不变。
一步一步往前走,不会再有焦虑感。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月21日 写作并发表</li>
</ul>读书笔记:硬派健身2018-07-15T14:05:54-06:002018-07-15T14:05:54-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/Hard-Workout/<p>「硬派健身」读书笔记</p><p>作者: 斌卡</p>
<h1>摘录</h1>
<blockquote>
<p>身体有属于自己的运作体系,当我们饥饿的时候,身体就会有本能的反抗,通过分泌各种激素对抗你的意志,促使你去吃各种高糖、高脂、高热量的食物。</p>
</blockquote>
<p>我们需要顺应身体,而不是去抵抗他。</p>
<h1>综述</h1>
<p>整本书回答了这样的一个问题: 「新手该如何开始健身」
这几乎是一本健身的入门书籍,其中并没有包含太过高深的内容。
和其他健身书籍相比,这本书的内容其实覆盖的内容并不是很多,但是其中有几点对健身的理解却很有帮助:</p>
<ol>
<li>想要好身材,不要太纠结于局部细节,身体是一个完整的整体,和谐的比例才是美的。</li>
<li>大肌群是才是减脂的主力军,肌肉消耗的热量比脂肪大很多。因此,无氧锻炼要比有氧锻炼有效的多。</li>
<li>完美的身材是通过改变身体状态而来的,而不是短时间内突击训练、减脂而来的。</li>
</ol>
<h1>结构和细部</h1>
<p>全书从健身的不同方面阐述相关的内容:
1. 重塑对健身的理解
2. 减肥的误区
3. HIIT
4. 抗组训练
5. 如何吃
6. 训练计划</p>
<h2>健身思想</h2>
<p>首选作者在第一章重新刷新了我们对健身的理解,理想的身材不是简单的瘦,而是和谐的比例。
因此,我们在健身时不需要太过关注局部的部分,要把握好整体。
身体绝不是你练什么部位,什么部位就出现肌肉的。</p>
<p>其次,作者又指出不管是减脂还是增肌,无氧健身要比有氧健身有效的多。
因为,每公斤的肌肉消耗的能量远比脂肪多,因此,增长更多的肌肉,就能消耗更多的热量。在同样的食物摄入的条件下,自然就能消耗更多的热量。</p>
<h2>减肥</h2>
<p>第二章的内容是是分析了减肥失败的原因。</p>
<h3>节食</h3>
<p>节食只能在短时间内将体重降下来,但是会在后期会强烈的反弹效果。
因此,减少食物的摄入,会给身体错误的信号,让身体觉得现在是处于饥荒时期,身体将会降低日常的新陈代谢,从而存储更多的能量。
需要记住的是,我们的基因倾向于保证我们摄入的能量只进不出。</p>
<h3>运动</h3>
<p>长时间的有氧是一种非常低效的减脂方式。
身体具有超量恢复的特点,能将所有的输出以超量的方式补回来。
正确地策略应该是要改变身体的内在平衡,增加基础代谢,让身体消耗更多的能量,而不是存储更多的能量</p>
<h2>HIIT</h2>
<p>目前来说,HIIT是最佳的减脂训练方式。
它有两点要求:
1. 高强度
2. 间歇性</p>
<h2>抗组训练</h2>
<p>在这一章中,主要介绍了几个大肌群的训练动作和方式,包括:
- 胸部
- 臀部
- 腹肌
- 肩
- 手臂
- 腿</p>
<h2>吃</h2>
<p>健身的准则是三分练,七分吃。
吃是至关重要的。
在本章中,作者分析了吃在健身中的重要作用。
有几点值得牢记:
1. 平时我们需要多吃低GI的食物
2. 健身前后两小时,要杜绝脂肪
3. 运动中需要摄入碳水化合物,以增加胰岛素的分泌,而胰岛素能提高蛋白质的吸收效率
4. 健身后3小时,是肌肉增长的黄金时间。</p>
<h1>评价</h1>
<ul>
<li>内容: 4分</li>
<li>结构: 3分</li>
<li>写作: 4分</li>
</ul>
<h1>和我的关系</h1>
<p>这本书是我第二次阅读,第一次阅读的时候还没有完全形成脑图和笔记的习惯。
这次是第二次阅读,依然能否发现一些新的、被我遗忘的点。
可以说,这本书就是我的健身启蒙书籍。
树立了我对健身这个系统事件的正确观点。</p>
<h1>脑图</h1>
<p><img alt="Hard-Workout" src="http://zhouyichu.com/images/Hard-Workout.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>读书笔记:如何有效阅读一本书2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/How-to-Read-A-Book-Efficiently/<p>「如何有效阅读一本书」读书笔记</p><p>作者: 奥野宣之</p>
<h1>主要内容</h1>
<p>这也是一本讲述如何阅读的书籍。
相对于「如何阅读一本书」来说,这本书的内容更加富有可操作性。
全书从5个方面对「阅读」这一活动展开了论述:
1. 选书
2. 购书
3. 读书
4. 记录
5. 活用</p>
<p>如果说「如何阅读一本书」是一本理论分析的图书的话,那么这本「如何高效阅读一本书」就是一本操作手册。</p>
<h1>详细内容</h1>
<p>全书分为三个模块来讲解读书的5各方面</p>
<h2>选书与购书。</h2>
<p>对于如何选书这个问题,作者给出的意见是必须要带着目的去购书才有意义。
不要被书店中的各种畅销书所迷惑。
在平时可以搜集整理自己的各种想法,整理出一个阅读书单。
购买书籍时只按照书单上的内容购买。</p>
<h2>读书与笔记</h2>
<p>这部分内容在我看来是全书的核心内容。
首先作者点出了读书的目的不是「读完就好」而应该是「写读书笔记」。
通过写作读书笔记,才能真正内化吸收书本的内容。
作者提出了一种称为「葱鱿火锅」式的笔记方法:</p>
<ol>
<li>首先记录日期、书名、作者名。</li>
<li>对重要的内容进行摘抄,每一段摘抄之后附上自己的评论。</li>
<li>摘录和对应的评论需要交替进行,用不同的符号进行区分。</li>
<li>写下自己的对全书的评论和感想。</li>
<li>不是所有的书籍都需要进行完整的笔记</li>
</ol>
<h2>活用</h2>
<p>这部分的内容和大部分人观点是一致的,只有输出才是最好的检验方式。
因此作者也支持要把读后感写成博文的形式进行输出。</p>
<h2>19个阅读技巧</h2>
<blockquote>
<ol>
<li>不依赖网络,多用参考书籍</li>
<li>多读百科全书</li>
<li>通过订阅提醒自己</li>
<li>书店里不仅有新书旧书,还会有新的发现</li>
<li>由浅入深吃透难懂图书: 从解说版、图解版开始</li>
<li>把书堆成山,读书不再难</li>
<li>把名著放枕边</li>
<li>常带三本书同时阅读</li>
<li>在家里的每个角落放满书</li>
<li>去掉外封,让读书变得更轻松</li>
<li>杂志要边撕边读</li>
<li>不能小看有声学问</li>
<li>准备一只你想珍藏的钢笔</li>
<li>名言要贴在显眼处</li>
<li>读后感从摘抄开始</li>
<li>用复印机让摘抄更方便</li>
<li>用“独创版权页”记录书的履历</li>
<li>书与笔记交叉使用</li>
<li>书架是读书生活的基地</li>
</ol>
</blockquote>
<h1>感想</h1>
<p>对于作者提出的各项阅读建议,我基本上都是赞同的。
但是,很显然,作者写作的时间是几年前的时代,现在移动设备已经非常普遍了,阅读和笔记的形式已经发生了变化。
因此,要切实执行作者的建议,我需要自己做出相应的改变。
首先,构建自己的读书列表,这部分内容我早就开始在进行了,并且已经在很大程度上完善了自己的读书计划。
其次,读书笔记。这部分内容不仅是全书的核心,也是我最需要学习的地方。
虽然过去几年我也阅读了不少的书,但是没能做好摘录和笔记这一步的工作。
这本书刚好点醒了我,阅读的目标不仅仅是「读完就好」,还更应该是「写读书笔记」。
我决定采用作者的建议,重新规划自己的读书方法:
1. 为每一本书籍写作读书笔记,不管是否是小说。
2. 做好摘录工作。我之前阅读的时候,从未做过任何形式的摘录,这应该也是我读书效率低下的原因之一吧。
3. 结合「如何阅读一本书」的内容,可以总结出一个读书感想的模板。
这个模板将会包括:
1. 这本书的摘录及其相应评论
2. 用自己的语言描述这本书的综述
3. 用自己的语言总结全书的结构和细部内容
4. 提炼出中心观点,并进行判定。
5. 说明这本书和自己的关系</p>
<h1>脑图</h1>
<p><img alt="how-to-read-a-book-efficiently" src="http://zhouyichu.com/images/how-to-read-a-book-efficiently.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>读书笔记:如何阅读一本书2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/How-to-Read-A-Book-Note/<p>「何阅读一本书」读书笔记</p><p>作者: 莫提默·J. 艾德勒 / 查尔斯·范多伦</p>
<p>这是一篇被无人数了写了无数遍的关于一本被无数人阅读过的读书笔记。
然而,我还是重新发明一遍轮子。
为什么?
因为我想把这篇笔记作为实践这本书的一个练习。</p>
<p>首先要明确的,这篇笔记是关于「如何阅读一本书」这本书的。
这是一本初版于1940年(再版与1972年)的实用性书籍。
这是一本说明如何进行阅读的书籍。
读过这本书之后,你就会发现,其实阅读并不如你想象的那么简单。</p>
<h1>核心内容</h1>
<p>本书从指出<strong>阅读是一件主动的事情</strong>开始,首先给出了对于「阅读」这个行为的解释。
本书用一个打棒球的例子说明了作者与读者的关系:作者与读者的关系就像是投手和捕手的关系,球是作者发出的信息,而读者能接受多少则取决于作者的写作水平和读者的主动程度。
这是一个双方需要投入精力的过程。</p>
<p>作者在书中一再强调,只有做一个「主动」读者,才能完整读读懂读透一本书。
每读完一本书,我们都需要问自己以下四个问题(本篇笔记也正是在试图回答这四个问题):
1. 从整体上来说,这本书到底在谈些什么
2. 作者细部说了些什么,怎么说的
3. 这本书说得有道理吗?
4. <strong>这本书跟我有什么关系</strong></p>
<p>在这四个问题中,最后一个是最重要的。
因为,阅读一本书是为了提高自己,不能为了读书而读书。</p>
<p>在明确了<strong>阅读是一件主动的事情</strong>之后,作者们开始介绍他们对于阅读层次的分类,他们讲阅读过程分为四个不同的层次:</p>
<ol>
<li>基础阅读: 读懂每一个句子,摆脱文盲的状态。这是最基础的一个层级。</li>
<li>检视阅读: 一定时间内抓住书本的重点。能够在不逐字逐句阅读的情况下,说明这本书的主题。</li>
<li>分析阅读: 在无限的时间内,完整的阅读书籍。这是最详细的、全盘的阅读。但是,需要注意的是,不是每一本书都需要进行分析阅读的。</li>
<li>主题阅读: 针对某一个主题,同时阅读多本相关的书籍。</li>
</ol>
<h1>详细内容</h1>
<p>本书的详细内容就是关于对阅读的四个层级的展开解说。</p>
<h2>基础阅读</h2>
<p>这部分是最基本的,分为四种基本的能力:</p>
<ol>
<li>词义的认知能力</li>
<li>信息的查阅能力</li>
<li>读写的记录能力</li>
<li>对未知事物的好奇心</li>
</ol>
<h2>检视阅读</h2>
<p>检视阅读的目标是要在有限的时间内抓住一本书的中心思想。
分为两个步骤:</p>
<p><strong>步骤一: 有系统的略读</strong></p>
<p>通过阅读一本书的书名页、序言、目录、索引页、作者介绍和各章的摘要说明来快速掌握这本所谈的主题是什么。</p>
<p><strong>步骤二: 粗浅的阅读</strong></p>
<p>快速概览一遍全书,忽略不懂的地方,快速通读一遍。</p>
<p>这里需要注意的是:</p>
<ol>
<li>不是所有书籍都需要相同的阅读速度</li>
<li>不是所有的章节都需要相同的阅读速度</li>
</ol>
<h2>分析阅读</h2>
<p>分析阅读是一种最彻底的阅读方法,也是成本最大一种阅读方式。
不是所有书籍都需要使用分析阅读,只有遇到真正的经典书籍时,才需要使用分析阅读的方法。</p>
<p>作者在这个层次中总结了三个阶段共11个规则来指导分析阅读:</p>
<p><strong>阶段一: 整理内容大纲</strong></p>
<ol>
<li>规则一: 必须知道自己在阅读哪一类的书籍,实用还是理论?</li>
<li>规则二: 使用单一的句子或几句话来叙述整本书的内容</li>
<li>规则三: 将书中的重要篇章列举出来,说明它们是如何按照顺序组成一个整体的架构</li>
<li>规则四: 找出作者想要解决的问题</li>
<li>规则五: 找出重要的单字,与作者达成共识</li>
</ol>
<p><strong>阶段二: 诠释这本书的内容</strong></p>
<ol>
<li>规则六: 将一本书中最重要的句子圈出来,找出其中的主旨</li>
<li>规则七: 从相关文句的关联中,设法架构出一本书的基本论述。</li>
<li>规则八: 确定哪些问题已经被解决,哪些还没有被解决</li>
</ol>
<p><strong>阶段三: 评论一本书</strong></p>
<ol>
<li>规则九: 除非你已经完成大纲架构,也能诠释整本书了,否则不要轻易批评</li>
<li>规则十: 当你不同意作者观点时,要理性的表达自己,不要无理的辩驳或争论。</li>
<li>规则十一: 尊重知识与个人观点的不同,在做出任何判断之前,都要找出理论依据</li>
</ol>
<h2>主题阅读</h2>
<p>主题阅读是一种针对某一个主题同时阅读多本书的阅读方法。
这种方法很像是在做研究工作。</p>
<p>主要分为两个阶段:</p>
<p><strong>第一阶段</strong></p>
<ol>
<li>建立一个书单</li>
<li>把书单中书整体检视阅读一遍,确定哪些与主题有关,并建立起关于主题的清楚概念</li>
</ol>
<p><strong>第二阶段</strong></p>
<ol>
<li>找到每一本书中的相关章节。需要注意的是,此时的重心是主题而不是单本书籍,你不需要阅读整本书籍。</li>
<li>带引作者与你达成共识。理清不同作者之间使用的词义,创立一套中立的词汇。</li>
<li>厘清问题,整理出需要被回答的问题,寻找不同作者的答案</li>
<li>界定议题,针对同一问题的不同答案,对答案进行分类整理。界定主要和次要的议题</li>
<li>分析讨论</li>
</ol>
<h2>其他</h2>
<p>在充分说明阅读的四种不同层次之后,书中又对不同读物的阅读方法进行详细的说明。
这些不同的阅读方法都是基于上述阅读的四个层次的,只是局部细节的规则有些小差异。</p>
<p>最后,作者强调了几个关于阅读的重点:
1. 阅读只是提高自己的第一步,不能为了阅读而阅读
2. 让你觉得难以阅读的书,才是能够让你有所提高的书
3. 世界上需要反复阅读,需要使用分析阅读的书籍其实并不多,需要学会区分经典书籍。</p>
<h1>心得</h1>
<p>这本书事无巨细地将整个阅读过程的心态、技巧都进行了讲解,对我帮助很大。
其中对我帮助最大的观点是,一定要保证自己充分理解了一本书之后,才能对这本进行评论。
并且一定要区别出真正的知识和个人观点的不同之处。</p>
<p>这本书在一定程度上改变了我的阅读习惯,加深了我对阅读这件事的理解。
在之后的生活中,我将逐步应用这些规则,并且尝试将其改造成适合我自己的阅读习惯。</p>
<h1>脑图</h1>
<p><img alt="如何阅读一本书" src="http://zhouyichu.com/images/how-to-read-a-book.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>读书笔记:如何阅读一本小说2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/How-to-Read-A-Novel/<p>「如何阅读一本小说」读书笔记</p><p>作者: 托马斯·福斯特</p>
<h1>摘录</h1>
<blockquote>
<p>小说以勾人的篇首开始,也让读者开动起来,进入即将到来的诱惑之中。</p>
</blockquote>
<p>以前高中时代的写作课的时候,老师就曾经说过,写文章的最好模式应该是「凤头,猪肚,豹尾」。我像这样的模式放在小说身上也同样适用吧。</p>
<blockquote>
<p>“叙事措辞法则”: 你们可以通过他们的用词了解他们。</p>
</blockquote>
<p>这样的写法太随意了!你们和他们是谁?!文字太过口语化,读起来非常累。</p>
<blockquote>
<p>如果说传记或历史的目标是要再现其主体的客观现实,那么,小说的目标就是要展现其客体的主观事实。</p>
</blockquote>
<p>传记和历史注重历史人物(主体)的在当时所发生的事实(客观现实),而小说努力在读者(客体)的脑海中构造一个虚拟的世界(主观事实).</p>
<blockquote>
<p>小说思想法则: 如果小说本身很糟糕,它的哲学再好也没用。</p>
</blockquote>
<p>一部有深度的小说,首先必须是一部优秀的小说,然后才能承载更多的有深度的思想。</p>
<h1>综述</h1>
<p>这本书回答了这样的问题: 「我们应该如何去理解一部小说?」
书中讨论了很多关于阅读小说我们需要了解的基本法则,这些法则能够帮助我们:</p>
<ol>
<li>更加正确地区分出优秀的小说和平庸的小说</li>
<li>帮助我们理解小说的发展、趋势和未来</li>
</ol>
<h1>结构和细部</h1>
<p>全书一共分为23个章节,每个章节基本相互独立,我们可以从任何一个章节开始阅读。
全书基本是按照口语化的描述写成的,我想它应该是某个大学的课程讲义编辑而成吧。
书中提出的多个关于小说的法则,这些法则有助于我们更好的理解一部小说。
比如(这些法则是进过我自己总结提炼而出,并不一定是原文中的叙述):</p>
<ul>
<li>开篇法则: 一部小说的开头蕴含了丰富的信息,这些信息将会决定读者是否愿意继续读下去。几乎所有的名著小说都有一段非常精彩的开篇</li>
<li>虚构法则: 小说中的所有事物、环境、人物、叙述者都是虚构的产物,不管这部小说是否是来源于历史事件。因为,一旦经过作者的加工,他/她就已经不是原先历史中的那个人物了。</li>
<li>叙述者法则: 所有小说的叙述者也都是虚构的产物,不管是以什么视角讲述故事,它都是作者的一个虚构的代理。有些小说,将会拥有不止一个叙述者。</li>
<li>留白法则: 每一个小说人物都是不完整的,小说人物是作者的描述加上读者的想象的产物。两者都没有对小说人物的绝对控制权,这就是所谓的「一千个人眼中就有一千个哈姆莱特」</li>
<li>人物法则: 小说中的人物名字其实并不重要,重要的人物身上的标签。只有这些标签才能区别出人物,每个人物都有其令人印象深刻的特点。</li>
<li>理解角色: 小说其实是由角色内心的欲望推动的,这些欲望才是驱动小说前进的原动力。</li>
</ul>
<p>除了这些法则以外,书中作者还论述了一下小说发展的趋势。
维多利亚时代是小说这种写作题材腾飞的时代。维多利亚时代的小说都有着这样的特点:
1. 通常以上帝视角展开
2. 倾向于完善的结局,每人人物都有一个合理的结局,很少出现开放式的收尾。</p>
<p>20世纪后后半叶的小说发生了很多的变化,讲述视角发生了改变、线性叙述也变得支离破碎,乱序的写作成为潮流。</p>
<h1>评价</h1>
<ul>
<li>内容: 3分</li>
<li>结构: 1分</li>
<li>写作: 1分</li>
</ul>
<p>对于看惯了科学论文的我来说,这样的书籍让我非常不适应。
内容方面还算不错,作为一个业余的小说读者,了解一些关于小说写作的基本原理还是很有帮助的。
全书基本可以说是没有什么结构,每个章节独立成为一个单元,章节之间也没有什么承上启下的过度。
作者的论述非常的啰嗦,很多时候,我需要高度集中精神才能从他的字里行间找出他真正的观点。阅读过程非常不友好。</p>
<h1>和我的关系</h1>
<p>尽管这本书的阅读体验很差,但是我确实也学到了一些不同的东西。
比如那些关于小说的法则。
在以后的阅读过程中,我就能知道,该去寻找哪些要素来评价一部小说。</p>
<h1>脑图</h1>
<p><img alt="How-to-Read-a-Novel" src="http://zhouyichu.com/images/How-to-Read-a-Novel.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>读书笔记:边缘人的战争2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/The-Hammer-of-Eden/<p>「边缘人的战争」读书笔记</p><p>作者: Ken Follett</p>
<h1>主要内容</h1>
<p>小说是以两个人物的POV视角展开的。
一方面是从小在社会边缘长大的「神甫」,受到了美国60、70年代的嬉皮士运动感召,纠集了一批人在加州的某个山谷中刀耕火种,以一种远离现代社会的方式生活。直到加州政府决定在此地新建设核电厂,打破了他们宁静的生活。
神甫决定采用威胁地震的方式,胁迫州政府做出妥协,撤销新建的计划。
另一方面是以FBI女探员朱迪的角度展开的,她接手了这次地震恐怖威胁的案子。</p>
<p>「神甫」拥有极高的智商,但却是一个文盲。
而就是这样一个文盲,把FBI玩得团团转。
他先是在一个无人区引发了第一次的地震,但是由于政府迟迟不肯答应他的要求,于是他在一个小镇引发了第二次的地震,造成巨大的伤亡。
在FBI对他的诱捕失败之后,他想要进行第三次的地震。
在这个过程中,他不惜抛弃了一起生活了二十五年的伴侣和一直以来最支持他的同伙。
最终第三次的尝试失败了,他自己也被FBI击伤,最终自杀于他想要守护的山谷。</p>
<p>在收到他的恐怖威胁之后,州政府和FBI都没有严肃对待。
只有FBI的女探员朱迪对这件事进行了调查。
朱迪是因为被新上司排挤,被迫接手这样一个在高层看来只是恶意玩笑的案件。
随着第一次地震的引发,FBI开始认真严肃的对待这件事。
又是因为办公室政治的问题,朱迪的新上司又将这个案子交给了一个没有能力的人来主管。
在经过努力之后,朱迪夺回了案子的控制权,最终抓到了案件的始作俑者「神甫」。</p>
<h1>感想</h1>
<p>很显然,在这部小说里,「神甫」是一个反面的形象。
然而,在一开始,其实我还是很同情他的。
他只是想要维持自己的生活状态,不希望受到外在社会的干扰。
尽管我无法接受他的信仰,但至少我支持他捍卫自己的信仰。
但是,随着阅读的进行,我越来越不喜欢这个人物了。</p>
<p>就像朱迪说的,他其实就是一个邪教的首领。
他想要捍卫的其实并不是所谓的平静安宁的生活,他想要保持的是他自己在公社的领导地位,他希望控制别人,让别人围着他转。
不过,也许他到死都没有意识到这一点的吧。
他一直觉得自己是在捍卫公社的存在,但是直到公社被捣毁,他却依然故我的选择引发地震。</p>
<p>书中除了「朱迪」和「神甫」这两个角色以外,其他的配角其实都没有什么大的亮点。甚至有很多地方的设计不合理,太过生硬了。
比如那个新入伙的地震学家的妻子,她的各种行为都投出一种歇斯底里的气息,很难想象在她加入公社之前是如何生活。
他的丈夫迈克尔也是个很单薄的人物,不知道为什么就和女主角朱迪发生了感情。
从小说中我丝毫不觉得这样的感情发展是自然的结果。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>读书笔记:精灵宝钻2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/reading-list/The-Silmarillion/<p>「精灵宝钻」读书笔记</p><p>作者: 托尔金</p>
<h1>主要内容</h1>
<p>这本书我不知道是否该称这本书为小说,因为整本书其实就是想象的历史叙述。
全书没有主角,作者只是波澜不惊的讲述魔戒世界的历史背景。</p>
<p>在魔戒的世界观中,整个世界是由唯一的真神如一在美丽大乐章中创造的。
如一下面很多很一级神,称为维拉。
而维拉下属又有很多次级神,称为迈雅,「魔戒」中熟悉的人物,甘道夫、萨鲁曼、索隆其实都是次级神,都是迈雅。
如一创造了整个世界的空间和时间,而维拉在其中创造了大地、海洋、山川等等。
精灵是如一创造的第一种生命形态,而人类是第二种生命形态,分别被称为首生子女,和次生子女。
矮人,则是由其中一个维拉创造的。
在等待精灵和人类降生的时间里,一个维拉感到寂寞,因此创造了矮人这一种族。</p>
<p>在整个世界创造之后,其中一个维拉因为嫉妒其他维拉创造的事物,因此变得黑暗阴损。最终成为了第一代魔君魔苟斯。
魔苟斯手下有一个迈雅,后来继承了他成为了新一代的黑暗魔君,这就是后来的索隆。</p>
<p>「精灵宝钻」主要讲述的就是第三纪元前,整个中途大陆发生的故事。
在这段时间里,发生很多激烈的战争,大部分精灵离开了中土大陆,前往西方大陆维林诺。
维林诺是众维拉居住的地方。
「魔戒」末尾,最后一批精灵也离开了中途大陆,前往维林诺。</p>
<p>「精灵宝钻」作为「魔戒」系列的背景介绍,回答了很多的历史问题:</p>
<ol>
<li>为什么阿拉贡寿命如此之长,为什么他是刚铎的继承人。因为他的祖先是精灵和维拉的后代,体内具有神的血脉。这一族的人类都拥有超长的寿命。</li>
<li>为什么甘道夫能够复活?因为甘道夫其实是次级神,他是没有本体的,他的肉体死后,灵魂就会回到维林诺。之后,他再次前往中途大陆。</li>
<li>兽人的出处是什么?兽人是魔苟斯不断折磨俘虏的精灵而创造出的另外一种生物。</li>
</ol>
<h1>感想</h1>
<p>整个故事是非常典型的西方文化中的二元对立具体体现。
中土大陆永远有两股势力: 正义的与邪恶的。
整个历史,就是这两股势力相互争斗的结果。
现在看来这样的设置其实有些幼稚。
这个世界远非是一黑一白就能理解清楚的。</p>
<p>不过,作为一部想象小说,整个魔戒系列的世界体系还算是自洽的,具有很高的娱乐性。
但是,按照「如何阅读一本小说」中的评价标准来说的话,「精灵宝钻」其实可以说是一部失败的小说。
因为,这本书犯了小说写作的两个大忌:
1. 人物太多而没有独特的特点标签。
这部书中出现了大量的人名、地点,而这些人物都没有什么显著的特点标签,能够让读者记住。
只读一遍这部书,是不可能完全理清楚其中的人物关系的。
但是,我认为这样的书,最多只需要阅读一遍而已。
2. 作者想要涵盖所有的细节。作者事无巨细的进行描述,而这其实在一定程度上破坏了小说的阅读性。一定程度的留白,反而更加吸引人。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月15日发表</li>
</ul>纸上谈兵与柏拉图2018-07-15T00:00:00-06:002018-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-15:/words/armchair/<p>柏拉图在他的「理想国」中提出了一种非常朴素的哲学思想。
他认为在这个世界以外存在着另外一个理型的世界,在这个理型的世界里一切都是完美的。
而我们的现实世界是这个这个理型世界的不完美投影。
比如,理型的世界里有一匹马,这匹马是完美的,拥有一切马应该有的特质。
然而,在我们的现实世界里,有的马大一点,有的马小一点,没有一匹马是完美,他们全部都是理型世界中的马的不完美投影。</p>
<p>虽然,我们知道,这样的思想是非常朴素的,放在今天这个时代,这样的哲学思想已经不为人所接受了。</p>
<p>但是,在很多实践中,其实还能看到这种思想的延续。</p>
<p>在任何的科研领域,我们在分析一个问题的时候,往往都会假设一些先决条件,这些先决条件是我们分析、解决问题的基础。
我们会为这些问题创造出一个理想的「环境」,在这个理想的「环境」中,我们才能分析某个问题。
而这个理想的「环境」就像是柏拉图所说的理型的世界。
然而,悲哀的是,这样的理型的世界并不存在。
我们可以举出很多例子:</p>
<ul>
<li>在机器学习领域的入门课程中,我们往往会假设数据是没有噪音的,是一个完美的线性可分的数据,这样更容易让学生理解学习的过程。然而,在实际的实践,我们永远不会碰到本身就是线性可分的、没有噪音的数据 …</li></ul><p>柏拉图在他的「理想国」中提出了一种非常朴素的哲学思想。
他认为在这个世界以外存在着另外一个理型的世界,在这个理型的世界里一切都是完美的。
而我们的现实世界是这个这个理型世界的不完美投影。
比如,理型的世界里有一匹马,这匹马是完美的,拥有一切马应该有的特质。
然而,在我们的现实世界里,有的马大一点,有的马小一点,没有一匹马是完美,他们全部都是理型世界中的马的不完美投影。</p>
<p>虽然,我们知道,这样的思想是非常朴素的,放在今天这个时代,这样的哲学思想已经不为人所接受了。</p>
<p>但是,在很多实践中,其实还能看到这种思想的延续。</p>
<p>在任何的科研领域,我们在分析一个问题的时候,往往都会假设一些先决条件,这些先决条件是我们分析、解决问题的基础。
我们会为这些问题创造出一个理想的「环境」,在这个理想的「环境」中,我们才能分析某个问题。
而这个理想的「环境」就像是柏拉图所说的理型的世界。
然而,悲哀的是,这样的理型的世界并不存在。
我们可以举出很多例子:</p>
<ul>
<li>在机器学习领域的入门课程中,我们往往会假设数据是没有噪音的,是一个完美的线性可分的数据,这样更容易让学生理解学习的过程。然而,在实际的实践,我们永远不会碰到本身就是线性可分的、没有噪音的数据。理想和现实中存在着巨大的差异。</li>
<li>同样是机器学习领域,我们还会往往假设数据的特征都是离散化的,因为离散的数据点更加容易处理。但是,在很多情况下,我们也是无法得到离散化的数据的。比如身高、体重等都是连续的数值,将他们作为特征,需要进一步的离散化。</li>
<li>在经济学上,最基础的假设就是每个人市场的参与者都是理性的。多少次股灾事件告诉我们,人是贪婪的,人很多时候是非理性的。</li>
</ul>
<p>既然我们做出的假设,想象出来的「理型」的世界往往是错的,我们为什么还要做出这样的想象和假设呢?
答案非常简单,因为这样的假设能够简化问题的复杂度,有助于我们对问题进行分析。
这个世界是如此的复杂,人类的思维能力不足以展开全篇的分析,因此,只能借助于创造一个理型的世界进行分析。
这是人类分析复杂问题的唯一方法。
但是,我们需要牢记的是,这种分析得到的结果,并不一定是正确的。
因为我们是在理型的世界中进行的分析,而实际的应用场景却是在现实的世界中。</p>
<p>明白这一点是非常重要的.</p>
<p>过去很多的读书人,没有意识到这两个世界之间的差别,他们往往不自觉的活在了他们想象出来的「理想」的世界中。
这样的人,我们会赠与他们一个称号: 「纸上谈兵」.
历史上最典型的就是赵括了。</p>
<p>从这个角度来说,柏拉图和赵括有着相似的方法论。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月14日写作</li>
<li>2018年7月15日发表</li>
</ul>向量代数-线性映射2018-07-14T00:00:00-06:002018-07-14T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-14:/words/Linear-Algebra-Linear-Map/<p>在<a href="http://zhouyichu.com/words/Linear-Algebra-Vector-Space/">线性代数-向量空间</a>中谈完了向量空间和向量的表示,我们现在来看一下向量空间中的运动,毕竟,整个线性代数描述的其实是向量空间中的运动。</p>
<h1>线性映射</h1>
<p>向量空间中描述的运动不是我们常规认识上的运动,向量空间中的运动都是瞬时的,它和时间无关,只描述方向和大小。
向量空间上线性映射是这么定义的:</p>
<blockquote>
<p>一个线性映射<span class="math">\(T\)</span>是从向量空间<span class="math">\(V\)</span>到向量空间<span class="math">\(W\)</span>的一个函数,这个函数具有如下的性质:
- 相加性: <span class="math">\(T(u+v)=Tu+Tv\)</span>,其中<span class="math">\(u,v\in V\)</span>
- 齐次性: <span class="math">\(T(\lambda v)=\lambda(Tv)\)</span>, 其中<span class="math">\(\lambda\in\mathbb{R}, v\in V\)</span></p>
</blockquote>
<p>我们可以看到,所谓的线性映射其实也不过是一种函数,将向量从一个空间映射到另外一个空间,且这种映射满足两个特殊的条件。
在数学上 …</p><p>在<a href="http://zhouyichu.com/words/Linear-Algebra-Vector-Space/">线性代数-向量空间</a>中谈完了向量空间和向量的表示,我们现在来看一下向量空间中的运动,毕竟,整个线性代数描述的其实是向量空间中的运动。</p>
<h1>线性映射</h1>
<p>向量空间中描述的运动不是我们常规认识上的运动,向量空间中的运动都是瞬时的,它和时间无关,只描述方向和大小。
向量空间上线性映射是这么定义的:</p>
<blockquote>
<p>一个线性映射<span class="math">\(T\)</span>是从向量空间<span class="math">\(V\)</span>到向量空间<span class="math">\(W\)</span>的一个函数,这个函数具有如下的性质:
- 相加性: <span class="math">\(T(u+v)=Tu+Tv\)</span>,其中<span class="math">\(u,v\in V\)</span>
- 齐次性: <span class="math">\(T(\lambda v)=\lambda(Tv)\)</span>, 其中<span class="math">\(\lambda\in\mathbb{R}, v\in V\)</span></p>
</blockquote>
<p>我们可以看到,所谓的线性映射其实也不过是一种函数,将向量从一个空间映射到另外一个空间,且这种映射满足两个特殊的条件。
在数学上,我们用<span class="math">\(\mathcal{L}(V,W)\)</span>表示所有从<span class="math">\(V\)</span>到<span class="math">\(W\)</span>的线性映射.
简单想一想,我们就能知道,<span class="math">\(\mathcal{L}(V,W)\)</span>其实也是一个向量空间,其中的元素是一个一个的函数,但同时又满足向量空间定义中的条件。
相关的证明,能够在任意的线性代数的教课书上找到。</p>
<p>在给出了线性映射的定义之后,我们又回到了那个老问题,如何表示一个线性映射?总不至于将<span class="math">\(V\)</span>和<span class="math">\(W\)</span>中的每一对向量都列出来吧?</p>
<p>这个时候(又是见证人类智慧伟大结晶的时候了),我们就需要引入矩阵的概念了。
根据我们在上一节中说明的,向量空间中的任意一个向量都可以用一组「基」来唯一的表示。
假设<span class="math">\(v_1,\ldots,v_n\)</span>是<span class="math">\(V\)</span>的一组基,<span class="math">\(w_1,\ldots,w_m\)</span>是<span class="math">\(W\)</span>的一组基,且<span class="math">\(T\in\mathcal{L}(V,W)\)</span>, 那么如下的等式一定成立:</p>
<div class="math">$$
\begin{aligned}
Tv_1 &= A_{1,1}w_1+\cdots+A_{m,1}w_m\\
Tv_2 &= A_{1,2}w_1+\cdots+A_{m,2}w_m\\
&\vdots\\
Tv_n &= A_{1,n}w_1+\cdots+A_{m,n}w_m
\end{aligned}
$$</div>
<p><span class="math">\(Tv_i\)</span>表示的是任何一个基向量经过线性映射之后在<span class="math">\(W\)</span>中的向量,<span class="math">\(w_1,\ldots w_m\)</span>又是<span class="math">\(W\)</span>中的基,因此一定存在一组唯一的<span class="math">\(A_{1i},\cdots,A_{mi}\)</span>坐标来表示<span class="math">\(Tv_i\)</span>.
而,<span class="math">\(v_1,\cdots,v_n\)</span>又能完全表示<span class="math">\(V\)</span>中的任意一个向量,也就是说,任意个向量<span class="math">\(v\in V\)</span>的映射后的向量<span class="math">\(Tv\)</span>都能表示成:</p>
<div class="math">$$
\begin{aligned}
Tv&=T(a_1v_1+\cdots+a_nv_n)\\
&= a_1Tv_1+\cdots+a_nTv_n\\
&=a_1(A_{1,1}w_1+\cdots+A_{m,1}w_m) + \cdots + a_n(A_{1,n}w_1+\cdots+A_{m,n}w_m)\\
&= (a_1A_{11}+\cdots+a_nA_{1n})w_1 + \cdots + (a_mA_{m1}+\cdots+a_nA_{mn})w_n
\end{aligned}
$$</div>
<p>上面的推导想要说明的是,如在原空间中的任意一个向量的坐标是<span class="math">\(a_1,\cdots,a_n\)</span>的话,那么其经过<span class="math">\(T\)</span>映射之后的向量的坐标就是<span class="math">\(a_1A_{11}+\cdots+a_nA_{1n},\cdots,a_mA_{m1}+\cdots+a_nA_{mn}\)</span>.也就说,一旦确定了两个空间的基之后,通过<span class="math">\(m\times n\)</span>个数,就能确定一个线性映射了。</p>
<p>那么,这个映射后的坐标<span class="math">\(a_1A_{11}+\cdots+a_nA_{1n},\cdots,a_mA_{m1}+\cdots+a_nA_{mn}\)</span>
有没有觉得很眼熟?
将这个坐标表示成:</p>
<div class="math">$$
\left[
\begin{matrix}
A_{11} & \cdots & A_{1,n}\\
\vdots & &\vdots \\
A_{m1} & \cdots & A_{mn}
\end{matrix}
\right]
\left[
\begin{matrix}
a_1 \\ \vdots\\a_n
\end{matrix}
\right] =
\left[
\begin{matrix}
a_1A_{11}+\cdots+a_nA_{1n}\\
\vdots\\
a_1A_{m1}+\cdots+a_nA_{mn}\\
\end{matrix}
\right]
$$</div>
<p>这不就是当年我们学习矩阵和向量的乘法吗?
因此,我们就可以得出结论,所谓的矩阵其实就是线性映射的一种表示方式。</p>
<h2>矩阵的秩</h2>
<p>现在,我们知道,矩阵的每一列<span class="math">\(A_{1i},\cdots,A_{mi}\)</span>其实是原空间上的一个基向量<span class="math">\(v_i\)</span>经过矩阵<span class="math">\(A\)</span>代表的线性映射<span class="math">\(T\)</span>在新空间上的一个坐标。</p>
<p>也就是说<span class="math">\(A_{1i},\cdots,A_{mi}\)</span>其实也是一个(<span class="math">\(W\)</span>空间里的)向量(其基是<span class="math">\(w_1,\cdots,w_m\)</span>)。
我们现在用<span class="math">\(A_i\)</span>来表示整个<span class="math">\(A_{1i},\cdots,A_{mi}\)</span>向量序列。
我们知道,<span class="math">\(A_i,i\in \{1,2,\cdots,m\}\)</span>是<span class="math">\(W\)</span>上的一组向量,那么我们不经要问<span class="math">\(span(A_1,\cdots,A_m)\)</span>是否等于整个<span class="math">\(W\)</span>呢?</p>
<p>这个问题是很重要的,如果<span class="math">\(span(A_1,\cdots,A_m)\)</span>只是<span class="math">\(W\)</span>的一个子集,那也就是说,这个矩阵包含了比较少的信息,只能覆盖<span class="math">\(W\)</span>的一个子集;
相反,如果<span class="math">\(span(A_1,\cdots,A_m)\)</span>等于整个<span class="math">\(W\)</span>,那么就说明<span class="math">\(A\)</span>包含了''足够''的信息,能够将整个<span class="math">\(V\)</span>映射到整个<span class="math">\(W\)</span>上。
那么我们该如何判断<span class="math">\(A\)</span>包含了多少信息呢?</p>
<p>一种度量方式就是看<span class="math">\(span(A_1,\cdots,A_m)\)</span>的维度,如果<span class="math">\(span(A_1,\cdots,A_m)\)</span>的维度等于<span class="math">\(W\)</span>的维度,那么<span class="math">\(span(A_1,\cdots,A_m)\)</span>就等于整个<span class="math">\(W\)</span>.
而<span class="math">\(span(A_1,\cdots,A_m)\)</span>其实就是我们常说的矩阵的秩。
我们平时所说的满秩矩阵其实就是说这个矩阵代表的线性映射能够覆盖整个目标空间。</p>
<p>当然,在实际应用中,我们通常比较喜欢的是低秩矩阵,因为它不是满秩的,说明线性映射之后,只是<span class="math">\(W\)</span>的一个子空间,说明<span class="math">\(A\)</span>的信息量少,这样的矩阵可以进行降维,可以进行大幅度的压缩。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://www.amazon.com/Linear-Algebra-Right-Undergraduate-Mathematics/dp/3319110799/ref=sr_1_1?ie=UTF8&qid=1530890765&sr=8-1&keywords=Linear+algebra+done+right">Linear Algebra Done Right</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年7月11日写作</li>
<li>2018年7月14日发表</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Know yourself2018-07-07T00:00:00-06:002018-07-07T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-07:/words/Know-Yourself/<p>人这一生最重要的是就是要认识自己。
找到自己合适的位置。</p>
<p>少年的时候,总是幻想自己将来要成就一番大的事业。
然而,一次又一次被现实打脸之后,终于恍然大悟,原来那些都是自己不切实际的幻想。
你并不是天赋异禀的,你只是千千万万个普通人而已。</p>
<p>很多时候,一旦看穿,其实反而心就静下来了。
不再那么的冲动,不再那么的自命清高,不再那么的眼高手低。</p>
<p>找到自己的位置,才是最重要的。
这个世界如此的广阔,总有一个专属于你的位置的。</p>
<p>很多人都羡慕马云、扎克伯格,我曾经也是。
然而,现在越来越觉得,这些人的能力和他们取得的成就是相互匹配的。
即使把我放在和他们相同的情景下面,我也不觉得自己能缔造阿里和Facebook.</p>
<p>自己的界限就在那里,何必强求?</p>
<p>曾经有句话特别流行: 「你的努力程度决定了你成就的下限,你的天赋决定了你的上限」
我曾经觉得这句话很颓,总觉得人生不应该设限。
结果,现实证明其实这句话是对的。</p>
<p>有些人,你是永远赶不上的。</p>
<p>但是,我又同样领悟到这句话的另一个隐含意义: 「你的上限通常比你想象的要高」.
在大部分的时候,我们都没能发挥出自己全部的潜力。
现在觉得,人生的一大幸福并不在于你赚了多少钱,而是你在多大程度上发挥了自己的潜力。</p>
<p>如果人一生能够持续的以潜力的80%进行持续的输出,那我就觉得这样的人生就已经很满足了 …</p><p>人这一生最重要的是就是要认识自己。
找到自己合适的位置。</p>
<p>少年的时候,总是幻想自己将来要成就一番大的事业。
然而,一次又一次被现实打脸之后,终于恍然大悟,原来那些都是自己不切实际的幻想。
你并不是天赋异禀的,你只是千千万万个普通人而已。</p>
<p>很多时候,一旦看穿,其实反而心就静下来了。
不再那么的冲动,不再那么的自命清高,不再那么的眼高手低。</p>
<p>找到自己的位置,才是最重要的。
这个世界如此的广阔,总有一个专属于你的位置的。</p>
<p>很多人都羡慕马云、扎克伯格,我曾经也是。
然而,现在越来越觉得,这些人的能力和他们取得的成就是相互匹配的。
即使把我放在和他们相同的情景下面,我也不觉得自己能缔造阿里和Facebook.</p>
<p>自己的界限就在那里,何必强求?</p>
<p>曾经有句话特别流行: 「你的努力程度决定了你成就的下限,你的天赋决定了你的上限」
我曾经觉得这句话很颓,总觉得人生不应该设限。
结果,现实证明其实这句话是对的。</p>
<p>有些人,你是永远赶不上的。</p>
<p>但是,我又同样领悟到这句话的另一个隐含意义: 「你的上限通常比你想象的要高」.
在大部分的时候,我们都没能发挥出自己全部的潜力。
现在觉得,人生的一大幸福并不在于你赚了多少钱,而是你在多大程度上发挥了自己的潜力。</p>
<p>如果人一生能够持续的以潜力的80%进行持续的输出,那我就觉得这样的人生就已经很满足了。
如果,有那么一次「超水平」发挥,这一生也是值了。</p>
<p>重新审视现在的生活,我发现自己其实是很幸福的。</p>
<p>尽管博士收入仅供日常开销,但是能够每天持续的学习和产出,不断打磨自己,我就觉得这样的生活是很幸福的。
在有限范围内,将事情做到力所能及的最好,就已经是一件很幸福的事情。</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月7日写作并发表</li>
</ul>线性代数-向量空间2018-07-06T00:00:00-06:002018-07-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-06:/words/Linear-Algebra-Vector-Space/<p>本文将会从向量空间的定义开始,真正理解什么才是向量和向量空间。通过逻辑梳理,理解为什么向量可以表示成一组实数的形式。</p><p>最近乘着暑假,空闲时间比较多,花了两周的时间,重新复习了一下线性代数的一些基本概念。
这次的复习,我只关注于各种概念的直观意义及其之间的相互关系.
这个系列的文章全都没有相应的证明,
我只希望能够在直觉上增进对线性代数的理解,具体的各种定义和定理,就留给数学专业的人去解决好了。</p>
<p>本文将会从向量空间的定义开始,真正理解什么才是向量和向量空间。
通过逻辑梳理,理解为什么向量可以表示成一组实数的形式。</p>
<h1>向量空间的定义</h1>
<p>所谓的向量空间本质就是满足一定条件的集合,这个集合中的元素就被称为<strong>向量</strong>。
假设存在一个集合<span class="math">\(V\)</span>及其其中任意的三个元素<span class="math">\(u,v,w\)</span>, 如果这个集合满足如下条件<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,那么这个集合就被称为<strong>向量空间</strong>.</p>
<blockquote>
<ul>
<li>向量加法<span class="math">\(+\)</span>: 一个映射,将<span class="math">\(V\)</span>中的任意两个元素映射到<span class="math">\(V\)</span>中的另一个元素。<span class="math">\(V\times V\rightarrow V\)</span>. <span class="math">\(u+v\in V\)</span></li>
<li>标量乘法: 把一个标量<span class="math">\(a\)</span>和<span class="math">\(V\)</span>中的一个元素映射为<span class="math">\(V\)</span>中的另一个元素.<span class="math">\(R\times V\rightarrow V\)</span> <span class="math">\(av\in V\)</span>.</li>
<li>交换律: <span class="math">\(u+v=v+u\)</span>.</li>
<li>结合律: <span class="math">\((u+v)+w=w+(v+w)\)</span> 且 <span class="math">\((ab)v=a(bv)\)</span>, 其中<span class="math">\(a,b\in\mathbb{R}\)</span>.</li>
<li>分配率: <span class="math">\(a(u+v)=au+bv\)</span> 且 <span class="math">\((a+b)v=av+bv\)</span>,其中<span class="math">\(a,b\in\mathbb{R}\)</span>.</li>
<li>加法恒等: 集合<span class="math">\(V\)</span>中存在一个特殊的元素<span class="math">\(z\)</span>,对于<span class="math">\(V\)</span>中的任意元素,满足<span class="math">\(v+z=v\)</span>.
(我们给这个特殊的元素起了个名字,称为<span class="math">\(0\)</span>.)</li>
<li>加法逆元: 对于<span class="math">\(V\)</span>中的任意元素<span class="math">\(v\in V\)</span>, 都存在一个<span class="math">\(z\in V\)</span>,使得<span class="math">\(v+z=0\)</span>
(我们在这个集合上定义了减法)</li>
<li>乘法恒等: 存在一个特殊元素<span class="math">\(1\in\mathbb{R}\)</span>,满足<span class="math">\(1v=v\)</span>.</li>
</ul>
</blockquote>
<p>让我们仔细来看一下向量空间定义中的这些条件:
首先,前两个条件定义了集合上的两种运算,「加法」和「标量乘法」,接下去的三个条件要求这两个运算满足三种特性: 交换律、结合律和分配率,后面两个个条件又约束了向量空间中必须存在的特殊元素: <span class="math">\(0\)</span>和加法逆元。
实际上,正是因为加法逆元的存在,我们就在向量空间上定义了「减法」。
最后一个条件定义了一个特殊的标量<span class="math">\(1\)</span>.</p>
<p>所有满足这些条件的集合<span class="math">\(V\)</span>都可以被称为是「向量空间」.
需要注意的是,在向量空间的定义中,我们并没有说明这些元素是什么。
我们只是定义了这些元素之间的运算法则。
实际上,这些元素可以是任意的对象,可以是函数,可以是数字,可以是列表,只要这个集合满足向量空间定义中的条件。
<span class="math">\(\mathbb{R}^n\)</span>就是一个常见的向量空间,它的元素是一个长度为<span class="math">\(n\)</span>的列表,列表中的元素是<span class="math">\(\mathbb{R}\)</span>中的元素.</p>
<p>另外需要了解的是,关于子空间的定义。
一个向量空间<span class="math">\(V\)</span>的子空间<span class="math">\(U\)</span>定义为: <span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个子集,且<span class="math">\(U\)</span>也是一个向量空间。</p>
<p>好了,这些就是我们关于向量空间定义所需要了解的全部内容。
其实非常简单,所谓向量空间就<strong>是一个满足一些特殊条件的集合,集合元素可以是任意的对象。</strong></p>
<h1>向量的表示</h1>
<p>在定义了向量空间之后,我们接下去想要解决的问题就是如何表示一个向量?
根据向量空间的定义,向量空间中的元素「向量」可以是任意对象,可以是一个函数,可以是一个数字,可以是另外一种集合。
为了避免当我们说一个向量<span class="math">\(v\)</span>,每次都要说明这个向量是什么,我们需要一种表示方式来表示任意一个向量,而忽略其本体是什么。
因为,对于向量空间来说,我们关心的其实是向量之间的关系,而不是向量本身。(这也是为什么在向量空间的定义中,我们没有限制其中的元素是什么,而只是定义了元素之间的运算.)
那么,我们有没有办法用统一的方式来表示向量,而不用考虑这个向量本身代表的是什么呢?</p>
<p>答案当然是可以的(下面将是展现人类智慧伟大结晶的时刻!)。</p>
<p>但是在表示任意一种向量的时候,我们需要引入一些新的定义来帮助我们得到向量的表示方式。
对于一组向量序列<span class="math">\(v_1,\ldots,v_m\in V\)</span>, 我们定义它的「线性组合<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>」为</p>
<div class="math">$$
a_1v_1+\cdots+a_mv_m
$$</div>
<p>
其中<span class="math">\(a_1,\ldots,a_m\in\mathbb{R}\)</span>.</p>
<p>根据向量空间的定义,我们很容易知道,一组向量序列的线性组合必定也是同一个空间中的向量。
在此基础上,我们又可以给出「线性生成空间<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>」的定义:</p>
<blockquote>
<p>一个向量序列的所有线性组合组成的集合称为这个向量序列的线性生成空间。
我们用<span class="math">\(span(v_1,\ldots,v_m)\)</span>来表示<span class="math">\(v_1,\ldots,v_m\)</span>的线性生成空间。
<div class="math">$$
span(v_1,\ldots,v_m) = \{a_1v_1+\cdots+a_mv_m:a_1\cdots,a_m\in\mathbb{R}\}
$$</div>
</p>
</blockquote>
<p>容易验证,<span class="math">\(span(v_1,\ldots,v_m)\)</span>也是一个线性空间。
注意,此时我们从没说过线性组合是唯一的。
也就说,可能存在两组不同的<span class="math">\(a_1,\ldots,a_m\)</span>和<span class="math">\(b_1,\ldots,b_m\)</span>,使得<span class="math">\(v=a_1v_1+\cdots+a_mv_m\)</span> 和<span class="math">\(v=b_1v_1+\cdots+b_mv_m\)</span>同时成立。</p>
<p>现在我们来仔细看看线性组合,我们到底为什么要定义这个「线性组合」的概念。
根据线性组合和线性生成空间的定义,任何一个<span class="math">\(span(v_1,\ldots,v_m)\)</span>中的元素都可以被表示为<span class="math">\(v_1,\ldots,v_m\)</span>的一个线性组合。</p>
<p>那么,我们能不能做出这样的猜想,如果这个<span class="math">\(span(v_1,\ldots,v_m)\)</span>等于整个<span class="math">\(V\)</span>空间,而且每个<span class="math">\(v\in V\)</span>都有且只有一组<span class="math">\(a_1,\ldots,a_n\)</span>使得<span class="math">\(v=a_1v_1+\ldots+a_mv_m\)</span>成立,那么这个<span class="math">\(v\)</span>就能用<span class="math">\((a_1,\ldots,a_m)\)</span>这个序列来唯一表示了。
那么我们可以得出结论,<span class="math">\(v\)</span>能够被<span class="math">\((a_1,\ldots,a_m)\)</span>唯一表示需要满足两个条件:</p>
<ol>
<li><span class="math">\(span(a_1,\ldots,a_m)\)</span>等于整个向量空间<span class="math">\(V\)</span></li>
<li>有且只有一组<span class="math">\((a_1,\ldots,a_m)\)</span>使得<span class="math">\(v=a_1v_1+\ldots+a_mv_m\)</span>成立,其中<span class="math">\(v\in V\)</span>.</li>
</ol>
<p>进一步分析,这两个条件是由什么决定的?
仔细想想,我们就知道,这两个条件完全是由<span class="math">\(v_1,\ldots,v_m\)</span>这个序列决定的,如果选择得很巧,能够满足上面这两个条件,那么<span class="math">\(V\)</span>中的任意一个元素都能被唯一地表示为<span class="math">\(a_1,\ldots,a_m\)</span>这样的形式,而可以忽略这个元素本体是什么。</p>
<p>对于第一个条件来说,我们没有什么能做的。
而对于第二个条件来说,它有另外一种等价的形式,称为「线性无关<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup>」(是不是感到很熟悉?):</p>
<blockquote>
<p>对于一个向量序列<span class="math">\(v_1,\ldots,v_m\)</span>来说,如果能够使得<span class="math">\(a_1v_1+\cdots a_mv_m=0\)</span>成立的唯一选择是<span class="math">\(a_1=\cdots=a_m=0\)</span>,那么这组向量序列<span class="math">\(v_1,\ldots,v_m\)</span>就被称为线性无关。</p>
</blockquote>
<p>线性无关和上面提到的第二个条件是等价,相关的证明能在任何一本线性代数教材中找到证明。</p>
<p>好了,现在我们知道,要唯一表示一个向量,我们只需要找到满足下列两个条件的一组向量:</p>
<ol>
<li>这组向量的线性生成空间等于原来的向量空间</li>
<li>这组向量是线性无关的</li>
</ol>
<p>一旦找到这样一组的向量,我们就能够用一组实数序列<span class="math">\((a_1,\cdots,a_m)\)</span>来唯一表示空间中的一个向量。
这样的一组向量是如此的重要,我们把它称之为「基<sup id="fnref:6"><a class="footnote-ref" href="#fn:6">6</a></sup>」.</p>
<p>一旦为一个向量空间选定了一组基,那么这个向量空间中的任意一个元素都可以被唯一的表示 。
而这种唯一表示的形式就是我们熟知的坐标形式,比如<span class="math">\((1,2,3)\)</span>.
平时,我们提到向量的时候,通常都是默认向量空间的基是标准基。
比如,对于向量<span class="math">\((1,2,3)\)</span>来说,它的基就可以是<span class="math">\((1,0,0),(0,1,0),(0,0,1)\)</span>,因为</p>
<div class="math">$$
(1,2,3) = 1(1,0,0) + 2(0,1,0) + 3(0,0,1)
$$</div>
<p>但是,需要知道的是,不是所有的特征空间都能找到这样的基的。
能够找到基的特征空间称为「有限维向量空间」.
通常我们使用都是有限维向量空间。
其中,这组基的个数,就是被称为这个向量空间的维度。</p>
<h1>总结</h1>
<ol>
<li>所谓向量空间,其实就是满足一定条件的集合,集合中的元素可以是任意对象,可以是一个函数、一个数,甚至可以是一个集合。</li>
<li>向量空间的中的元素称为向量。</li>
<li>向量空间中的元素都可以用一组向量序列的线性组合来表示。</li>
<li>如果一组向量序列能够唯一地表示向量空间中的每一个元素,那么这组向量序列就被称为向量空间的「基」</li>
<li>一个向量空间存在很多组不同的基</li>
</ol>
<h1>参考资料</h1>
<ul>
<li><a href="https://www.amazon.com/Linear-Algebra-Right-Undergraduate-Mathematics/dp/3319110799/ref=sr_1_1?ie=UTF8&qid=1530890765&sr=8-1&keywords=Linear+algebra+done+right">Linear Algebra Done Right</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年7月6日写作并发表</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://www.amazon.com/Linear-Algebra-Right-Undergraduate-Mathematics/dp/3319110799/ref=sr_1_1?ie=UTF8&qid=1530890765&sr=8-1&keywords=Linear+algebra+done+right">Linear Algebra Done Right</a> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F%E7%A9%BA%E9%97%B4">向量空间 - 维基百科,自由的百科全书</a> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p><a href="https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E7%BB%84%E5%90%88">线性组合 - 维基百科,自由的百科全书</a> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p><a href="https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E7%94%9F%E6%88%90%E7%A9%BA%E9%97%B4">线性生成空间 - 维基百科,自由的百科全书</a> <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p><a href="https://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E7%84%A1%E9%97%9C">線性無關 - 维基百科,自由的百科全书</a> <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:6">
<p><a href="https://zh.wikipedia.org/wiki/%E5%9F%BA_(%E7%B7%9A%E6%80%A7%E4%BB%A3%E6%95%B8)">基 (線性代數) - 维基百科,自由的百科全书</a> <a class="footnote-backref" href="#fnref:6" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>性本善,性本恶2018-07-01T00:00:00-06:002018-07-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-07-01:/words/Good-and-Evil/<p>性本善,性本恶这是一个争论了几千年的问题了,至今没有一个统一的、确实的答案。
我想,这永远不会有一个明确的答案的。
因为,这其实是一个定义不清晰的问题。</p>
<p>首先,大自然中其实根本没有「善」与「恶」的区别,有的仅仅只是具体的存在。
是我们人类对于在自身的行为进行的划分,其中一种划分方式就是「善」与「恶」。
之所以会产生这样的划分,我想是因为合作的需要的吧。
能够形成集体相互合作是人类区别于其他动物的最大特点之一,也正是因为人类学会了合作,才能在众多生物中脱颖而出,成为食物链顶端的生物。
然而,形成集体合作的一个副产品之一就是,人类群体产生了某种行为准则,群体中的每一个个体都需要服从这样的约束,以便维持群体的存在。
因此,人类群体才会产生了「道德」,由「道德」又衍生出了「善」与「恶」的概念。
人类将一些行为定义为「善」,将另外一些行为定义为「恶」。
这并不是因为那些行为是好的,所以我们称之为「善」。
而是因为那么些行为对人类群体的帮助最大,人类将这些对整体帮助最大的行为定义为 …</p><p>性本善,性本恶这是一个争论了几千年的问题了,至今没有一个统一的、确实的答案。
我想,这永远不会有一个明确的答案的。
因为,这其实是一个定义不清晰的问题。</p>
<p>首先,大自然中其实根本没有「善」与「恶」的区别,有的仅仅只是具体的存在。
是我们人类对于在自身的行为进行的划分,其中一种划分方式就是「善」与「恶」。
之所以会产生这样的划分,我想是因为合作的需要的吧。
能够形成集体相互合作是人类区别于其他动物的最大特点之一,也正是因为人类学会了合作,才能在众多生物中脱颖而出,成为食物链顶端的生物。
然而,形成集体合作的一个副产品之一就是,人类群体产生了某种行为准则,群体中的每一个个体都需要服从这样的约束,以便维持群体的存在。
因此,人类群体才会产生了「道德」,由「道德」又衍生出了「善」与「恶」的概念。
人类将一些行为定义为「善」,将另外一些行为定义为「恶」。
这并不是因为那些行为是好的,所以我们称之为「善」。
而是因为那么些行为对人类群体的帮助最大,人类将这些对整体帮助最大的行为定义为「善」,鼓励每一个成员都要践行「善」。
那些对人类整体没有帮助,甚至是损害的事情,人类就将其定义为「恶」。
比如,善待老人,照顾老人是被认为是善的,不是说这么做就是好的,而是因为在过去的原始时代,年老的个体拥有更多的知识,虽然体力上不如年轻个体,但是能在智识上提点帮助年轻个体,起到了传承知识的作用。</p>
<p>其次,「善」与「恶」其实是属于道德范畴的,而所谓道德观念,其实是动态变化的,而不是一成不变的。
群体的组成方式几千年来都在发生变化。
比如,在过去的君主专制时代,所谓的道德就是要对君主愚忠,不管君主多么荒唐,臣下都不应该反对君主。
「善」与「恶」的定义也是在不断变化的。
假如你出生于一个原始的食人部落,没有接触过其他的社会形态,那么在你的意识中「吃人」就是一个非常日常的习俗。
在你意识中,根本不会觉得「吃人」是一件「恶」的事情。</p>
<p>另外,「善」与「恶」是永远无法协调的原因在于,<strong>每个人都是自私的</strong>。
之前,我说过,对群体利益最大的行为才会被定义为「善」,但是,我们要知道每一个个体其实都是自私的。
个体在做出决策的时候,往往优先考虑的是自己个体的利益,而不是群体的利益。
有时候,个体利益和群体利益是一致的,有时候却是不一致的。
我们应该追求的不是绝对的「善」,也不应该抛弃绝对的「恶」,最优的状态其实是要促成我们个人的利益和群体的利益保持一致,永远不要站到群体的对立面去。
因为,一旦你站到了群体的对立面去,不管你是什么样的人,你都会被定义为「恶」。</p>
<p>其实,如果硬要回答「性本善还是性本恶」的问题的话,我想我的回答是「人之初,性本自利」.</p>
<h1>更新日志</h1>
<ul>
<li>2018年7月1日写作并发表</li>
</ul>阅读自省2018-06-30T00:00:00-06:002018-06-30T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-06-30:/words/Refresh-Reading/<p>前两周再次阅读了几本关于如何阅读的书籍,在某种程度上再次刷新了自己的认知,让我明确地知道,自己在「阅读」这一件事上还有很多需要学习的。
具体阅读的书籍包括有:</p>
<ol>
<li>如何阅读一本书</li>
<li>深阅读</li>
<li>如何有效阅读一本书</li>
<li>如何阅读一本小说(正在阅读)</li>
<li>如何阅读一本文学书(将要阅读)</li>
</ol>
<p>这几本书分别论述了阅读过程中的不同方面:</p>
<ol>
<li>
<p>如何阅读一本书: 从抽象理论的方面分析讲解了该如何阅读一本书。
书中提出的建议和方法很具有借鉴价值,但是不一定具有执行性。
不过,书中提出针对每一本书都应该回答的四个问题:</p>
<ol>
<li>这本书在讲什么</li>
<li>作者在细部说了些什么</li>
<li>这本书说得有道理吗</li>
<li>这本书跟我有什么关系</li>
</ol>
<p>和四种阅读层次:</p>
<ol>
<li>基础阅读</li>
<li>检视阅读</li>
<li>分析阅读</li>
<li>主题阅读</li>
</ol>
<p>对于这四个问题和四个层次,我还是非常赞同的。
但是,具体执行的时候,总是觉得缺少了一些可操作性。
2. 深阅读: 回答了「为什么阅读」这个问题。这本书主要受众应该是还没有建立起阅读习惯的人,对我个人来说,这本书的借鉴意义不大。
3. 如何有效阅读一本书: 这是一本非常具有可操作性的书.
和「如何阅读一本书」相比,这本 …</p></li></ol><p>前两周再次阅读了几本关于如何阅读的书籍,在某种程度上再次刷新了自己的认知,让我明确地知道,自己在「阅读」这一件事上还有很多需要学习的。
具体阅读的书籍包括有:</p>
<ol>
<li>如何阅读一本书</li>
<li>深阅读</li>
<li>如何有效阅读一本书</li>
<li>如何阅读一本小说(正在阅读)</li>
<li>如何阅读一本文学书(将要阅读)</li>
</ol>
<p>这几本书分别论述了阅读过程中的不同方面:</p>
<ol>
<li>
<p>如何阅读一本书: 从抽象理论的方面分析讲解了该如何阅读一本书。
书中提出的建议和方法很具有借鉴价值,但是不一定具有执行性。
不过,书中提出针对每一本书都应该回答的四个问题:</p>
<ol>
<li>这本书在讲什么</li>
<li>作者在细部说了些什么</li>
<li>这本书说得有道理吗</li>
<li>这本书跟我有什么关系</li>
</ol>
<p>和四种阅读层次:</p>
<ol>
<li>基础阅读</li>
<li>检视阅读</li>
<li>分析阅读</li>
<li>主题阅读</li>
</ol>
<p>对于这四个问题和四个层次,我还是非常赞同的。
但是,具体执行的时候,总是觉得缺少了一些可操作性。
2. 深阅读: 回答了「为什么阅读」这个问题。这本书主要受众应该是还没有建立起阅读习惯的人,对我个人来说,这本书的借鉴意义不大。
3. 如何有效阅读一本书: 这是一本非常具有可操作性的书.
和「如何阅读一本书」相比,这本「如何高效阅读一本书」具有更强的可操作性。
书中没有大段的理论分析,而且实打实地讲解阅读过程中可以利用的技巧。
尤其是书中推荐的「葱鱿火锅」式的笔记方式,非常值得学习。
4. 如何阅读一本小说: 这是在具体分析「小说」这一体裁的书籍。
我暂时还没有看完,但是我已经觉得这本书将会我将来的阅读带来很大的帮助。
比如,书中分析了小说开篇的重要性,叙述角度的问题等等,很受启发。</p>
</li>
</ol>
<p>在阅读的过程中,我渐渐重构出了我自己的读书规划。</p>
<p>过去几年虽然养成了读书的计划,但是在很大程度上还是停留在「为了读书而读书」的程度上。
虽然也努力为每一本读过的书写作笔记,但是整体来说,读书的效率依然是十分低下的。
利用在<a href="http://zhouyichu.com/words/Attribution/">正确的归因</a>中提出的分析方法来分析,主要原因可以分为两种:</p>
<ol>
<li>系统不健全。我的读书系统其实并不是很健全,完全凭心情和喜好决定读什么书。虽然固定了每天的读书计划,但是固定了自己的读书时间仅仅只是第一步而已。后续的记录和笔记,一直欠缺一种合理的规划。导致有的书能够写出很好的笔记,有的书看完就丢了,只能写出一两句可有可无的总评。</li>
<li>具体执行力度不够。在读书过程中,很多时候都是不求甚解,为了赶进度,为了每年多读几本书,浑沦吞枣式的阅读,其实根本没有学到什么东西。</li>
</ol>
<p>过去的经验告诉我,想要一下子达到一个完美的状态是不可能的。
仅仅通过阅读上面这些书籍就想要改变、提高自己的读书状态,几乎是不可能的。
结合这些书籍中的内容,我还需要在切实的具体执行过程中,慢慢摸索出适合自己的读书方法。
好在我早已把坚持阅读作为终身的习惯。</p>
<h1>参考资料</h1>
<ol>
<li>如何阅读一本书</li>
<li>深阅读</li>
<li>如何有效阅读一本书</li>
<li>如何阅读一本小说(正在阅读)</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年6月30日写作并发表</li>
</ul>正确的归因2018-06-23T00:00:00-06:002018-06-23T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-06-23:/words/Attribution/<p>前几周在「<a href="https://www.igetget.com/">得到</a>」上学习「香帅的北大金融学课」的时候,香帅在课程中提到了风险可以划分为:</p>
<ol>
<li>系统风险</li>
<li>个人风险</li>
</ol>
<p>当时读到的时候,深以为然。
课程中还强调了,「正确的归因是解决问题的第一步」。</p>
<p>其实同样的道理,可以应用到生活的方方面面。
当面对挫折和失败的时候,我们首先需要做的就是总结导致失败的原因并加以分析。
基本原则是可以将原因分成两大类:</p>
<ol>
<li>系统原因: 做事的方法的问题。基本标准是任何一个人采用同样的方法都会导致相同的失败。</li>
<li>个人原因: 执行力的问题。一个执行比较强的人,采用同样的方法也许就能将这件事做成。</li>
</ol>
<p>在实际的生活中,一个问题的归因分析,也许并不是那么的界限分明的,但是基本的分类还是可以追寻的。
很多时候,我常常无法区别出其中的界限,从而导致虽然犯了错,却未必能够修正到正确的道路上来。</p>
<p>举一个例子。</p>
<p>现代生活节奏快,往往会在不知不觉陷入一种焦虑的死循环中。
为了摆脱这样的循环,我决定每天都写日记,将当天的事情记录下来。
然而,在很长一段时间内,我总是无法坚持每天都做到。
虽然每次都可以写出当天的感想,但是总是坚持不下来。
不是会忘记就是因为晚上工作太晚,直接放弃了写日记。
坚持写日记的目标算是失败了。
对于这次的失败,我一直觉得是自己的不够有毅力,自己不够努力。
然而 …</p><p>前几周在「<a href="https://www.igetget.com/">得到</a>」上学习「香帅的北大金融学课」的时候,香帅在课程中提到了风险可以划分为:</p>
<ol>
<li>系统风险</li>
<li>个人风险</li>
</ol>
<p>当时读到的时候,深以为然。
课程中还强调了,「正确的归因是解决问题的第一步」。</p>
<p>其实同样的道理,可以应用到生活的方方面面。
当面对挫折和失败的时候,我们首先需要做的就是总结导致失败的原因并加以分析。
基本原则是可以将原因分成两大类:</p>
<ol>
<li>系统原因: 做事的方法的问题。基本标准是任何一个人采用同样的方法都会导致相同的失败。</li>
<li>个人原因: 执行力的问题。一个执行比较强的人,采用同样的方法也许就能将这件事做成。</li>
</ol>
<p>在实际的生活中,一个问题的归因分析,也许并不是那么的界限分明的,但是基本的分类还是可以追寻的。
很多时候,我常常无法区别出其中的界限,从而导致虽然犯了错,却未必能够修正到正确的道路上来。</p>
<p>举一个例子。</p>
<p>现代生活节奏快,往往会在不知不觉陷入一种焦虑的死循环中。
为了摆脱这样的循环,我决定每天都写日记,将当天的事情记录下来。
然而,在很长一段时间内,我总是无法坚持每天都做到。
虽然每次都可以写出当天的感想,但是总是坚持不下来。
不是会忘记就是因为晚上工作太晚,直接放弃了写日记。
坚持写日记的目标算是失败了。
对于这次的失败,我一直觉得是自己的不够有毅力,自己不够努力。
然而,在挣扎了很久之后,我发现这其实只是一个方法系统的问题。
其实,想要坚持每天写日记,是一件非常简单的事情。
你只需要每天固定划分出一段时间,这段时间只用来写日记,其他事情什么都不做。
只要建立这样的系统,你想不写都不行。
这是一个典型的系统原因,但是之前却被我误认为是一个个人执行力的原因。</p>
<p>再举一个相反的例子。</p>
<p>在意识到写日记的问题之后,我将要同样的方法扩展到了其他的领域。
比如,我每天会有一段固定的时间进行阅读,阅读内容则是和专业工作无关的其他非小说书籍。
我一直觉得不能将自己囚禁在单一的某个领域。
但是,在执行这样的阅读习惯几年之后,我却发现,虽然阅读了不少的书,但真正深入内心,能够随时回忆出来的书籍却很少。
而这其中的问题则是执行力的问题。
在读书过程中,我很多时候都是不求甚解,为了赶进度,为了每年多读几本书,浑沦吞枣式的阅读,其实根本没有学到什么东西。
只是每年的自我总结上会多出基本已阅读书籍,仅仅只是为了让自己感觉良好。
这是一个典型的执行力的问题。
要改进这个问题,只需要增强自己的执行力。
比如增加读书笔记,每本书籍都要写作感想等等。</p>
<p>一旦找出原因,解决方案其实也就是水到渠成了。</p>
<h1>更新日志</h1>
<ul>
<li>2018年5月23日 写作并发表</li>
</ul>「如何阅读一本书」读书笔记2018-06-20T00:00:00-06:002018-06-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-06-20:/words/How-to-Read-A-Book-Again/<p>这是一篇被无人数了写了无数遍的关于一本被无数人阅读过的读书笔记。
然而,我还是重新发明一遍轮子。
为什么?
因为我想把这篇笔记作为实践这本书的一个练习。</p>
<p>首先要明确的,这篇笔记是关于「如何阅读一本书」这本书的。
这是一本初版于1940年(再版与1972年)的实用性书籍。
这是一本说明如何进行阅读的书籍。
读过这本书之后,你就会发现,其实阅读并不如你想象的那么简单。</p>
<h1>核心内容</h1>
<p>本书从指出<strong>阅读是一件主动的事情</strong>开始,首先给出了对于「阅读」这个行为的解释。
本书用一个打棒球的例子说明了作者与读者的关系:作者与读者的关系就像是投手和捕手的关系,球是作者发出的信息,而读者能接受多少则取决于作者的写作水平和读者的主动程度。
这是一个双方需要投入精力的过程。</p>
<p>作者在书中一再强调,只有做一个「主动」读者,才能完整读读懂读透一本书。
每读完一本书,我们都需要问自己以下四个问题(本篇笔记也正是在试图回答这四个问题):
1. 从整体上来说,这本书到底在谈些什么
2. 作者细部说了些什么,怎么说的
3. 这本书说得有道理吗?
4. <strong>这本书跟我有什么关系</strong></p>
<p>在这四个问题中,最后一个是最重要的。
因为,阅读一本书是为了提高自己 …</p><p>这是一篇被无人数了写了无数遍的关于一本被无数人阅读过的读书笔记。
然而,我还是重新发明一遍轮子。
为什么?
因为我想把这篇笔记作为实践这本书的一个练习。</p>
<p>首先要明确的,这篇笔记是关于「如何阅读一本书」这本书的。
这是一本初版于1940年(再版与1972年)的实用性书籍。
这是一本说明如何进行阅读的书籍。
读过这本书之后,你就会发现,其实阅读并不如你想象的那么简单。</p>
<h1>核心内容</h1>
<p>本书从指出<strong>阅读是一件主动的事情</strong>开始,首先给出了对于「阅读」这个行为的解释。
本书用一个打棒球的例子说明了作者与读者的关系:作者与读者的关系就像是投手和捕手的关系,球是作者发出的信息,而读者能接受多少则取决于作者的写作水平和读者的主动程度。
这是一个双方需要投入精力的过程。</p>
<p>作者在书中一再强调,只有做一个「主动」读者,才能完整读读懂读透一本书。
每读完一本书,我们都需要问自己以下四个问题(本篇笔记也正是在试图回答这四个问题):
1. 从整体上来说,这本书到底在谈些什么
2. 作者细部说了些什么,怎么说的
3. 这本书说得有道理吗?
4. <strong>这本书跟我有什么关系</strong></p>
<p>在这四个问题中,最后一个是最重要的。
因为,阅读一本书是为了提高自己,不能为了读书而读书。</p>
<p>在明确了<strong>阅读是一件主动的事情</strong>之后,作者们开始介绍他们对于阅读层次的分类,他们讲阅读过程分为四个不同的层次:</p>
<ol>
<li>基础阅读: 读懂每一个句子,摆脱文盲的状态。这是最基础的一个层级。</li>
<li>检视阅读: 一定时间内抓住书本的重点。能够在不逐字逐句阅读的情况下,说明这本书的主题。</li>
<li>分析阅读: 在无限的时间内,完整的阅读书籍。这是最详细的、全盘的阅读。但是,需要注意的是,不是每一本书都需要进行分析阅读的。</li>
<li>主题阅读: 针对某一个主题,同时阅读多本相关的书籍。</li>
</ol>
<h1>详细内容</h1>
<p>本书的详细内容就是关于对阅读的四个层级的展开解说。</p>
<h2>基础阅读</h2>
<p>这部分是最基本的,分为四种基本的能力:</p>
<ol>
<li>词义的认知能力</li>
<li>信息的查阅能力</li>
<li>读写的记录能力</li>
<li>对未知事物的好奇心</li>
</ol>
<h2>检视阅读</h2>
<p>检视阅读的目标是要在有限的时间内抓住一本书的中心思想。
分为两个步骤:</p>
<p><strong>步骤一: 有系统的略读</strong></p>
<p>通过阅读一本书的书名页、序言、目录、索引页、作者介绍和各章的摘要说明来快速掌握这本所谈的主题是什么。</p>
<p><strong>步骤二: 粗浅的阅读</strong></p>
<p>快速概览一遍全书,忽略不懂的地方,快速通读一遍。</p>
<p>这里需要注意的是:</p>
<ol>
<li>不是所有书籍都需要相同的阅读速度</li>
<li>不是所有的章节都需要相同的阅读速度</li>
</ol>
<h2>分析阅读</h2>
<p>分析阅读是一种最彻底的阅读方法,也是成本最大一种阅读方式。
不是所有书籍都需要使用分析阅读,只有遇到真正的经典书籍时,才需要使用分析阅读的方法。</p>
<p>作者在这个层次中总结了三个阶段共11个规则来指导分析阅读:</p>
<p><strong>阶段一: 整理内容大纲</strong></p>
<ol>
<li>规则一: 必须知道自己在阅读哪一类的书籍,实用还是理论?</li>
<li>规则二: 使用单一的句子或几句话来叙述整本书的内容</li>
<li>规则三: 将书中的重要篇章列举出来,说明它们是如何按照顺序组成一个整体的架构</li>
<li>规则四: 找出作者想要解决的问题</li>
<li>规则五: 找出重要的单字,与作者达成共识</li>
</ol>
<p><strong>阶段二: 诠释这本书的内容</strong></p>
<ol>
<li>规则六: 将一本书中最重要的句子圈出来,找出其中的主旨</li>
<li>规则七: 从相关文句的关联中,设法架构出一本书的基本论述。</li>
<li>规则八: 确定哪些问题已经被解决,哪些还没有被解决</li>
</ol>
<p><strong>阶段三: 评论一本书</strong></p>
<ol>
<li>规则九: 除非你已经完成大纲架构,也能诠释整本书了,否则不要轻易批评</li>
<li>规则十: 当你不同意作者观点时,要理性的表达自己,不要无理的辩驳或争论。</li>
<li>规则十一: 尊重知识与个人观点的不同,在做出任何判断之前,都要找出理论依据</li>
</ol>
<h2>主题阅读</h2>
<p>主题阅读是一种针对某一个主题同时阅读多本书的阅读方法。
这种方法很像是在做研究工作。</p>
<p>主要分为两个阶段:</p>
<p><strong>第一阶段</strong></p>
<ol>
<li>建立一个书单</li>
<li>把书单中书整体检视阅读一遍,确定哪些与主题有关,并建立起关于主题的清楚概念</li>
</ol>
<p><strong>第二阶段</strong></p>
<ol>
<li>找到每一本书中的相关章节。需要注意的是,此时的重心是主题而不是单本书籍,你不需要阅读整本书籍。</li>
<li>带引作者与你达成共识。理清不同作者之间使用的词义,创立一套中立的词汇。</li>
<li>厘清问题,整理出需要被回答的问题,寻找不同作者的答案</li>
<li>界定议题,针对同一问题的不同答案,对答案进行分类整理。界定主要和次要的议题</li>
<li>分析讨论</li>
</ol>
<h2>其他</h2>
<p>在充分说明阅读的四种不同层次之后,书中又对不同读物的阅读方法进行详细的说明。
这些不同的阅读方法都是基于上述阅读的四个层次的,只是局部细节的规则有些小差异。</p>
<p>最后,作者强调了几个关于阅读的重点:
1. 阅读只是提高自己的第一步,不能为了阅读而阅读
2. 让你觉得难以阅读的书,才是能够让你有所提高的书
3. 世界上需要反复阅读,需要使用分析阅读的书籍其实并不多,需要学会区分经典书籍。</p>
<h1>心得</h1>
<p>这本书事无巨细地将整个阅读过程的心态、技巧都进行了讲解,对我帮助很大。
其中对我帮助最大的观点是,一定要保证自己充分理解了一本书之后,才能对这本进行评论。
并且一定要区别出真正的知识和个人观点的不同之处。</p>
<p>这本书在一定程度上改变了我的阅读习惯,加深了我对阅读这件事的理解。
在之后的生活中,我将逐步应用这些规则,并且尝试将其改造成适合我自己的阅读习惯。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://book.douban.com/subject/1013208/">如何阅读一本书</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年6月19日 写作初稿</li>
<li>2018年6月20日 润色并发表</li>
</ul>关于二级混沌的思考2018-06-17T11:56:55-06:002018-06-17T11:56:55-06:00Flyawaytag:zhouyichu.com,2018-06-17:/words/More-Second-Order-Chaos/<p>在<a href="http://zhouyichu.com/words/Second-Order-Chaos/">Second-Order-Chaos</a> 文章中,我提到了「二级混沌系统」的概念。
在这篇文章中,我继续将这个想法进行了推广。</p>
<h1>两个不同的世界</h1>
<p>我们常说的「世界」其实是可以解读成两种含义的:</p>
<ol>
<li>自然世界</li>
<li>人类社会</li>
</ol>
<p>在很多语境下面,我们并不会对这两种语义进行区分。
然而,在我考虑到人类社会其实是一个「二级混沌系统」的时候,我意识到,这个两个「世界」的含义其实有着很大的不同。</p>
<p>自然世界,顾名思义是指除了人类社会以外的整个自然环境,是一种客观存在,小到一朵花,大到整个宇宙。
对于人类来说,这就是一个典型的一级混沌系统。
人类只是作为一个观察者,在一旁观察着这个世界。</p>
<p>然而,人类社会就要复杂得多。它是一个「二级混沌系统」,人类自身就是系统的一部分。
人类做出的任何预测,都会对自身的系统产生影响。</p>
<p>虽然这两个「世界」有着很大的不同,但它们也有相同点: 都是无比复杂的系统。</p>
<h1>为什么是「二级混沌」</h1>
<p>为什么人类社会是一个「二级混沌」呢 …</p><p>在<a href="http://zhouyichu.com/words/Second-Order-Chaos/">Second-Order-Chaos</a> 文章中,我提到了「二级混沌系统」的概念。
在这篇文章中,我继续将这个想法进行了推广。</p>
<h1>两个不同的世界</h1>
<p>我们常说的「世界」其实是可以解读成两种含义的:</p>
<ol>
<li>自然世界</li>
<li>人类社会</li>
</ol>
<p>在很多语境下面,我们并不会对这两种语义进行区分。
然而,在我考虑到人类社会其实是一个「二级混沌系统」的时候,我意识到,这个两个「世界」的含义其实有着很大的不同。</p>
<p>自然世界,顾名思义是指除了人类社会以外的整个自然环境,是一种客观存在,小到一朵花,大到整个宇宙。
对于人类来说,这就是一个典型的一级混沌系统。
人类只是作为一个观察者,在一旁观察着这个世界。</p>
<p>然而,人类社会就要复杂得多。它是一个「二级混沌系统」,人类自身就是系统的一部分。
人类做出的任何预测,都会对自身的系统产生影响。</p>
<p>虽然这两个「世界」有着很大的不同,但它们也有相同点: 都是无比复杂的系统。</p>
<h1>为什么是「二级混沌」</h1>
<p>为什么人类社会是一个「二级混沌」呢?</p>
<p>我认为主要的原因有两个:</p>
<ol>
<li>每个人都是有独立自主的意识的。</li>
<li>每个人都是系统的一部分。</li>
</ol>
<p>大自然中的各种事物都是没有自我意识的,只是机械地按照某种规则在运行,即使这种规则会将其毁灭。
比如,如果乌云知道在下雨之后,自己就会烟消云散的话,它还会不遗余力的下雨吗?如果太阳知道自己拼命燃烧终将会归于静寂,它还会不遗余力的发光发热吗?
系统中的个体如果没有自我意识,那么这个系统一定就是一个「一级混沌」。</p>
<p>人类社会是一个「二级混沌」的另外一个重要原因就是每个人都是系统的一部分。
正因为人类并不是「自然世界」的一部分,「自然世界」作为一个静止的对象不断接受人类的探索,人类才能去理解自然,利用规则去预测现象。
如果人类总结出的规则会影响大自然的规则的话,人类永远无法发展出现代科技。</p>
<h1>「二级混沌」真的不可知?</h1>
<p>「二级混沌」真的是一个无法预测,不可知的系统吗?
我不知道答案。</p>
<p>要对一个「二级系统」进行预测,难点在于需要把预测结果也作为影响因素考虑进去。
假设我们有一个数学模型能够对整个世界进行建模分析,再假设这个模型是完美的,它能够根据当前世界的状态预测未来的事件。</p>
<p>对于「一级混沌」来说,这样的模型只需要考虑当前系统的状态,结合已知的某些规律,就能对未来进行预测。只要规则是正确的,那么预测结果就一定是正确的。</p>
<p>而对于「二级混沌」来说,只依靠系统的状态和规则,是无法进行<strong>准确</strong>预测的,因为你的预测结果会对系统产生影响。
如果真有能够预测「二级混沌」的模型的话,那么它的输入就至少应该是当前系统的状态、正确的规则、以及此次预测的结果。
然而,在进行预测之前我们是无法知道预测结果的。
所以,我想这很有可能将会是一个不断迭代的过程,直到模型的预测输入和模型的预测结果相一致,达到平衡之后,所作出的预测结果才是正确的。
因为这样的预测过程已经把预测结果可能产生的影响考虑进去了。</p>
<p><img alt="只有当P1和P0相等时,系统才达到平衡,此时做出的预测才是正确的" src="http://zhouyichu.com/images/model.001.jpeg"/></p>
<h1>更新日志</h1>
<ul>
<li>2018年6月17日写作并发表</li>
</ul>二级混沌系统2018-06-16T00:00:00-06:002018-06-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-06-16:/words/Second-Order-Chaos/<p>我一直很喜欢阅读历史书籍,大学时代的时候我一直信奉「历史能看得多远,未来就能看得有多远」。
然而,随着年岁的增长和阅读的深入,我越来越觉得这句话就是在扯淡。</p>
<p>其实根本不存在什么历史的必然性,所谓历史的必然性,一切都是事后诸葛亮。
活在当时历史中的人,其实正是最看不清历史的人。</p>
<ul>
<li>如果能够预测到秦国将会一统天下,为什么还会发生长平之战?</li>
<li>如果能够预测到二世而亡,为什么始皇帝还会严刑峻法?</li>
<li>如果能够预测到朱元璋将会一统天下,为什么百姓还会爱戴张士诚?</li>
<li>如果能预测到日本必败无疑,为什么汪精卫还会投靠日本?</li>
</ul>
<p>所以,在后人看来确定无疑的历史趋势,在当时的人看来却只是雾里看花。</p>
<p>为什么呢?</p>
<p>因为正如「人类简史」中的提到的,历史是一个二级混沌系统。
一级混沌系统是指「预测结果不会对系统产生影响」,比如我们预测明天的天气。
我们预测明天会下雨,这个论断对于明天会不会下雨不会产生影响。
明天的天气是怎样就会怎样。
然而,二级混沌系统却要复杂得多,它的「预测结果会对系统产生影响」,比如我们有一种机器或算法能够预测未来十年是否会发生革命。
一旦机器预测未来十年内将会发生重大的社会动乱,那么政府一定会提前采取相应的措施,减少社会矛盾,将动乱消灭于无形。
而能够消灭动乱的原因却是因为我们预测到了会发生动乱。
预测的结果会对系统的结果产生影响。</p>
<p>其实何止是历史,只要是有人参与的系统,都是二级混沌系统,比如金融市场,比如社会变革 …</p><p>我一直很喜欢阅读历史书籍,大学时代的时候我一直信奉「历史能看得多远,未来就能看得有多远」。
然而,随着年岁的增长和阅读的深入,我越来越觉得这句话就是在扯淡。</p>
<p>其实根本不存在什么历史的必然性,所谓历史的必然性,一切都是事后诸葛亮。
活在当时历史中的人,其实正是最看不清历史的人。</p>
<ul>
<li>如果能够预测到秦国将会一统天下,为什么还会发生长平之战?</li>
<li>如果能够预测到二世而亡,为什么始皇帝还会严刑峻法?</li>
<li>如果能够预测到朱元璋将会一统天下,为什么百姓还会爱戴张士诚?</li>
<li>如果能预测到日本必败无疑,为什么汪精卫还会投靠日本?</li>
</ul>
<p>所以,在后人看来确定无疑的历史趋势,在当时的人看来却只是雾里看花。</p>
<p>为什么呢?</p>
<p>因为正如「人类简史」中的提到的,历史是一个二级混沌系统。
一级混沌系统是指「预测结果不会对系统产生影响」,比如我们预测明天的天气。
我们预测明天会下雨,这个论断对于明天会不会下雨不会产生影响。
明天的天气是怎样就会怎样。
然而,二级混沌系统却要复杂得多,它的「预测结果会对系统产生影响」,比如我们有一种机器或算法能够预测未来十年是否会发生革命。
一旦机器预测未来十年内将会发生重大的社会动乱,那么政府一定会提前采取相应的措施,减少社会矛盾,将动乱消灭于无形。
而能够消灭动乱的原因却是因为我们预测到了会发生动乱。
预测的结果会对系统的结果产生影响。</p>
<p>其实何止是历史,只要是有人参与的系统,都是二级混沌系统,比如金融市场,比如社会变革。</p>
<p>所以从这个角度来说,我们是无法预测历史的未来的。
因为我们本身就是历史的一部分,一旦做出预测,这个预测结果会对系统产生影响,从而导致预测结果的偏差。
这也就是我为什么觉得用机器学习的方式预测股市并不是一个十分靠谱的方法。
因为股市本质就是一个二级混沌系统,任何一个预测结果都会改变这个系统的状态。</p>
<p>一旦明白了有人参与的系统是一个二级混沌系统,我们就能解释很多事情了。</p>
<ul>
<li>正是因为人类社会是一个二级混沌系统,所以未来充满了未知。</li>
<li>正是因为人类社会是一个二级混沌系统,社会科学往往无法做出准确的预测,常常会发生黑天鹅事件。</li>
<li>正是因为大自然是一个一级混沌系统,所以一旦掌握了正确的方法,现代科学可以飞速发展,因为一切人类总结的物理规则不会对大自然的运行系统产生影响。</li>
</ul>
<p>由此进一步,我们会得出这样一个结论: 未来不可知。
某种程度上,我想这是正确的。
但是,在我们日常的生活中,还是需要根据自己的预测来决定自己的行为。
而这样的策略往往是有效的。
为什么?
因为你的预测只是你自己的预测,虽然会对整体系统产生一点点的影响,但是这个影响可以小到忽略不计了。
作为60亿分之一的人,你的预测是不会大幅改变系统状态的。</p>
<h1>更新日志</h1>
<ul>
<li>2018年6月16日写作并发表</li>
</ul>世界还是那个世界2018-04-29T00:00:00-06:002018-04-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-04-29:/words/One-Hundred-Year/<p>100年了,这个世界还是那个世界,但中国已经不是那个中国</p><p>我在<a href="http://zhouyichu.com/words/Morality/"> 上一篇博文</a> 中提到过,这个世界是没有其实并不存在什么道德和不道德,一切都是相互平衡的制约的结果。
在一个没有制约能力的生态下,一切都是丛林法则。一切都是丛林法则.</p>
<p><img alt="叙利亚驻联合国代表巴沙尔·贾法里" src="http://zhouyichu.com/images/Syria.webp"/></p>
<p>这段时间,网上被上面这张照片给刷屏了。
疲惫、不屈一切都在这一张照片里了。
这让我想起了99年前的巴黎和会,各国重新分配一战之后的利益,中国由于弱小,由于贫穷,即使身为战胜国,却依然被其他强国压迫,没有得到应有的权益。</p>
<p><img alt="巴黎和会" src="http://zhouyichu.com/images/China.webp"/></p>
<p>巴沙尔的痛苦,叙利亚的遭遇,身为中国人是能够深切体会的。</p>
<p>100年过去了,世界还是那个世界。
幸好中国已经不是100年前的中国了。
我们这一代人应该感到庆幸,我们需要庆幸的不是我们生活一个没有战争的时代,我们该庆幸的是我们生活在一个没有战争的国家。</p>
<p>尤瓦尔·赫拉利在「<a href="https://book.douban.com/subject/26943171/">未来简史</a>」中曾经提到过,21世纪的人类已经消除了曾经长期威胁人类生存、发展的瘟疫、饥荒和战争,由战争引起的死亡已经远远低于全球车祸导致的死亡。
当时阅读的时候,觉得他分析很有道理。
现在人类面对的问题是永生不老、幸福快乐和成为具有“神性”的人类。
然而,此次的叙利亚事件让我明白了,这个世界不是没有战争,我们只是恰巧生活在一个没有战争的国家。
确实,交通事故引起的死亡可能已经超越战争带来的死亡,但是战争带来的后续影响远远大于一次交通事故。
一次战争又会培养多少仇恨的种子,又会造成多少起所谓的「恐怖袭击」?</p>
<p>过去和现在都在不断教育着我们这样一个道理: <strong>尊重是靠实力赢来的,而不是靠别人的施舍</strong>.
在实力不对等的情况下,没人会尊重你。
这无关乎你的历史,你的辈分,你的出身。
这个教训,是中国人用100年的屈辱交换得到的。
一代一代的中国人都会牢记这个道理。
这样的道理,不仅仅是国家之间,也适用于个人之间。
说到底,这就是人性。</p>
<h1>参考资料</h1>
<ul>
<li><a href="https://book.douban.com/subject/26943171/">未来简史</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年4月29日写作并发表</li>
</ul>道德准则2018-04-26T00:00:00-06:002018-04-26T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-04-26:/words/Morality/<p>2018年4月14日,美英法三国对叙利亚发射了100多枚导弹,进行了所谓的「精确打击」。
看着那一张张断壁残垣的照片,再次让我意识到了,人类社会的本质其实依然是弱肉强食的丛林法则。</p>
<p>我不知道叙利亚政府是否使用了化学武器,我也不知道美英法背后是否还有其他的利益关系,我看到的只是,三个国家向另外一个国家的领土上发射了100多枚导弹,并且被轰炸的国家无法做出任何反击。
这就像是三个人联合起来直接揍了另外一个人,而被揍的人毫无还手之力。
这其实就是典型的丛林法则,你弱,挨打了只能自己忍着。</p>
<p>人类繁衍至今几千年来,发展出了所谓道德规范来约束人的行为。
然而,真的有所谓道德的事情和不道德事情吗?
我认为其实是没有的。</p>
<p>在远古时代,在人类学会使用工具之前,人类其实就是一种动物。
看看现在的野生动物就知道了,没有什么道德,有的就是简单粗暴的丛林法则。
因为那个时代的人类和今天的那些野生动物,不同个体之间的力量是不平衡的。
弱小的个体是不可能战胜强大的个体的,兔子怎么着也不可能打倒狮子;斗争失败的猴王只能离开猴群,而它的后代都会被新的猴王杀死。
在一个个体之间没有约束、没有平衡的世界里,弱肉强食,丛林法则就是道德。</p>
<p>但是,当人类学会使用工具之后,人类发现,在使用了工具之后弱小的个体也可以杀死、战胜强大的个体。
比如一个弱小的个体能够使用石头直接砸死一个强壮的个体,你再强壮也没用。
在学会使用工具之后,强壮个体对弱小个体压倒性的优势消失了,他再也不敢随便欺负弱小的个体了;新的猴王再也不敢杀死旧猴王的后代了,因为旧猴王可以利用工具随时随地地杀死新猴王 …</p><p>2018年4月14日,美英法三国对叙利亚发射了100多枚导弹,进行了所谓的「精确打击」。
看着那一张张断壁残垣的照片,再次让我意识到了,人类社会的本质其实依然是弱肉强食的丛林法则。</p>
<p>我不知道叙利亚政府是否使用了化学武器,我也不知道美英法背后是否还有其他的利益关系,我看到的只是,三个国家向另外一个国家的领土上发射了100多枚导弹,并且被轰炸的国家无法做出任何反击。
这就像是三个人联合起来直接揍了另外一个人,而被揍的人毫无还手之力。
这其实就是典型的丛林法则,你弱,挨打了只能自己忍着。</p>
<p>人类繁衍至今几千年来,发展出了所谓道德规范来约束人的行为。
然而,真的有所谓道德的事情和不道德事情吗?
我认为其实是没有的。</p>
<p>在远古时代,在人类学会使用工具之前,人类其实就是一种动物。
看看现在的野生动物就知道了,没有什么道德,有的就是简单粗暴的丛林法则。
因为那个时代的人类和今天的那些野生动物,不同个体之间的力量是不平衡的。
弱小的个体是不可能战胜强大的个体的,兔子怎么着也不可能打倒狮子;斗争失败的猴王只能离开猴群,而它的后代都会被新的猴王杀死。
在一个个体之间没有约束、没有平衡的世界里,弱肉强食,丛林法则就是道德。</p>
<p>但是,当人类学会使用工具之后,人类发现,在使用了工具之后弱小的个体也可以杀死、战胜强大的个体。
比如一个弱小的个体能够使用石头直接砸死一个强壮的个体,你再强壮也没用。
在学会使用工具之后,强壮个体对弱小个体压倒性的优势消失了,他再也不敢随便欺负弱小的个体了;新的猴王再也不敢杀死旧猴王的后代了,因为旧猴王可以利用工具随时随地地杀死新猴王。
因此,丛林法则不再适合已经掌握使用工具的人类社会。
个体之间形成了一种战略平衡,强大的个体再也不敢无限制欺负、践踏弱小的个体,因为弱小的个体有了能够战胜强壮个体的方法。
此时,道德就出现了。
道德的出现规范了人类的行为,而其本质就是建立了一种新的社会秩序,一种代替了丛林法则的秩序。</p>
<p>想想现在的美英法和叙利亚,其实就是丛林法则的实例。
对于叙利亚来说,美英法是无限强大的存在,美英法知道叙利亚是没有大规模杀伤性武器的,因此它才敢于对它发动武装攻击。
想想朝鲜吧,美英法明确知道朝鲜是有大规模杀伤性武器的,因此他们其实不敢直接对朝鲜发动武装攻击的。
美英法对叙利亚是非平衡状态,而对朝鲜却是平衡状态。</p>
<p>所以,我们现在拥有稳定的社会是因为每个个体之间存在着战略平衡,再强壮的个体也不可能百分百躲过一个弱小的人的谋杀。
现代社会的道德准在保护着社会上的任何一个人。
但是,就像几万年前人类学会工具时一样,如果这种个体之间的平衡再次被打破会怎么样?
答案其实在历史上出现过了很多次,远的有八国联军、七七事变,近的阿富汗战争、伊拉克战争,以及这次的美英法「精确打击」.</p>
<h1>更新日志</h1>
<ul>
<li>2018年4月25日 写作初稿</li>
<li>2018年4月26日 发表</li>
</ul>原则2018-04-15T00:00:00-06:002018-04-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-04-15:/words/Principle/<p>以原则为中心的生活方式,让生活更加有条理。</p><p>随着年龄的增长,我发现我们需要处理的事情越来越多,我们想要的东西也越来越多。
比如,我们需要处理很多生活中的琐事: 日常做饭、车子保养、税务处理等等,而同时我们想要的也变得更加丰富: 健康的身体、更多的收入、更大的影响力。
我们面对的已经不再是我们儿时那样单纯的世界。
离开学校之后<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,我发现我们需要处理的信息量是已经的好几倍,我们的精力一瞬间就被淹没在各种各样的事情中。
而且,这种趋势只会变得越来越严重。
尤其是来到美国之后,一切都要靠自己来处理.</p>
<p>面对如此的状态,如果还是按照以前那种兵来将挡水来土掩地方式处理事情,那我们可能就永远限于生活的琐碎中,处于一种死循环中而不可自拔。
为了避免自己同样陷入生活的琐碎,我也一直在思考各种各样的应对方式。
我思考的结论是,我们必须形成自己的行为模式,或者说是行为原则。
按照原则行事,而不会按照自己的心情行事。
这也是「高效人士的七个习惯」和最近很火的「原则」两本书中非常强调的一点。
虽然我很早就知道这个原理,但是我也是最近才慢慢有所体悟。
我就是这样,只有切身体会到了,才能真正理解。</p>
<p>那么,有哪些原则值得我们去实践呢?
我个人总结有如下几条:</p>
<ol>
<li>日常工具的钱不能省</li>
</ol>
<p>很多人为了省几块钱而在网上到处找各种免费的替代方案,就像曾经的我一样。
而事实告诉我,这样的方式反而会使我们损失更多。
因为,免费的东西往往是不可靠的,它没有完整的支持系统,即使它出了问题,你也无法追究责任,反而要花更多的时间去寻找其他的替代品。
几年前我还在国内的时候,为了科学上网,组内的小伙伴也折腾了各种不同的方式,寻找国外的免费代理,然后需要配置一堆的东西,而我直接买了一个国外的代理的服务,简单粗暴但很高效。
小伙伴的免费服务每隔几个月都会被扫荡,他们又不得不花费更多的时间继续寻找其他替代品。
而我买的服务却一直很稳定,一直用到了我肉身翻墙。
就这一项上,我就就节约了不少的时间。</p>
<ol>
<li>掌控时间的分配</li>
</ol>
<p>我曾经一度痴迷于时间的管理的各种方法,什么四象限工作法、番茄工作法等等。
虽然有一定可操作性,但是总觉得还是缺了一些什么。
我最新的感悟是,我需要把工作时间和生活时间进行区分。
我这样做的原因是,我发现尽管时间的流速是平均的,但是它的权重或质量却是不平均的。
比如,对我来说早上的几个小时是我最为高效的事情,而当到了下午4、5点的时候,我整体的状态就不行了,很难集中注意力思考一些有深度的问题。
因此,针对这样的情况,我们可以重新分配自己的工作负载,把质量最高的时间花费在最重要的事情上。
举例来说,我通常会把自己的健身时间安排在下午4点-6点之间,因为这段时间我的大脑是最混乱的时候,无法进行深入的思考,因此我选择一些更需要体力而不是脑力的事情。</p>
<ol>
<li>分权重,单进程</li>
</ol>
<p>就像我所说的,随着年龄的增长,我们需要处理的事情越来越多,我们需要一个合理的体系来帮助我们处理各种事情。
其中,有两点我体会最深: 1. 分权重 2. 单进程
我们需要对日常中的各种事情进行权重分配,不需要严格的用数字来区分,这样反而会增加自己的工作负载,只需要一个大概的划分就可以了。
举例来说,我现在主要任务还是做好科研发论文,因此我白天的主要工作都是集中科研这件事上面的。
但是,我还有很多的其他事情,比如各种课程作业、TA工作等等,这些「非头等大事」的事情,我都是安排在晚上的。这样既能保证工作顺利完成,也能保证不影响到最重要的事情。</p>
<p>「单进程」是指尽量避免同时多任务工作,因为我们的大脑是单进程系统。你永远在同一时间想着两件不同的事情。
要知道,我们的大脑切换上下文环境也是需要很大成本的,刘未鹏曾经在「暗时间」中指出,对于一项任务来说,人脑至少需要5-10分钟的时间才能完成具体的上下文切换。
如果进行频繁的多任务工作,那么大部分时间都会损失在上下文切换上,真正的工作进度却会变得很少。</p>
<ol>
<li>做好总结和规划</li>
</ol>
<p>总结和规划也是非常的重要,我认为他们的作用就像是在你的生活插入一个又一个锚点,我可以清晰的看到自己的轨迹和未来的航向,不至于让自己迷失在生活的黑洞中。</p>
<h1>更新日志</h1>
<ul>
<li>2018年4月15日 写作并发表</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>严格来说,我还没有完全离开学校。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>保持积极的心态2018-04-08T00:00:00-06:002018-04-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-04-08:/words/Positive/<p>如何调整自己的情绪状态在现代生活中变得越来越重要,本文结合自己的亲身实践,总结了自己的几种调整自己情绪的方法。</p><p>最近几周,连续发生几件令人很不爽的事情,一定程度上影响了日常的心情。
但是,事后进行回顾的事后,惊讶的发现自己其实处理得还算不错,虽然心情很坏,但是并没有因为坏心情而导致情况的进一步恶化。
保持乐观是非常重要的,尤其是需要在不如意的时候保持乐观的态度,这样才能尽快将生活带入正常的节奏。
结合亲身实践,我想整理一下自己保持乐观的几个方法。</p>
<h1>元认知</h1>
<p>「<a href="https://en.wikipedia.org/wiki/Metacognition">元认知</a>」是一个我早就知道但是直到最近几年才深有感悟的一个概念。
简单来说,它就是一种认知能力,一种认知你自己的能力,一种能够判断自己状态的能力。
比如, 当处于情绪低谷的时候,我们考虑事情常常会带有负面色彩,此时做出的决定都是属于非理性的。
而元认知能力强的人,他会知道自己此时处于情绪很差的时候,他会明白他此时任何的想法都是不够理性,不够客观的,就不会在这样的状态做出任何决定。</p>
<p>明白自己的状态,懂得自己的思维,这是元认知的精髓。</p>
<p>当我处于情绪低谷的时候,我就会常常提醒自己,现在这种情绪很差的状态只是暂时的,现在的思维方式是不够客观的。
此时,我最需要做的就是保持日常的生活节奏,千万不要被坏情绪带偏方向。</p>
<h1>从全局看待事物</h1>
<p>要学会从全局看待一件事,比如令你情绪很差的这件事,在一周后还会存在吗?一个月呢?
这么一想,往往能够让人有一种豁达的感觉。
生活中很多的事情,其实都是一些琐碎的、局部的事情,不要让这些事情影响你整体的生活。
我上周手机坏了、车后门坏了、后来又发生了一起小车祸,各种坏运气纷至沓来,让我都猝不及防。
但是,我开始从全局看待这些事情,这些其实都是局部的小事情,并不会影响我的正常生活。
手机坏了,只需要花一个小时去Apple Store维修一下就好了;后车门坏了,只需要抽出一个周末送去4S店维修一下就可以了;小车祸所有相关的事情都交给保险公司去处理就可以了,我不需要参与任何事情。
所以,这样算下来,除了我的心情之外,这些事情其实并没有带给我什么实质性的伤害。</p>
<h1>横向对比</h1>
<p>我曾经在<a href="http://zhouyichu.com/words/What-do-We-Purse/">我们应该追求什么</a>中说过,真正的幸福不应该来源于对比,但处于坏情绪的时候,对比也许会让你更快的恢复过来。
每当我处于坏情绪的时候,我总是会告诉自己,这个世界上比我自己悲惨的人多的是,你这些鸡毛蒜皮的小事,对于那些真正处于悲惨中的人们来说已经是属于幸福的了。
因此,我不需要太过纠结当下具体的事情,想想我所拥有的,其实我已经很幸福了。</p>
<h1>冥想</h1>
<p>从今年年初开始,我就在尝试使用冥想来调整自己的情绪状态。
到目前为止,总体反馈还是很不错的。
当冥想的时候,我会不断去体会那种负面的情绪,去感受它,去拥抱它,当冥想结束之后,我就会彻底远离这种情绪。
这听起来十分玄学,不太符合我理工科学生的身份。
但是,冥想却是真的有效的!
不去亲身体会一下,我想这是很难向别人解释的。</p>
<h1>更新日志</h1>
<ul>
<li>2018年4月8日写作并发表</li>
</ul>Reading-List-2018-March2018-04-01T00:00:00-06:002018-04-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-04-01:/reading-list/Reading-List-2018-March/<h1>必须找到阿历克斯</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E7%9A%AE%E8%80%B6%C2%B7%E5%8B%92%E6%A2%85%E7%89%B9">皮耶·勒梅特</a></p>
<p>短小的悬疑类小说,情节多次翻转。
但是,情节翻转依靠的不是细致的细节安排,而是未透露的信息。
和一些同类型的作品还是差了很多。</p>
<h1>牧羊少年的奇幻之旅</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BF%9D%E7%BE%85%C2%B7%E7%A7%91%E7%88%BE%E8%B3%80">保罗·科尔贺</a></p>
<p>童话般的故事框架,让人不禁想起了「小王子」。
这个牧羊少年的旅程教会了人们看穿生活的本质: 去寻找自己的内心的宝藏。
这本书传递了很多,有远方,有诗歌,有苟且,可以引起很多的共鸣。
书中的有很多的句子都犹如甘露,我特意摘录下来:</p>
<blockquote>
<ul>
<li>幸福的秘密就在于,既要看到世上的奇珍异宝,又要永远不忘记勺里的那两滴油.</li>
<li>当你想要某件东西的时候,整个宇宙会合力助你实现愿望.</li>
<li>害怕遭受痛苦比遭受痛苦本身还要糟糕。</li>
</ul>
</blockquote>
<h1>大黄蜂奇航</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E7%A6%8F%E8%8E%B1%E7%89%B9">肯·福莱特</a></p>
<p>肯福莱特的作品一向是质量的保证。
这部作品也不例外,紧张的情节让人欲罢不能。
然而,和他的「世纪三部曲」相比,还是觉得有一些不足。
最大的缺陷在于其草草的收尾,最后的结局结束得太仓促了,有一些虎头蛇尾的感觉。</p>
<h1>针眼</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E7%A6%8F%E8%8E%B1%E7%89%B9">肯 …</a></p><h1>必须找到阿历克斯</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E7%9A%AE%E8%80%B6%C2%B7%E5%8B%92%E6%A2%85%E7%89%B9">皮耶·勒梅特</a></p>
<p>短小的悬疑类小说,情节多次翻转。
但是,情节翻转依靠的不是细致的细节安排,而是未透露的信息。
和一些同类型的作品还是差了很多。</p>
<h1>牧羊少年的奇幻之旅</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BF%9D%E7%BE%85%C2%B7%E7%A7%91%E7%88%BE%E8%B3%80">保罗·科尔贺</a></p>
<p>童话般的故事框架,让人不禁想起了「小王子」。
这个牧羊少年的旅程教会了人们看穿生活的本质: 去寻找自己的内心的宝藏。
这本书传递了很多,有远方,有诗歌,有苟且,可以引起很多的共鸣。
书中的有很多的句子都犹如甘露,我特意摘录下来:</p>
<blockquote>
<ul>
<li>幸福的秘密就在于,既要看到世上的奇珍异宝,又要永远不忘记勺里的那两滴油.</li>
<li>当你想要某件东西的时候,整个宇宙会合力助你实现愿望.</li>
<li>害怕遭受痛苦比遭受痛苦本身还要糟糕。</li>
</ul>
</blockquote>
<h1>大黄蜂奇航</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E7%A6%8F%E8%8E%B1%E7%89%B9">肯·福莱特</a></p>
<p>肯福莱特的作品一向是质量的保证。
这部作品也不例外,紧张的情节让人欲罢不能。
然而,和他的「世纪三部曲」相比,还是觉得有一些不足。
最大的缺陷在于其草草的收尾,最后的结局结束得太仓促了,有一些虎头蛇尾的感觉。</p>
<h1>针眼</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E7%A6%8F%E8%8E%B1%E7%89%B9">肯·福莱特</a></p>
<p>这是肯福莱特的另外一部间谍作品,但是这部作品缺乏了一种吸引人的品质。
书中的角色的塑造没有其他几部小说那么精彩,能么贴近人心。
后来去查了一下,果然发现这部「针眼」是福莱特在1970年代的作品,而「大黄蜂奇航」和「世纪三部曲」都是新世纪的作品。
很明显,那时候的福莱特作品还不能算作是佳作。</p>
<h1>教父</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E9%A6%AC%E9%87%8C%E5%A5%A7%C2%B7%E6%99%AE%E4%BD%90">马里奥·普佐</a></p>
<p>花了三天的时间,又重温了一遍这本经典的小说。
教父的形象已经深入人心,每隔一段时间我都要拿出来重温一下。</p>
<h1>中国历代政治得失</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E9%8C%A2%E7%A9%86">钱穆</a></p>
<p>大师的作品,历数了我国5个王朝的政治制度变迁。
虽然文字有些晦涩,但是还是能窥见大师的功底的。</p>
<p><img alt="politics" src="http://zhouyichu.com/images/politics.png"/></p>
<h1>精力管理</h1>
<p>作者: 洛尔</p>
<p>这是我第二次读这本书,几年前第一次读的时候,没能完全读下去。
这次是第二次的尝试,虽然完全读完了,但是能学习到的干货其实不是很多。
书中的内容太过理论化,对我的日常生活来说可操作性不大。
权当理论学习吧。</p>
<p><img alt="Energy" src="http://zhouyichu.com/images/energy.png"/></p>
<h1>更新日志</h1>我们应该追求什么2018-03-27T00:00:00-06:002018-03-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2018-03-27:/words/What-do-We-Purse/<p>最近被几条新闻给刷新了三观,我发现我也越来越不懂这个世界了。
以下列举一下我无法理解的几个事件:</p>
<ol>
<li><a href="https://www.wenxuecity.com/news/2017/11/19/6752947_print.html" title="这个德国胖子一年拍卖了上百个妹子的初夜">这个德国胖子一年拍卖了上百个妹子的初夜</a></li>
<li>网络直播,一群人可以无聊到看另外一个人吃饭,还愿意花钱打赏。主播收入已经突破了我的想。</li>
<li><a href="https://zhuanlan.zhihu.com/p/24832117" title="街头翘屁股卖烤串的光膀大叔,收入分分钟超过写字楼985高级白领">街头翘屁股卖烤串的光膀大叔,收入分分钟超过写字楼985高级白领</a></li>
</ol>
<p>我也自己分析了一下,为什么这些新闻和事件会让我觉得不舒服(我并没有说这些现象不合理或不道德,我接受这些事实,但是难以理解)。
我之所以感到不舒服,是因为这些事件的本质打破了我原来对「努力 --> 高收入」的信仰。
以上列举的各个事情,都不需要太多的教育、不需要太多的付出,获得的金钱就远远大于大多数人。</p>
<p>然而,在经历一段时间的愤世嫉俗之后,我意识到,是我把这个世界想得太简单了。</p>
<p>首先,「努力 --> 高收入」这个论断的正确性就是存疑的。
这是我们从小学校、父母灌输给我们的,这样的论断其实并不正确。
「努力」是一个非常模糊的概念,努力读书考出好成绩是一种努力;每天工作到半夜,进货运货也是一种努力;努力健身美妆,把自己卖个好价钱,谁说这不是一种努力呢?
面对如此众多的「努力」方式,如果还是执拗于只有「脑力劳动」才是努力,那岂不是太狭隘了 …</p><p>最近被几条新闻给刷新了三观,我发现我也越来越不懂这个世界了。
以下列举一下我无法理解的几个事件:</p>
<ol>
<li><a href="https://www.wenxuecity.com/news/2017/11/19/6752947_print.html" title="这个德国胖子一年拍卖了上百个妹子的初夜">这个德国胖子一年拍卖了上百个妹子的初夜</a></li>
<li>网络直播,一群人可以无聊到看另外一个人吃饭,还愿意花钱打赏。主播收入已经突破了我的想。</li>
<li><a href="https://zhuanlan.zhihu.com/p/24832117" title="街头翘屁股卖烤串的光膀大叔,收入分分钟超过写字楼985高级白领">街头翘屁股卖烤串的光膀大叔,收入分分钟超过写字楼985高级白领</a></li>
</ol>
<p>我也自己分析了一下,为什么这些新闻和事件会让我觉得不舒服(我并没有说这些现象不合理或不道德,我接受这些事实,但是难以理解)。
我之所以感到不舒服,是因为这些事件的本质打破了我原来对「努力 --> 高收入」的信仰。
以上列举的各个事情,都不需要太多的教育、不需要太多的付出,获得的金钱就远远大于大多数人。</p>
<p>然而,在经历一段时间的愤世嫉俗之后,我意识到,是我把这个世界想得太简单了。</p>
<p>首先,「努力 --> 高收入」这个论断的正确性就是存疑的。
这是我们从小学校、父母灌输给我们的,这样的论断其实并不正确。
「努力」是一个非常模糊的概念,努力读书考出好成绩是一种努力;每天工作到半夜,进货运货也是一种努力;努力健身美妆,把自己卖个好价钱,谁说这不是一种努力呢?
面对如此众多的「努力」方式,如果还是执拗于只有「脑力劳动」才是努力,那岂不是太狭隘了?
所以,为了让自己活得更加轻松,我需要放弃从小受到的思维桎梏,不要让自己身上读书人的矜持继续发酵下去。
在这个世界上,脑力劳动不是唯一的路。
要慢慢学会接受并理解所有存在的事实。</p>
<p>其次,我对这个世界的衡量标准还是处于单一的维度。
只以收入为唯一的衡量标准。
早有心理学研究表明,资产超过一定阈值之后,资产的多少几乎和幸福感无关了。
不应该把自己的幸福感建立在对比上面,因为,基于对比的幸福感很快就会被比你更加优秀、更加有富有的人所打破。
这个世界是多个维度,甚至可以说是有无数个维度的。
不要只聚焦于一个维度。
就像李笑来在「通向财富自由之路」中所说的,不需要再某一个维度上做到前1%,而是要在多个维度上做到前10%。 </p>
<p>因此,想要追求幸福的人生,不应该只把自己局限在一个维度上,不应该把幸福感建立在对比上。
很多成功学的书籍告诉我们: <strong>真正的幸福感来源于自我价值的实现。</strong>
虽然我认为这是句话是正确的,但是这其实是一句没有任何实际意义的句子。
不具有可操作性。
重新翻译一下这句话,其实就可以总结成:「制定一个目前的你难以企及的目标,然后通过自身的努力和学习最终达成这个目标」。
至于制定什么样的目标,其实真的是无所谓。
可以是成为奥运冠军,可以是做到财富自由,可以是做出重大科研贡献。
真正重要的是在这个过程中,自我的不断成长和学习。</p>
<h1>更新日志</h1>
<ul>
<li>2018年3月26日写作初稿</li>
<li>2018年3月27日润色修改并发表</li>
</ul>短跑还是长跑2018-03-11T00:00:00-07:002018-03-11T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-03-11:/words/Long-or-Short-distance/<p>每年的1-2月份都是机器学习(ML)会议和自然语言处理(NLP)会议的集中爆发期。
作为一个从业人员,这段时间是每年的冲刺时间。
今年虽然也努力冲刺了,但是依然失败了。
和我一起入学的小伙伴们,已经有两位投出了论文,而其中一位已经被accepted了。
同样的时间,同样的起点,不禁让我开始怀疑起自己的人生策略了。</p>
<p>我一直是奉行「人生是一场长跑」的处事哲学的,在平时是不会死命逼自己的,按照正常的步伐一点点往前走。
我无法接受一天15-16个小时科研的生活方式。
我一直觉得我的人生不是只由科研组成的,我也没打算把我整个人生投身到科研领域中去。
我每天固定时间工作,固定时间健身,固定时间读书,力争做到各方面都平衡,而不是只把时间投入到一个点上去。</p>
<p>然而,事实狠狠地了扇了我一巴掌。
那位中论文的小伙伴是一位拼命三郎式的人物,经常会熬夜到凌晨干活。
就是在这样的情况下,她投出并中了论文;而我却因为实验的问题,在最后一刻放弃了。
无情的事实,让我开始反思我的人生策略是存在问题。</p>
<p>无疑,长达七八十年的人生,肯定是一场长跑。
然而,如何完成这样一段旅程,却是有着不同的选择。
在2016年罗胖子的跨年晚上,罗胖子提出了点线模型,人生就是由一个一个点组成的,别人看到都是一个一个人生的关键点,而不会有人关注点与点之间的连线。
如果把人生看成是 …</p><p>每年的1-2月份都是机器学习(ML)会议和自然语言处理(NLP)会议的集中爆发期。
作为一个从业人员,这段时间是每年的冲刺时间。
今年虽然也努力冲刺了,但是依然失败了。
和我一起入学的小伙伴们,已经有两位投出了论文,而其中一位已经被accepted了。
同样的时间,同样的起点,不禁让我开始怀疑起自己的人生策略了。</p>
<p>我一直是奉行「人生是一场长跑」的处事哲学的,在平时是不会死命逼自己的,按照正常的步伐一点点往前走。
我无法接受一天15-16个小时科研的生活方式。
我一直觉得我的人生不是只由科研组成的,我也没打算把我整个人生投身到科研领域中去。
我每天固定时间工作,固定时间健身,固定时间读书,力争做到各方面都平衡,而不是只把时间投入到一个点上去。</p>
<p>然而,事实狠狠地了扇了我一巴掌。
那位中论文的小伙伴是一位拼命三郎式的人物,经常会熬夜到凌晨干活。
就是在这样的情况下,她投出并中了论文;而我却因为实验的问题,在最后一刻放弃了。
无情的事实,让我开始反思我的人生策略是存在问题。</p>
<p>无疑,长达七八十年的人生,肯定是一场长跑。
然而,如何完成这样一段旅程,却是有着不同的选择。
在2016年罗胖子的跨年晚上,罗胖子提出了点线模型,人生就是由一个一个点组成的,别人看到都是一个一个人生的关键点,而不会有人关注点与点之间的连线。
如果把人生看成是「一系列的短跑冲刺」,那么刚好和所谓的点线模型相切合。
但是,永远处于打鸡血的状态也是不可能的。
而且长期处于高压的状态显然不是一个健康的状态。
那位拼命三郎的小伙伴的身体就经常会有些小问题。</p>
<p>长跑策略虽然可以保证各方面齐头并进,不用忍受高压,但可能会永远陷入平稳的工作中,失去冲刺的激情,永远无法逾越立在身前的屏障;而短跑冲刺的策略却能在短期内快速取得成就,翻越一道道屏障,但是却把自己的精力固定到一个小点上,高压的生活也会损害自己的健康。
既然两种策略都是由问题的,也许我们可以合并这两种策略。
平时慢速长跑状态,踏踏实实做好积累;在机会来临的时候,调用爆发力,进入短跑冲刺模式,快速抓住机遇,进入下一个阶段。
这才是慢慢人生路应该有的态度。</p>
<p>套用伟人的话: 「战略上是长跑,但战术上却是短跑冲刺。」</p>
<h1>更新日志</h1>
<ul>
<li>2018年3月11日写作初稿并发表</li>
</ul>结构化2018-03-04T00:00:00-07:002018-03-04T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-03-04:/words/Structure/<p>结构化的世界</p><p>本学期正在学习「Structural Prediction」的课程,尽管这门课程是一门机器学习的课程,并不是一门讨论人生社会的课程,但是它提出的结构化思想,让我对这个世界有了新的认识。</p>
<h1>结构</h1>
<p>我们这个世界除了最基本的一个一个个体以外,还有各种不同的联系,个体与个体之间的联系才是构成我们这个世界的关键。</p>
<ul>
<li>一堆文字随机的摆放在一起并不能传达任何信息,只有按照一定的顺序排列(结构),才能被人所理解。</li>
<li>一堆胡乱堆砌的砖头并不能成为房子,只有按照一定的结构构建,才能成为一套房子。</li>
<li>不断增加劳动力的数量,并不能无限提高效率,只有按照一定的结构让人们分工合作,才能提高生产效率,才能形成我们现在看到的社会。</li>
</ul>
<p>结构在我们的日常生活中无处不在。
这个世界不是简单的堆砌,任何事物之间都有着联系,这些事物和联系构成了我们的世界。
简单的堆砌资源,并不能带来本质性的变化,合理的组合、运用资源才能产生其应有的威力。
组合运用的过程,就是构建结构的过程。
小到一段代码,大到人生规划,无一不是具有结构的。</p>
<h1>对我们的启示</h1>
<p>人生也是需要结构的,而认清结构需要你能够跳出自己的思维模式,从一个全局的角度审视自己的人生。
这说着容易,其实有时候是很困难的,因为我们本是就是结构的一部分。
苏轼就曾经在诗中写道: 「不知庐山真面目 只缘生在此山中」</p>
<p>如何才能认清自己处于结构的哪一部分呢?
我认为可行的方法有:</p>
<ol>
<li>阅读,大量的阅读别人的著作,打开自己的思维。不管是自己接受的,还是不接受的思想,都要深入阅读和思考。
这样才能看清整个世界,而不是只看到你想要看到的。</li>
<li>思考和规划。要对自己的人生进行规划,要清楚的认识到自己现在所处于人生的哪一个阶段。持续不断的思考,构建自己的架构。这是一个永无止尽的过程,因为整个世界都在飞速的变化,你需要及时调整自己的结构。</li>
</ol>
<p>结构化的思维模式,告诉我们:</p>
<ol>
<li>站在高处才能看到结构的全体,要有全局化的思想,不要因为一时的失意而颓废。
比如你正值青年但创业失败,请不要灰心,这只是你的第一次的尝试,以后还有无数次的尝试在等着你;又或者你刚刚开始进入一个新的领域,做事总是碰壁,请不要灰心,这只是进入一个新领域的阵痛,当你熟悉行业之后,一切都会过去的。</li>
<li>做任何事情,先构建其结构框架,然而从最简单的入手,慢慢构架出整体。
比如你需要写一个复杂的大型系统,你可以从最简单的输入输出模块开始,因为这些模块是最基本的也是最简单的,写作的过程你自然会开始慢慢思考如何才能构建出大系统。</li>
<li>面对一个复杂问题,不要害怕,只要慢慢地一步一步将复杂问题分解成一个一个可处理的小问题,分步解决。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年3月4日写作初稿并发表</li>
</ul>我想要的人生2018-03-04T00:00:00-07:002018-03-04T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-03-04:/words/Target-of-Life/<p>我想要的人生, 做一个事业有成的丰满博士</p><p>人这一生总要有一个目标,一个可以维系一生的目标。
如何为制定出这样一个目标,却是是一个相当困难的事情。
在制定的过程,需要注意到以下几点:</p>
<ol>
<li>这个目标必须反映出你内心的真实渴望,而不只是家人、社会期望你去做的事情。
要学会倾听自己内心的声音。</li>
<li>这个目标不能是基于比较的,因为比较带来的愉悦感只是暂时的,总有人能超越你。
一旦被人超越,你的快乐就会变成痛苦。</li>
<li>这个目标是不应该是一个可以被量化的懂目标,而应该是一种状态,一种生活的状态。
因为,一个可以被量化的目标,总有一天会被达到。当你的达成你的目标的那一瞬间,确实会带给你无限的快乐。可是,之后呢?生活照样会继续,人生还要继续。如果只是追求一瞬间的辉煌,那你的后半生将会无所事事。</li>
</ol>
<p>结合以上这几点,我对自己的人生做出了如下的目标:</p>
<p><strong>做一个事业有成的丰满博士</strong>.</p>
<h1>事业有成</h1>
<p>事业有成,通俗的说法就是要做到「<strong>财务自由</strong>」。
我想这也是现代绝大多数年轻人的目标吧。
我追求的财务自由,是定义成: 「在不降低生活质量的情况下,不需要出卖自己的时间来维持生存」.
这个定义里有两个关键点:</p>
<ol>
<li>
<p>不降低生活质量</p>
<p>如果你选择天天宅居,每顿一碗泡面,那么大多数人都可以做到财务自由了。
但是,大多数都没有选择这样的生活,因为这样的生活质量实在太差,一个正常人是无法忍受的。
我们需要娱乐,我们需要旅游,我还需要结婚生子。所有的这一切都需要足够的经济水平来支撑。
所以,我需要的不仅仅是「财务自由」,而是「高质量的财务自由」</p>
</li>
<li>
<p>不出卖自己的时间</p>
<p>不需要出卖自己的时间意味着什么?意味着我有<strong>选择的权利</strong>。
今天状态不好,我可以选择只是用来读书;今天状态好,我可以100%的全身心工作。
没有人告诉我今天必须完成哪些工作,明天需要完成哪些工作。
一切都由我自己决定。</p>
</li>
</ol>
<p>对我来说,财务自由其实不能完全算是人生目标,它充其量最多也只能算是一个手段,而不是真正的目标。
真正的目标是下面两点。</p>
<h1>丰满</h1>
<p>我想成为一个丰满的人。
我比较喜欢这样一个比喻:</p>
<blockquote>
<p>人生就像是一个娱乐场,你买票入场,如果不把所有的项目都玩一遍的话,岂不是浪费了整个票价?</p>
</blockquote>
<p>这个票价就是我们的生命。
人生只有一次,不把所有的项目都玩一遍,岂不是太可惜了?</p>
<p>这里的「项目」所指是非常广泛的,它可以是:</p>
<ul>
<li>一种启人心智的思想</li>
<li>一种人生经历</li>
<li>一个充满历史感的名胜古迹</li>
<li>一个集天地造化的自然景观</li>
</ul>
<p>总之,所有能丰富我人生阅历的事物,我都希望能体验一下。
回想当年孔子所说的「朝闻道,夕死可矣」,我想要的,就是这种状态。</p>
<p>说的更加具体一些,所谓想成为一个丰满的人,其实就是想成为一个终生学习的人。
当我学习到一种新思想时,它能带给我极大愉悦。</p>
<h1>博士</h1>
<p>除了享受这个世界带给我的美好,我也想要为这个世界留下一些东西。
当我们来到这个世界的时候,不曾带来些什么;当我们离开这个世界的时候,我也无法带走任何的东西;我们唯一能做的是可以留下一些东西。
我希望我这一生能为人类的知识库贡献自己的力量.
为人类的知识增添一点点自己的贡献,这是我最大的目标了。
这也是我读博的原因之一。</p>
<p>我之所以把这样项内容作为最大的目标之一,并不是因为我有多么的高尚。
而是因为,这样做我能获得极大的成就感。
在大多数人庸庸碌碌过完这一生的时候,我能够骄傲地说,我为人类进一步理解自然,理解宇宙做出了自己的贡献。
尽管这个贡献可以微小到不易察觉,但我思想的一部分已经成为了人类共同的知识之一了。
我在这个世界上留下了一些东西。</p>
<h1>更新日志</h1>
<ul>
<li>2018年3月4日完成初稿并发表。</li>
</ul>2018年2月书单2018-02-25T00:00:00-07:002018-02-25T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-02-25:/reading-list/Reading-List-2018-February/<p>2018年2月书单</p><h1>The Telomere Effect: A Revolutionary Approach to Living Younger Healthier Longer</h1>
<p>作者: Dr. Elizabeth Blackburn and Dr. Elissa Epel</p>
<p>细胞的分裂次数是固定的,分裂次数是由端粒长度所控制.
整个身体总是处于不断更新的状态。</p>
<p>端粒酶是一个可以修复端粒长度的物质,但是人体自身只有极少量。
但是,太多的端粒酶也会导致细胞能够不断分裂,最终形成癌细胞。</p>
<p>日常的很多生活习惯都会影响端粒的长度:</p>
<ol>
<li>长期压力</li>
<li>内脏脂肪</li>
</ol>
<p>延长端粒的好习惯:</p>
<ol>
<li>每天7小时的睡眠</li>
<li>有氧运动(书中介绍无氧运动并没有延长端粒的作用)</li>
<li>低糖、底GI的食物</li>
<li>保持愉悦的心情</li>
</ol>
<p>书中的一些摘录:</p>
<blockquote>
<ul>
<li>Genes load the gun, an environment pulls the trigger.</li>
<li>Aging can be defined as the cell's "progressive functional impairment and reduced capacity to repond appropriately to environmental stimuli and injurires."</li>
<li>Telomerase can slow, prevent or even reverse the shortening of telomeres that comes with cell division.</li>
<li>Too much telomerase in the wrong cells at the wrong time, cells will not stop dividing, these cells are called "cancer".</li>
<li>The key is to well regulate the action of telomerase on telomeres--in the right cell and at the right times, because only that will keep telomeres and us healthy.</li>
</ul>
</blockquote>
<p>读书过程做的脑图:</p>
<p><img alt="telomere" src="http://zhouyichu.com/images/telomere.png"/></p>
<h1>Meditation for Beginers</h1>
<p>作者: Jack Kornfield Ph.D</p>
<p>这是一本我见过的最简短的讲述冥想的书籍。
写得通俗易懂,非常容易上手。
全书一共讲述了8种冥想的方法:</p>
<ol>
<li>Connecting with breath</li>
<li>Working with sensations in the body</li>
<li>Working with feelings and emotions</li>
<li>Witnessing your thoughts</li>
<li>Forgiveness meditation</li>
<li>Lovingkindness</li>
<li>An eating meditation</li>
<li>A walking meditation</li>
</ol>
<p>我之前也看过一些冥想类的书籍,但是都是中文的,那些书籍看得我云山雾绕的,绕来绕去总是会绕到玄幻上面去。
我很不喜欢。
没想到,英文版的书籍中,剔除了那些神神道道的东西,言简意赅的讲解了冥想的步骤和作用。
很适合我的口味。
今后开始要好好练习了。</p>
<p>附上脑图:</p>
<p><img alt="Meditation" src="http://zhouyichu.com/images/Meditation.png"/></p>
<h1>罗马人的故事3: 胜者的迷思</h1>
<p>作者: 野盐七生</p>
<p>这是「罗马人的故事」这个大系列的第三本,主要讲述了罗马共和国在三次布匿战争之后的国内政治纷争。
就像是历史规律,外部矛盾解决之后,接踵而来的就是内部矛盾了。
国内新旧势力的相互更替,即使是在罗马这种共和体制下,依然是不可避免的。</p>
<h1>罗马人的故事4: 凯撒时代(上)</h1>
<p>作者: 野盐七生</p>
<p>看了三本「罗马人的故事」之后,终于迎来了凯撒时代。
本书主要从凯撒的出生讲述到凯撒征服高卢得胜归来为止。
年轻时代的凯撒就像是一个流氓,到处借债,到处留情。
让我联想到了中国历史上著名的流氓皇帝--刘邦。</p>
<h1>人类灭绝</h1>
<p>作者: 高野和明</p>
<p>在我记忆里,这是我阅读的第一本日本科幻小说。
总体感觉良好,科幻的成分还是比较经得起推敲的。
书中对人类的进化方向给出了大胆的猜测。
同时,书中的结论也很悲观,新人类最终会像是智人灭绝尼安德特人一样灭绝智人。</p>
<p>书中作者对人类行为作出了一些反思,但总觉得还不能算是深刻, 仅仅是罗列了一些事实,总觉没有触及到更深处的东西。</p>
<h1>更新日志</h1>跨界2018-02-25T00:00:00-07:002018-02-25T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-02-25:/words/Transboundary/<h1>跨界</h1>
<p>近几年来跨界这个概念非常流行,我在很多场合都见到别人提到这个概念。
然而,到底什么才是跨界,仅仅只是从一个领域切换到另外一个领域吗?
如果是,那么所有该领域的基础知识都要重新学习,怎么可能做出比已经沉浸在该领域多年的人还要好的成绩呢?
然而,很多事例都告诉我们,那些跨界的人才,不仅做到了跨界,还比其他人做的更加优秀。
我想,这里面一定有些更加深层的原因,而不是简简单单的「跨界」。</p>
<p>为了真正理解「跨界」的意义,我重新思考了我对能力的理解。
我对「能力」这个抽象概念进行了重新建模,以下是我的「能力」模型。</p>
<h1>基本技能</h1>
<p>在我的认知中,一个人的基本能力可以分为四种不同的能力:</p>
<ol>
<li>逻辑思维能力: 这是人类认知整个世界的基本能力,现代科学就建筑在逻辑之上的。</li>
<li>表达能力: 一个人该如何表达自己的观点,如何说服别人,这也是一个非常重要的基本能力。</li>
<li>领导能力: 如何激励、管理一群人朝着同一个目标前进的能力。最基本的应用其实就是要管好自己,如果鞭策、鼓励、管理自己是领导能力的最基本体现。</li>
<li>学习能力: 我想这是最重要的一个能力,这是人类智慧的体现。如果高效的学习,决定了你的上界在哪 …</li></ol><h1>跨界</h1>
<p>近几年来跨界这个概念非常流行,我在很多场合都见到别人提到这个概念。
然而,到底什么才是跨界,仅仅只是从一个领域切换到另外一个领域吗?
如果是,那么所有该领域的基础知识都要重新学习,怎么可能做出比已经沉浸在该领域多年的人还要好的成绩呢?
然而,很多事例都告诉我们,那些跨界的人才,不仅做到了跨界,还比其他人做的更加优秀。
我想,这里面一定有些更加深层的原因,而不是简简单单的「跨界」。</p>
<p>为了真正理解「跨界」的意义,我重新思考了我对能力的理解。
我对「能力」这个抽象概念进行了重新建模,以下是我的「能力」模型。</p>
<h1>基本技能</h1>
<p>在我的认知中,一个人的基本能力可以分为四种不同的能力:</p>
<ol>
<li>逻辑思维能力: 这是人类认知整个世界的基本能力,现代科学就建筑在逻辑之上的。</li>
<li>表达能力: 一个人该如何表达自己的观点,如何说服别人,这也是一个非常重要的基本能力。</li>
<li>领导能力: 如何激励、管理一群人朝着同一个目标前进的能力。最基本的应用其实就是要管好自己,如果鞭策、鼓励、管理自己是领导能力的最基本体现。</li>
<li>学习能力: 我想这是最重要的一个能力,这是人类智慧的体现。如果高效的学习,决定了你的上界在哪。</li>
</ol>
<p>以上的四种能力和具体的领域毫无关系,这是一个人应该掌握的最基本的技能。
要做成一件事,必须调用以上四种能力。
比如,你要写一个小程序,你需要具有最基本的逻辑思维能力,设计出合理的算法;然后需要调用领导能力,管理好自己的时间,做出的合理的时间分配来从事这项工作;在写程序过程中,你还需要足够的学习能力去查阅各种相关资料,包括各种API、领域知识等;最后,你还需要一定的表达能力,为你的程序写出文档,做出demo。
我想很多人都没有意识到,当他们完成一件工作的时候,他们已经调用了自身如此多的能力。</p>
<p>我认为这四种能力是密不可分的,只有侧重点的不同,而没有一种能力完全为0的情况。
比如,善于表达能力的人,很可能会从事媒体工作;学习能力和逻辑思维能力强的,很可能会成为一个学者;领导能力突出的人,很可能会成为CEO。
然而,即使是媒体工作者,也需要具有逻辑思维能力;即使是只是渊博的学者,也需要足够的表达能力来表达自己的研究成果;即使是优秀的CEO,也需要表达能力来表达自己的观点。
这四种能力,缺乏任何一个,都不可能在人类社会生存下去。</p>
<p>既然这四种能力是如此的重要,如此的基本,那么我想所谓的跨界一定不是发生在这个层次上。</p>
<h1>领域知识</h1>
<p>在上述四种能力的基础上,我们才会构建出自己的专业领域知识。
比如,程序员需要学习基本的编程技能、操作系统、网络系统等专业知识;金融从业者需要学习各种金融模型知识、法律知识。
每一个领域都有其独特的领域知识和思维方式。
利用上述四种不同的基本技能,人类才可能会学习各种各样的领域知识。
然而,就像上一节所说的,每一个领域对基本能力的需要是不一样的,程序员要求更好的逻辑思维能力,学者需要更好的学习能力,CEO需要更好的领导能力。
当你选择跨界时,你不仅仅是选择了转移到一个新的专业领域,更是重新塑造或培养了自己的基本能力。</p>
<p>所以我想所谓的跨界无非是:</p>
<ol>
<li>从一个专业领域转移到另外一个专业(最基本的理解)</li>
<li>重塑四种基本能力,转移侧重点(本质)。</li>
</ol>
<p>对于那些,四种能力都全面发展的人才来说,「跨界」其实是非常容易的。
而对于普通人来说,「跨界」困难的原因,可能根本不是领域知识,而在于基本能力侧重点的转移。
这才是最困难的地方,因为这就意味你要走出你的舒适区,程序员需要学会在公共场合发表演讲;学者需要学习处理行政管理事物,来提高手下研究生的工作效率;CEO需要提高自己的学习能力来跟上这个瞬息万变的时代。</p>
<h1>结论</h1>
<p>通过上面的分析,我的结论是</p>
<ol>
<li>完美的跨界是建立在强大的基本能力基础上的,不是每一个人都能做得到的。</li>
<li>跨界的本质不是学习不同的领域知识,而是改变自己的基本能力。</li>
<li>与其跨界,不如提高自己的四种基本能力,如此一来,整个世界就是海阔凭鱼跃,天高任鸟飞,不存在什么领域壁垒了。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年2月25日写成初稿并发表。</li>
</ul>天下合久必分,分久必合2018-02-10T00:00:00-07:002018-02-10T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-02-10:/words/Union-of-World/<p>年少看三国时,开篇第一句就是「天下大势,合久必分,分久必合」,当时没有花太多心思思考这个事情。
然而,纵观整个中华民族的历史,我们可以发现,整个历史的发展过程始终没有脱离这个分分合合的循环。
后来,随着的年龄和阅历增加,逐渐意识到,任何一个现象,其底层本质一定存在着一个理论能解释这个现象。
而「合久必分,分久必合」就是一个有趣的社会现象,然而我却很少思考其底层本质是什么。
直到最近,我在阅读野盐七生的「罗马人的故事」的时候,透过中西方古代的对比,逐渐慢慢地找到了中华大地上「合久必分,分久必合」的底层本质是什么。</p>
<p>我将从两个方面来阐述我的思考过程。</p>
<h1>合</h1>
<p>为什么华夏大地上没有像欧洲一样分裂成<span class="math">\(n\)</span>个小国家,而始终是以一个整体大国呈现在世人眼前呢?
春秋战国时期,中国大地上分裂出了那么多的国家,为什么没有逐一延续下来?
我想最重要的原因是,当时的人们已经形成了「天下」的概念。
当时的周天子是名义上的天下共主,在名义上是所有诸侯国的统治者。
这说明了,在当时人的意识中,整个华夏就是一个整体。
不管你是鲁国人、秦国人、赵国人还是齐国人 …</p><p>年少看三国时,开篇第一句就是「天下大势,合久必分,分久必合」,当时没有花太多心思思考这个事情。
然而,纵观整个中华民族的历史,我们可以发现,整个历史的发展过程始终没有脱离这个分分合合的循环。
后来,随着的年龄和阅历增加,逐渐意识到,任何一个现象,其底层本质一定存在着一个理论能解释这个现象。
而「合久必分,分久必合」就是一个有趣的社会现象,然而我却很少思考其底层本质是什么。
直到最近,我在阅读野盐七生的「罗马人的故事」的时候,透过中西方古代的对比,逐渐慢慢地找到了中华大地上「合久必分,分久必合」的底层本质是什么。</p>
<p>我将从两个方面来阐述我的思考过程。</p>
<h1>合</h1>
<p>为什么华夏大地上没有像欧洲一样分裂成<span class="math">\(n\)</span>个小国家,而始终是以一个整体大国呈现在世人眼前呢?
春秋战国时期,中国大地上分裂出了那么多的国家,为什么没有逐一延续下来?
我想最重要的原因是,当时的人们已经形成了「天下」的概念。
当时的周天子是名义上的天下共主,在名义上是所有诸侯国的统治者。
这说明了,在当时人的意识中,整个华夏就是一个整体。
不管你是鲁国人、秦国人、赵国人还是齐国人,都属于一个更大的意识框架中——天下。
战国时期战乱纷飞,周朝天子失去了权威,但是「天下」的概念却已经在诸侯国心目中根深蒂固。
他们想要的就是统一这个「天下」,最终始皇帝最终做到了。
尤其当始皇帝「书同文,车同轨」之后,这样的「天下」归属感更加深入人心了。</p>
<p>对比西方的古代史,他们同样曾经建立过广大的帝国,比如亚历山大大帝、波斯帝国等,然而他们总是随着君主的死亡而轰然倒塌,并且再也没有继承者想要恢复原有的帝国。
我想其主要原因是,他们的帝国都是通过暴力手段维持稳定的,但是文化上却没有认同感。
一旦,英明神武的开国君主死去之后,整个帝国马上就分崩离析了。
由于没有认同感,从来没有人觉得需要回复往日的帝国疆域。</p>
<p>然而,中国自秦以后,各个皇朝都有没有脱离这个「天下」意识的框架。
历代的统治者,征服者都认同这个天下概念,华夏大地始终应该是「统一」的。
每当中华大地处于战乱时代,所有逐鹿天下的诸侯们想要的都不是偏安一隅,而是一统整个天下,这就是文化认同感的作用。</p>
<h1>分</h1>
<p>那我不禁又要问,为什么秦朝、汉朝、唐朝没有一直延续到现在呢?
为什么那么多显赫的皇朝始终没有一个做到「以至无穷」?
当然,单独挑出一个朝代,我们总能分析出其覆灭的原因。
在我们的意识中,最重要的原因无非是: 统治者骄奢淫逸,无视民间疾苦.
那么为什么历朝历代发展到最后总是会以「骄奢淫逸」结尾呢?</p>
<p>当我阅读「中国历代经济变革得失」的时候,吴老师提出了一个更加底层的原因,一个在我看来更加合理的解释为什么没有一个皇朝能过脱离这个循环的原因。</p>
<p>每当战乱,经济生产必然会受到重大打击,尤其是粮食生产。
战乱加上粮食短缺,导致人口会锐减。
在某个军阀势力再度统一整个华夏大地之后,他们首先做的就是要恢复生成,会出台一系列奖励耕作的政策。
太平盛世维持了一两百年之后,人口繁衍逐渐超出了原有水平。
因为古代生产力水平的限制,粮食生产效率却没有因为人口的增加而增加。
因此,社会上产生了大量不事农产的流民。
这些流民是社会的不安定要素,由于吃不饱饭,于是他们纷纷干起了强盗的勾当。
当这股势力不断发展,最终使得社会再次进入战乱的时代。
于是,新的循环再次开始,战乱导致人口减少,恢复到生产力可以负担的水平,再次进入繁荣时期。</p>
<h1>总结</h1>
<p>从以上的分析来看,「合」和「分」是因为不同的原因导致的。
「合」是因为文化认同感、归属感;而「分」却是因为基本的经济规律。</p>
<h1>参考资料</h1>
<ul>
<li>吴晓波「历代经济变革得失」</li>
<li>野盐七生「罗马人的故事」</li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年2月10日写作并发布</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>读博的心得2018-02-04T00:00:00-07:002018-02-04T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-02-04:/words/Phd-Experience/<p>我们常常要从实践中才能获得经验,别人说的永远不如自己的亲身体验。
以下记录的都是读博一年半以来的亲身体会。</p>
<h1>认知</h1>
<p><strong>老板不能帮你解决问题</strong></p>
<p>对于你正在做的问题,老板不可能比你还要了解这个问题,所以不要期望老板能告诉你什么是对的,什么是错的。
一切都要考虑自己去探索。
你的目标应该是,在你毕业的时候,教会你老板你的研究内容。</p>
<p><strong>对于自己的方案,必须有直观上的解释</strong></p>
<p>对于你推导得到的公式、算法,必须能给出直观上的解释。
如果,你都无法用最简单的语言来描述你的方案,你的方案很有可能是错的。
一定要对你的公式、算法给出解释!</p>
<p><strong>提出自己的方案之前,一定要对问题有足够的认识</strong></p>
<p>在做WSABIE这个项目的时候,想要解决unbalanced label的这个问题。
在深入理解这个问题之前就盲目地提出了自己的解决方案,并且花了大量的时间去优化、论证解决方案。
然而,当开始做实验的时候,突然才发想,这个问题根本不是原来所想的那样。
它涉及到的问题比预想的要复杂的多。
结果,花了大量时间在一个根本就不对的方向上,浪费了很多的时间。</p>
<h1>阅读和思考</h1>
<p>阅读和思考是读博期间两个最为重要的工作,必须坚持不断的阅读和思考。
其实,读博期间,能够写代码是一件非常幸福的事情,至少说明的你思考已经有所结晶了。
最痛苦的,不是写不出代码,而是不知道该写些什么。</p>
<p>借用 …</p><p>我们常常要从实践中才能获得经验,别人说的永远不如自己的亲身体验。
以下记录的都是读博一年半以来的亲身体会。</p>
<h1>认知</h1>
<p><strong>老板不能帮你解决问题</strong></p>
<p>对于你正在做的问题,老板不可能比你还要了解这个问题,所以不要期望老板能告诉你什么是对的,什么是错的。
一切都要考虑自己去探索。
你的目标应该是,在你毕业的时候,教会你老板你的研究内容。</p>
<p><strong>对于自己的方案,必须有直观上的解释</strong></p>
<p>对于你推导得到的公式、算法,必须能给出直观上的解释。
如果,你都无法用最简单的语言来描述你的方案,你的方案很有可能是错的。
一定要对你的公式、算法给出解释!</p>
<p><strong>提出自己的方案之前,一定要对问题有足够的认识</strong></p>
<p>在做WSABIE这个项目的时候,想要解决unbalanced label的这个问题。
在深入理解这个问题之前就盲目地提出了自己的解决方案,并且花了大量的时间去优化、论证解决方案。
然而,当开始做实验的时候,突然才发想,这个问题根本不是原来所想的那样。
它涉及到的问题比预想的要复杂的多。
结果,花了大量时间在一个根本就不对的方向上,浪费了很多的时间。</p>
<h1>阅读和思考</h1>
<p>阅读和思考是读博期间两个最为重要的工作,必须坚持不断的阅读和思考。
其实,读博期间,能够写代码是一件非常幸福的事情,至少说明的你思考已经有所结晶了。
最痛苦的,不是写不出代码,而是不知道该写些什么。</p>
<p>借用「进击的巨人」的开场白:
<strong>那一天,我终于回想起了被无知所支配的恐怖和被囚禁于井底的那份屈辱。</strong></p>
<p>我一年半以来的心得是,写和思其实同时发生的,并且是相辅相成的。
你需要把你的思考过程记录下来,而当你写作的时候,大脑又会继续将你的想法向外拓展,扩展你的思维空间。
这个方法亲测有效!
从去年开始,我就开始每天写科研日记,这个方法让我获益良多,其好处包括了:</p>
<ol>
<li>拓展思维,写和思是相辅相成的,写作的同时能继续拓展思维</li>
<li>追溯自己的思维过程,避免落入相同的思维陷阱</li>
<li>方便日后的论文写作。因为我的科研日记全是用Latex写的,包括各种实验数据、图表。因此,当开始写论文的时候,其实大部分内容都已经写好了,只需要从科研日记中提取精炼出若干部分。</li>
</ol>
<h1>睡眠</h1>
<p>我已经很多篇文章都强调了睡眠的重要性。
一夜无梦的好睡眠,尤其是足够的深度睡眠时间,能够让你拥有无比的注意力和快速的思维能力。
对研究工作来说,这可是致命的。
我曾经试过,连续三天只睡了40分钟的深度睡眠,白天的大脑状态简直是在梦游,根本无力进行深入的思考。</p>
<p>由于我长期受到睡眠问题的困扰,我对睡眠这件事自然是无比看重的。
牺牲什么都不能牺牲睡眠的时间。
我自己也阅读了很多有关睡眠的书籍,然而真正能能帮助改善睡眠的方法却不多,我认为有帮助的几点是:</p>
<ol>
<li>规律的睡眠: 每天在固定的时间和固定的时间起床,人类的身体偏爱规律的生活</li>
<li>有氧运动确实对提高睡眠质量有所帮助。</li>
<li>黑暗的环境更容易入眠</li>
<li>在改变作息习惯的时候,要给身体足够的缓冲时间,让身体慢慢适应新的规律。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年2月4日写作并发表</li>
</ul>2018年1月书单2018-01-28T13:11:35-07:002018-01-28T13:11:35-07:00Flyawaytag:zhouyichu.com,2018-01-28:/reading-list/Reading-List-20180-January/<p>2018年1月读书书单。</p><h1>机器人与帝国</h1>
<p>作者: 艾萨克·阿西莫夫</p>
<p>这是我第二遍又把阿西莫夫的大银河帝国系列通读了一遍,还是一如既往的精彩。</p>
<h1>千年金融史</h1>
<p>作者: 威廉·戈兹曼 </p>
<h2>摘录</h2>
<p><strong>金融的四个关键要素:</strong></p>
<ol>
<li>在时间上重新配置经济价值</li>
<li>重新配置风险</li>
<li>重新配置资本</li>
<li>扩展了资源重新配置的渠道和复杂程度</li>
</ol>
<p>金融契约通常在两种人中寻找平衡:</p>
<ol>
<li>希望将价值折现的人</li>
<li>希望将价值转换到未来的人</li>
</ol>
<h2>收获</h2>
<p>本书从金融发展的角度重新审视了人类的历史,主要的收获有:</p>
<ol>
<li>人类一切的社会发展都离不开金融,看似偶然的历史发展,其后都有着深层的原因。</li>
<li>金融是人类历史发展的底层推动力量之一,没有金融的力量,很多历史上的伟人是做不到那些丰功伟绩的。</li>
<li>从古至今,大部分都羞于谈利润,尤其是中国古人,市农工商,商人时最轻贱的。然而,时代的改变,价值观也在改变,当代社会中的金融力量无疑是有史以来最强大的。 </li>
</ol>
<h1>盗火</h1>
<p>作者: 史蒂芬·科特勒 / 杰米·威尔 </p>
<p>一本被夸大其词的书。</p>
<p>全书其实就一句话: <strong>心流是强大的,并且利用现代科技是可以达到。</strong></p>
<p>然而全书只是列举各种现象、实验来描述这个现象,关于如何到达这样的状态却只字不提。
我无法理解整本书的主线逻辑在哪,如果使用我之前在<a href="http://zhouyichu.com/words/Readings-Again/">读书浅见</a>中的分类标准的话,这本书应该就是属于内容很差,结构很差的类别了。
幸好只花费了我半个小时的时间。</p>
<h1>罗马人的故事1: 罗马不是一天建成的</h1>
<p>作者: 盐野七生</p>
<p>这本书是整个大系列的第一本,书中讲述了罗马从建国到布匿战争之前的历史。
从中能够感受到罗马有别于其他名族的特点在于:</p>
<ol>
<li>没有对王政的迷恋, 即使是在王政时代,罗马国王也不是世袭的,而是全民选举选出来的。</li>
<li>宽容心态,赋予被征服民族市民权,让他们参与罗马的管理。后来很多被选出来的执政官都属于数十年前被征服的国家。</li>
<li>贵族以身作则,冲锋陷阵。</li>
</ol>
<p>罗马对内是寡头政治,精英统治;对外是兼容并包的态度,在当时的时代条件下,不可能不强大起来。</p>
<p>从两千多年前开始,罗马人就开始以辩论、演讲的方式来进行政治活动,难怪现代西方各个国家的政治是以此为基础的。
反观中国政治的发展过程,中国一直就是「家天下」的思想,百姓从来不会参与到政治中。
套用吴军老师的基因决定论,中国和欧美各个国家拥有的政治基因不同,生搬硬套他们的制度未必是好事。</p>
<h1>罗马人的故事2: 汉尼拔战记</h1>
<p>作者: 盐野七生</p>
<p>这是「罗马人的故事」系列的第二本,讲述的三次布匿战争。
其中,对于第二次布匿战争,也就是汉尼拔战争进行了详细的描述。
这一段的历史告诉我们,战争绝非是一个将领能够左右的。
战争的本质是综合国力的较量,尽管汉尼拔是当时西方世界中最优秀的战略家,但由于其祖国迦太基在制度上明显劣势,最终还是抵不过统治制度更加优秀的罗马共和国。</p>
<p>阅读这一段历史的时候,让我联想到了70年前的抗日战争。
当年的中国政府和2000年前的罗马政府采用了同样的策略: 打消耗战。
尽管汉尼拔所向披靡,尽管日军势如破竹,但是庞大的疆域给予了罗马和中国极大的战略纵深,利用消耗战拖垮对手。</p>
<h1>更新日志</h1>所谓坚持2018-01-27T13:55:03-07:002018-01-27T13:55:03-07:00Flyawaytag:zhouyichu.com,2018-01-27:/words/Persistence/<p>从小我们的老师、父母都一再告诉我们坚持的重要性。
做事一定要持之以恒,这样才能做成大事。
然而,我从小就有个疑惑,既然坚持就能做大事,
那为什么那么多工作一辈子的人都依然穷苦一生呢?
为什么有的人却能在短短十几年内迅速积累财富、功成名就?
我不否认坚持的重要性,但我无法理解其中的机制。
这么多年来,我一直在反复咀嚼思考这个问题,到底什么是坚持,为什么坚持是有效的,如何才能做到坚持?
直到现在读了博士,才从工作生活中渐渐体会到其中的原因,于是整理成了这篇文章。</p>
<h1>比坚持更重要的</h1>
<p>首先,我对坚持的第一个理解就是,坚持的方向比你能否坚持更加重要。
简单来说,就是那句老话: 「<strong>做正确的事远比正确地做事重要得多</strong>」</p>
<p>记得当年在看电视剧「奋斗」的时候,陆涛老爸和他下属有一段对话:</p>
<pre><code>下属为自己争辩道:"这都是我辛辛苦苦奋斗出来的成果 !"
陆涛老爸则说:"很多农民在自己的一亩三分地上也是辛辛苦苦一辈子,但他们依然成不了事 !"
</code></pre>
<p>我对这段话的印象特别深刻,这么多年过去了,整部电视剧就剩下了这点记忆……
这段对我最大的启示就是选好奋斗的方向,比你真正的努力奋斗重要得多。</p>
<p>这个时代不缺乏努力拼搏的人,但很多人其实没有选好方向,在一个错误的方向上坚持,只会离你的目标越来越远。</p>
<h1>什么才是坚持</h1>
<p>选定合理且可行的目标之后,剩下的就是朝着这个目标坚持走下去了。
然而,事情不是那么简单的 …</p><p>从小我们的老师、父母都一再告诉我们坚持的重要性。
做事一定要持之以恒,这样才能做成大事。
然而,我从小就有个疑惑,既然坚持就能做大事,
那为什么那么多工作一辈子的人都依然穷苦一生呢?
为什么有的人却能在短短十几年内迅速积累财富、功成名就?
我不否认坚持的重要性,但我无法理解其中的机制。
这么多年来,我一直在反复咀嚼思考这个问题,到底什么是坚持,为什么坚持是有效的,如何才能做到坚持?
直到现在读了博士,才从工作生活中渐渐体会到其中的原因,于是整理成了这篇文章。</p>
<h1>比坚持更重要的</h1>
<p>首先,我对坚持的第一个理解就是,坚持的方向比你能否坚持更加重要。
简单来说,就是那句老话: 「<strong>做正确的事远比正确地做事重要得多</strong>」</p>
<p>记得当年在看电视剧「奋斗」的时候,陆涛老爸和他下属有一段对话:</p>
<pre><code>下属为自己争辩道:"这都是我辛辛苦苦奋斗出来的成果 !"
陆涛老爸则说:"很多农民在自己的一亩三分地上也是辛辛苦苦一辈子,但他们依然成不了事 !"
</code></pre>
<p>我对这段话的印象特别深刻,这么多年过去了,整部电视剧就剩下了这点记忆……
这段对我最大的启示就是选好奋斗的方向,比你真正的努力奋斗重要得多。</p>
<p>这个时代不缺乏努力拼搏的人,但很多人其实没有选好方向,在一个错误的方向上坚持,只会离你的目标越来越远。</p>
<h1>什么才是坚持</h1>
<p>选定合理且可行的目标之后,剩下的就是朝着这个目标坚持走下去了。
然而,事情不是那么简单的。
很多时候,只是你以为你在坚持,其实你根本没有前进半步。</p>
<p>在健身领域,无氧训练讲究的是<strong>进度(progress)</strong>,每一次都要比上一次重量有所增加或次数有所提高,才能切实达到健身的效果。
其实,这可以推广到一切领域。</p>
<p>所谓坚持,就是要保证每次都有进步,每次都要比上一次更进一步,哪怕是一小步。
我想两个简单的数学式子就足以说明一切:</p>
<div class="math">$$
\begin{aligned}
1.01^{1000} &= 20959\\
0.99^{1000} &= 4.3\times 10^{-5}
\end{aligned}
$$</div>
<p>仅仅差了一小步,通过时间的放大效应,就能产生如此巨大的差距。
所以,我认为坚持的关键是,不是你有多努力,你有多勤奋,而是你如何保证每次都在上一次的基础上再前进一小步。
这里面的机制其实非常简单,这就是被爱因斯坦誉为世界第八大奇迹的<strong>复利效应</strong>。
复利效应有两个关键点:</p>
<ol>
<li>复利: 每一次都要比上一次多一点点</li>
<li>时间: 坚持足够长的时间</li>
</ol>
<p>不要以为你吃了很多苦就是在坚持,坚持的关键在于前进,在于progress,而不是吃苦。
只要能保证每次都前进一小步,剩下的就交给时间去处理。</p>
<h1>如何坚持</h1>
<p>坚持一件事其实很容易,三个步骤:</p>
<ol>
<li>计划: 方向是最重要的,因此我认为坚持的第一步就是制定一个切实可行的计划。</li>
<li>执行: 一旦制定了计划,就需要严格按照计划去做。如何做一个合理可行的计划其实也是一个需要学习的过程,也是需要慢慢摸索的。</li>
<li>记录回顾: 记录进度能够保证你每次都是进步而不是倒退,保证你每次的收益都是<span class="math">\(1.01\)</span>而不是<span class="math">\(0.99\)</span>.其中最关键的在于如何定义「进度」,如何保证每一次的实践都要比上一次好?这其实也是很难的。</li>
</ol>
<h1>总结</h1>
<p>对于坚持正确的理解应该是:</p>
<ol>
<li>选定正确可行的目标</li>
<li>保证每一步都要比上一步更好</li>
</ol>
<p>坚持的本质: <strong>复利效应</strong>的具象化。</p>
<h1>更新日志</h1>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>个人操作系统2018-01-21T13:27:22-07:002018-01-21T13:27:22-07:00Flyawaytag:zhouyichu.com,2018-01-21:/words/Personal-Operating-System/<p>读博一年半以来,渐渐养成了各种不同的行为习惯,这些习惯将我的生活变得更加轻松自如。
之前,在阅读李笑来老师的「七天就是一辈子」的时候,书中提到了<strong>个人操作系统</strong>的概念。
我非常喜欢这个提法,拥有一个合适的操作系统,说明个人的行为是在固定的指导方针下执行的,而不是简单的随性而为。
这和「高效能人士的七个习惯」中的「以原则为中心」有异曲同工之妙。
当然,每个人的三观不同,给自己定制的操作系统未必完全一样。
但重点是,需要有一这样一套操作系统,来指导自己的日常行为,使得自己不断进步和提高.</p>
<p>本文总结了过去一年半以来的经验所得,目前的系统还是非常的简单,我希望随着年岁的不断增长,不断升级自己的系统。</p>
<h1>硬件</h1>
<p>硬件主要是指对自己身体的管理方法,保持健康活力的身体是一切的根本。</p>
<h2>健身</h2>
<p>开始健身并不是什么困难的事情,真正困难的是如何坚持下去。
健身最大的好处必须是在长期坚持的基础上才能体现出来。
每天花费一定的时间在健身上,一定会极大的改善自己的身体素质。
关于如何坚持,我自己有几点诀窍:</p>
<ol>
<li>端正意识: 健身这件事具有高优先级,不要把它当成一件辅助性的事情,而是一件每天必须做的正事,是一件超越你职业、超越你日常的事情,是一件一辈子的事情。</li>
<li>提前做好计划:结合自己实际的工作情况 …</li></ol><p>读博一年半以来,渐渐养成了各种不同的行为习惯,这些习惯将我的生活变得更加轻松自如。
之前,在阅读李笑来老师的「七天就是一辈子」的时候,书中提到了<strong>个人操作系统</strong>的概念。
我非常喜欢这个提法,拥有一个合适的操作系统,说明个人的行为是在固定的指导方针下执行的,而不是简单的随性而为。
这和「高效能人士的七个习惯」中的「以原则为中心」有异曲同工之妙。
当然,每个人的三观不同,给自己定制的操作系统未必完全一样。
但重点是,需要有一这样一套操作系统,来指导自己的日常行为,使得自己不断进步和提高.</p>
<p>本文总结了过去一年半以来的经验所得,目前的系统还是非常的简单,我希望随着年岁的不断增长,不断升级自己的系统。</p>
<h1>硬件</h1>
<p>硬件主要是指对自己身体的管理方法,保持健康活力的身体是一切的根本。</p>
<h2>健身</h2>
<p>开始健身并不是什么困难的事情,真正困难的是如何坚持下去。
健身最大的好处必须是在长期坚持的基础上才能体现出来。
每天花费一定的时间在健身上,一定会极大的改善自己的身体素质。
关于如何坚持,我自己有几点诀窍:</p>
<ol>
<li>端正意识: 健身这件事具有高优先级,不要把它当成一件辅助性的事情,而是一件每天必须做的正事,是一件超越你职业、超越你日常的事情,是一件一辈子的事情。</li>
<li>提前做好计划:结合自己实际的工作情况,划分出合理的健身时间。计划的时候,需要考虑各种因素,比如身体状况、一天的工作安排等等。一旦安排好了,那这段时间就分配给健身了,雷打不动,以后规划其他事情的时候,再也不要把这段健身的时间考虑在内. 规划时间时一件需要慢慢学习的事情,绝不要期望能够一步到位。</li>
<li>执行计划:一旦明确了思想、确定了计划,执行起来应该没有难度了。如果,你发现每天的健身时间你都很难坚持,那也许就是安排的时间不是最合适的。</li>
<li>记录: 所谓健身,不是简单的去健身房做一些无氧或有氧运动,而是需要有计划地、系统的锻炼自己的身体。需要记录自己的运动情况,从而能在长时间内看到自己身体的变化。</li>
</ol>
<h2>早起</h2>
<p>早起,是我所有习惯中让我受益最大的一个习惯。
关于早起的好处晚上一搜一大堆,我也不想再重复了。
我想说的是关于早起的一个误区: 早起就意味着少睡。
其实,早起和少睡没有什么必然的联系。
真正有联系的是,早起意味着早睡。
作为一个CS的博士,我想很多人都不会相信我每天10:30就上床睡觉了。
每天早上6:30起床,开始一天的工作。
这样的作息,配合每天的健身,我的身体总是充满了活力。</p>
<h2>睡眠</h2>
<p>睡眠是一个非常重要的事情,每天晚上必须保证8个小时的床上时间。
我曾经用自己的身体做过实验,在每天的睡眠时间低于6个小时的情况下,我自己的思考力和注意力极大的下降了。
白天的工作效率低到可以忽略不计。
因此,睡眠在我的「硬件维护系统」中也是非常重要的一环。</p>
<h1>软件</h1>
<p>软件系统描述的是我对这个世界的理解,这些理解有助于建立自己的行为原则。</p>
<h2>生活就是取舍</h2>
<p>生活就是取舍,这是我最大的体会。
你想要得到某些东西,你就需要付出另外一些东西。
一个很简单的例子: 你需要付出你的时间来获取工作报酬,从而维持你的生存。
这里面的有个潜台词是,在你看来,维持你的生存比你自己的时间重要得多。</p>
<p>那我们可以把这个思想扩展到以下的情况:</p>
<ol>
<li>美食和好身材哪个更重要?如果你无法放弃美食的诱惑,说明在你看来,健康的身体的重要性比美食低得多。</li>
<li>舒适安逸的生活和功成名就哪个更重要? 如果你无放弃轻松惬意的生活,说明在你看来,功成名就不如过好自己的小日子。</li>
</ol>
<p>这些选择没有对与错,我想说的是,这就是取舍,选择了美食就要告别健美的身体;选择了小富即安就不要奢望一夜暴富。
最纠结的其实是,嘴里吃着烤串、喝着啤酒,心中却想的是强森般的健硕身材。
这样的想法只会让自己永远处于纠结的状态。</p>
<p>自己做了选择,就要接受随之而来的后果,后果有好的,也有坏的,你必须一起接受!</p>
<h2>习惯的力量</h2>
<p>已经不记得在哪本书中看到过这样一句话: 「人们常常高估自己一年内能做的事,而低估十年内能做的事情」.
我非常喜欢这句话,它是在告诉我们,不要想在短时间内完场一件很大的事情。
所有的事情都需要靠积累完成的,而积累的过程,就体现在你日常的各种工作习惯中。
人人都可以打鸡血,然而没见过几个靠着打鸡血就成功的人,真正成功的人都是在坚持中做好每件事。
坚持一件事最好的方法就是把它当成一个习惯,每次做的时候,想都不会多想,就把它做了。</p>
<h2>容忍过失</h2>
<p>当然,生活工作不可能一切都是按照计划进行的,总会有一些临时的状况,你无法控制所有的事情。
每当遇到这种情况,我总是会优先处理紧急的事情。
但是,会在最短的时间内恢复原来的作息习惯。
要有一套自己的容错系统,能够从意外情况下恢复到原来的轨道上面。</p>
<h1>更新日志</h1>
<p>2018年1月21日 写出初稿并发布。</p>给一年后的自己2018-01-14T13:01:43-07:002018-01-14T13:01:43-07:00Flyawaytag:zhouyichu.com,2018-01-14:/words/to-My-Future-Self-in-One-Year/<p>穿越时间给自己的一封信。</p><p>亲爱的flyaway:</p>
<p>此时是2018年1月14日,我在这一年之初打算写一封信给2019年的你。
这封信将会穿越时间而不是空间传递到你的手里。当然,从信息量的角度来说,你所拥有的信息一定比现在的我要多,毕竟你比我要年长一岁。
这封信并不打算检视你的年度计划是否完成,我相信你已经建立了合理的回顾体系,这部内容不需要我来提醒。
我写这封的目的是为了让你记住一些估计你已经忘记的事情。</p>
<p>如果一切按照计划进行的话,我估计2019年的元旦你应该是在国内度过的。
因此,这封信就是以你在国内为背景来写作的。</p>
<h1>作息习惯</h1>
<p>一定要保持一贯的作息习惯,适度合理的放松自己。
我有必要提醒你,2017年底那放纵的一周对你来说是没有任何意义,也没有起到任何放松的目的。
身体依然很疲倦, 大脑被垃圾信息所充斥,根本没有舒适的感觉.
这不是在放松身心,这只是你的懒癌在发作。</p>
<p>真正的休息是放慢你的角度,清空大脑,回归最普通的生活。
我想此时此刻你很有可能是在国内吧,那么以下是我有关作息习惯的建议:</p>
<ol>
<li>7点起床,11点前睡觉。</li>
<li>早餐不要每天都去吃羊肉面,依然要坚持一贯的清淡饮食。</li>
<li>找一个健身房坚持自己的健身计划。</li>
<li>多多放空自己的,想想自己所处的位置,接下去该往哪里去。</li>
<li>禁绝零食。</li>
<li>坚持游泳</li>
</ol>
<h1>耐心</h1>
<p>对父母长辈一定要有耐心,一年又一年过去了,你已经成长,而他们也已经老去。
他们的唠叨你要学会倾听,他们的话并不一定是对的,但是出发点一定是好的。
即使你不同意,也要试着理解。
你常年漂泊在外,每年又有多少唠叨可以听呢?</p>
<p>在家的每一天都要陪他们散步,和他们讲讲国外的生活,讨论讨论将来的规划。</p>
<p>说服他们进行全身体检,对他们的健康状况有所理解。</p>
<h1>游戏</h1>
<p>此时此刻就是你玩游戏的最佳时机,千万不要压抑自己,想玩就玩吧。
因为,一整年的时间里,也就这段时间你是可以毫无顾忌地沉浸在游戏世界里的。
彻底释放你的压力吧,但是,切不可因此毁了你自己的作息习惯。 </p>
<h1>朋友</h1>
<p>除了游戏之外,这也是好好回顾友谊的时候。
各处的老同学、老朋友都需要花时间好好去拜访。
尽管你还算年轻,但见面的机会其实已经不是很多了。
听听他们的生活,不要因为他们变成了奶爸奶妈而疏远他们,听听他们的生活近况,理解他们的生活。
有几个城市是必须要拜访一下的:</p>
<ul>
<li>上海: 很多老同学都在上海工作</li>
<li>南京: 大部分老师同学都在南京</li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2018年1月14日写作并发布。</li>
</ul>读书浅见2018-01-07T00:00:00-07:002018-01-07T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-01-07:/words/Readings-Again/<p>四年前,我曾写过一篇有关<a href="http://zhouyichu.com/words/About-Readings/">读书的文章</a>,而这四年来我都一直坚持每天阅读一小时。
在阅读过程一种产生了一些有关读书的思考,现在整理成本篇文章。</p>
<h1>书籍选择</h1>
<p>书籍的选择是非常重要的,这是有效读书的第一步。
然而,现在出版书籍的门槛越来越低,图书质量参差不齐,如何利用有限的时间去阅读近乎无限的书籍成为了关键。
过去四年年的阅读经验告诉我,一本书可以分为以下几个方面来度量:</p>
<ol>
<li>内容: 这当然是最关键的。一本经典的好书,其中的内容值得你反复阅读。</li>
<li>结构: 这里的结构值得是书籍的目录安排和全书结构设置。这虽然和内容关系不大,但是一本结构清晰的书能帮助我们节省不少的时间。
结构很差的书,会让读者无法快速地掌握全局纲领,只能一字一句的地毯式阅读。</li>
<li>排版: 我平时是使用kindle看书的,因此非常关注一本的书的排版效果,如果排版太差,我是无法忍受的。</li>
</ol>
<p>通常来说,上述三个方面的重要性排序应该是: <strong>内容>结构>排版</strong>.
但是,在实际生活中,这三个方面对人的影响程度却是: <strong>排版>结构>内容</strong>.
直接导致的结果就是,很多内容很好的书籍因为排版质量或结构安排等原因直接被我过滤了,错失了学习新知识的机会。</p>
<p>我可以举几个简单的例子:</p>
<ol>
<li>
<p>内容上乘,结构一流: 张五常先生的「<a href="https://book.douban.com/subject/26636765/">经济解释 …</a></p></li></ol><p>四年前,我曾写过一篇有关<a href="http://zhouyichu.com/words/About-Readings/">读书的文章</a>,而这四年来我都一直坚持每天阅读一小时。
在阅读过程一种产生了一些有关读书的思考,现在整理成本篇文章。</p>
<h1>书籍选择</h1>
<p>书籍的选择是非常重要的,这是有效读书的第一步。
然而,现在出版书籍的门槛越来越低,图书质量参差不齐,如何利用有限的时间去阅读近乎无限的书籍成为了关键。
过去四年年的阅读经验告诉我,一本书可以分为以下几个方面来度量:</p>
<ol>
<li>内容: 这当然是最关键的。一本经典的好书,其中的内容值得你反复阅读。</li>
<li>结构: 这里的结构值得是书籍的目录安排和全书结构设置。这虽然和内容关系不大,但是一本结构清晰的书能帮助我们节省不少的时间。
结构很差的书,会让读者无法快速地掌握全局纲领,只能一字一句的地毯式阅读。</li>
<li>排版: 我平时是使用kindle看书的,因此非常关注一本的书的排版效果,如果排版太差,我是无法忍受的。</li>
</ol>
<p>通常来说,上述三个方面的重要性排序应该是: <strong>内容>结构>排版</strong>.
但是,在实际生活中,这三个方面对人的影响程度却是: <strong>排版>结构>内容</strong>.
直接导致的结果就是,很多内容很好的书籍因为排版质量或结构安排等原因直接被我过滤了,错失了学习新知识的机会。</p>
<p>我可以举几个简单的例子:</p>
<ol>
<li>
<p>内容上乘,结构一流: 张五常先生的「<a href="https://book.douban.com/subject/26636765/">经济解释</a>」。
第一次读到「经济解释」的时候,简直是惊为天书。
不仅内容上深入浅出,而且结构合理,由浅入深的讲解经济学的整体框架。
从最基本的逻辑概念开始讲起,一层层讲解经济学的基本概念,阅读体验非常好。
老爷子的写作功力果然非常老道。</p>
</li>
<li>
<p>内容上乘,但结构不忍直视的: 武志红老师的「<a href="https://baike.baidu.com/item/%E5%B7%A8%E5%A9%B4%E5%9B%BD">巨婴国</a>」。
我知道目前网上的评论是两面倒,而我比较支持这本书的。
书中的内容对我来说确实有一种醍醐灌顶的感触。
但是,我不得不吐槽这本书在结构上简直烂到爆,全书基本就是武志红老师的博文合集,而且只是简单粗暴地组合到了一起,根本没有用心整理结构。
很多概念和关键点前前后后反反复复地出现,而且在不同的章节里用不同的例子来说明,缺乏结构上的严谨性。
作为一个看惯了科学论文的人,这本书确实看得很痛苦,</p>
</li>
<li>
<p>内容一般,但是结构很好: 斌卡的「<a href="https://book.douban.com/subject/26774272/">一平米健身</a>」和「<a href="https://book.douban.com/subject/26774272/">硬派健身</a>」.
我说这两本书内容一般是相对于其他更有思想深度的书来说的,比如上文提到的「经济解释」和「巨婴国」。
其实,对于工具书来说,斌卡的结构已经算是非常好了,因此我将这两本放在这个分类中。
我认为,一本结构好的书需要做到如下: <strong>当你需要回忆这本书的某些内容时,你能够通过其目录很快定位到你所需要回顾的内容。</strong></p>
</li>
<li>
<p>内容一般,结构一般: 卡尔·纽波特的「<a href="https://book.douban.com/subject/27056409/">深度工作</a>」,查尔斯·杜希格的「<a href="https://book.douban.com/subject/20507212/">习惯的力量</a>」.
这些书籍一般都一些共性:
1. 高大上的名字
2. 真正的干货一般都在全篇50%的篇幅之后才会出现
3. 一大半的内容都是在说明他们是如何得到的结论的以及我们自己的个人生活,而不是客观严谨地分析他们列出的各项论据。
以前看到这些书我仔仔细细从头读到尾,唯恐漏掉什么发人深思的观点。
在熟悉套路之后,往往都是翻翻目录,跳到适当的章节看几点真正的结论和观点,这样就足够了。</p>
</li>
</ol>
<h1>书籍的分类</h1>
<p>谈到书籍的分类,那可是一门专门的学问。
看看图书馆的馆藏系统就知道了。
然而,在这里我可不想谈这些分类系统。
我对图书的分类是简单粗暴的,只有两类: 1. 信息接收类 2. 智识升级类.
这两类的划分是基于书籍对于读者的作用的。</p>
<h2>信息接收类</h2>
<p>这类书籍其实非常简单,它只是单纯的向你输出信息,阅读过程中不太会引起你的思考。
最典型的例子就是小说<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。
当然,除了小说以外,还有很多书籍都满足这样的定义,比如吴军老师的「<a href="https://book.douban.com/subject/26839342/">文明之光</a>」,罗曼罗兰的「<a href="https://book.douban.com/subject/1097835/">名人传</a>」.
注意,我这里说的只是<strong>阅读过程中不太会引起思考</strong>,并不代表整本书不会引起思考,而且这里我没有贬低这个类别的想法。
优秀的小说同样会引起读者的深思,比如<a href="https://zh.wikipedia.org/wiki/%E8%89%BE%E8%90%A8%E5%85%8B%C2%B7%E9%98%BF%E8%A5%BF%E8%8E%AB%E5%A4%AB">阿西莫夫</a>的「大银河帝国」系列,<a href="https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E7%A6%8F%E8%8E%B1%E7%89%B9">肯·福莱特</a>的「世纪三部曲」。这些小说作品荡气回肠,引人深思。
但是这些思考往往都是总结性,在完成阅读之前,你是不会产生太深的思考的。
这类书籍的优点在于,阅读过程不需要太消耗「脑力」,你可以在任何地点阅读,地铁上,步行中等等。</p>
<h2>智识升级类</h2>
<p>与信息接收类所对应的就是智识升级类书籍,这类书籍最大的特点就是字字珠玑,每一个段落都需要你消耗脑力来思考和消化,比如上文提到的「<a href="https://book.douban.com/subject/26636765/">经济解释</a>」,尤瓦尔·赫拉利的「<a href="https://book.douban.com/subject/26943161/">未来简史</a>」.
阅读这些书籍,不仅仅是阅读而已,还需要跟随作者的想法进行思考。
因此,这类书籍不太可能在地铁上进行阅读,没有一个安静的环境,你是无法静下心来品读这些经典的。</p>
<h1>阅读时机</h1>
<p>现代生活节奏快,想要静下心来好好阅读其实一点都不简单。
针对不同类别的书籍,我渐渐形成了自己的阅读习惯:</p>
<ol>
<li>
<p>信息接受类的书籍,一般都是利用闲散碎片时间进行阅读,比如走路去上课时、陪女朋友逛街时、晚上临睡前等。
因为这类书籍的内容并不需要太过深入的思考过程,仅仅接受信息。
当你看完一整本书后,这时我就安排一段固定的时间来写作一些读后感。</p>
</li>
<li>
<p>智识升级类的书籍,这些书籍需要调动很大的脑力进行阅读。因此我的习惯是每天安排一个固定的时间来进行阅读,在这段时间类任何人都别想打扰我,这段时间不需要太长,但必须每天坚持。
我已经把它当成了一种习惯。</p>
</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2018年1月7日 写作并发布初稿。</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>当然这也不是绝对的,很多小说也能发人深思。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>2017年度总结2018-01-01T00:00:00-07:002018-01-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2018-01-01:/words/Summary/<p>告别2017,迎接2018</p><h1>前言</h1>
<p>又是一年总结时,今年相比去年,可以说是静止的一年,各方面都没有太多显著的成果。
然而,不管多么糟糕,该总结还是要总结的。</p>
<h1>事业</h1>
<h2>科研</h2>
<p>科研方面确定了老板,开始了正式的科研工作。
在一年的工作中,从零到无的手写出了两个系统:</p>
<ol>
<li>multi-lable classification model, 该模型结合了word embedding的思想,学习得到label embedding。</li>
<li>Transition-based RST Parser</li>
</ol>
<p>在写代码的过程中,鼓捣了很多过去没有尝试过的东西:</p>
<ul>
<li>手写多进程</li>
<li>GPU并行编程</li>
</ul>
<p>然而,虽然有系统,却没有论文。
路漫漫其修远兮,吾将上下而求索。</p>
<h2>课程</h2>
<p>课程方面,这一年中一共选修了4门课程,一门TA工作。</p>
<p><img alt="spring" src="http://zhouyichu.com/images/spring.png"/>
<img alt="fall" src="http://zhouyichu.com/images/fall.png"/></p>
<p>在那么多的A中,耻辱地出现了一个B+,简直不忍直视。</p>
<h2>开源项目</h2>
<p>在2017最后的几天中,又鼓捣出了一个新的开源项目: ExAssist。
目前还在最后的内部测试中,即将发布。
这是一个科研实验的助手类工具。
它基本功能包括:</p>
<ol>
<li>记录每一次实验的元信息,包括: 开始时间,结束时间,结束状态,CPU占用时间,主机元信息。</li>
<li>每一次实验的配置信息</li>
<li>自动画出系统的loss curve</li>
<li>通过自己手动改写模板,能够分析任意的实验结果。</li>
</ol>
<p>每一次实验之后,此工具都会自动生成一个html页面,详细列出该次实验的各种信息。</p>
<p><img alt="ExAssist" src="http://zhouyichu.com/images/exassist.png"/></p>
<h1>生活</h1>
<h2>健身</h2>
<p>生活方便,坚持健身一年,成果如图所示:</p>
<p>{% asset_img workout.jpeg %}
<img alt="Workout" src="http://zhouyichu.com/images/workout.jpeg"/></p>
<h2>读书</h2>
<p>读书方面,今年的阅读量有所减少,一共阅读了69本书,其中小说45本,非小说24本。</p>
<p><img alt="Reading" src="http://zhouyichu.com/images/reading0.png"/>
<img alt="Reading" src="http://zhouyichu.com/images/reading1.png"/></p>
<p>其中我比较推荐的书目主要有:</p>
<p>小说类:</p>
<ul>
<li>肯·福莱特的世纪三部曲,从几大家族的兴衰中表现了20世纪人类世界的跌宕起伏,非常经典的小说,已经成为我的永久收藏之一了。</li>
<li>瑞典小说「一个叫欧维的男人决定去死」,这是一本属于温馨类的小说,从一个男人的自杀开始,逐渐展开这个男人的一生。插叙、倒叙交替使用,这种技巧在去年看的「无声告白」中也有大量的运用。这两本书有着异曲同工之妙。</li>
<li>解忧杂货店,东野圭吾的作品一向都是高质量的。这本「解忧杂货店」,利用时间穿越将各个不同时代的普通人连接到了一起,展现了人间之善。</li>
</ul>
<p>非小说类:</p>
<ul>
<li>Powerfull Sleep: 这是看过的研究睡眠最好的书籍,没有之一。这本书总结了到目前为止人类对于睡眠的理解,虽然对于睡眠的认知还远远不够,但这本书确实提供了很多有效的建议。</li>
<li>文明之光: 吴军博士的作品,从很多小事物中追溯历史发展的规律,极具启发性。</li>
<li>大败局: 吴晓波的作品。他用文字向我们展示了中国自改革开放之后商业战场上呈现出的各种光怪陆离的景象。虽然都已经是过去式了,但是从中可以看出中国当代商业的起步过程。</li>
<li>经济解释: 张五常先生的作品。我只看了前2两本,后面基本由于理解力有限,实在是看不懂了。尽管如此,但是张先生在书中以最严谨的文字阐述他对经济学的理解,我从中学到了不少的东西。</li>
</ul>
<table>
<thead>
<tr>
<th align="center">2014年</th>
<th align="center">2015年</th>
<th align="center">2016年</th>
<th align="center">2017年</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">27本</td>
<td align="center">37本</td>
<td align="center">81本</td>
<td align="center">69本</td>
</tr>
</tbody>
</table>
<p>今年的阅读量比去年少了10本左右,但是依然比前两年要多很多,看来这一年中阅读的习惯始终没有废弃。
希望能在2018创造新的阅读记录。</p>
<h1>感悟</h1>
<h2>模块化思想</h2>
<p>在这一年中,我最大的收获就是模块化我自己的生活。
在固定的时间做固定的事情,利用时间的累积效应,达到所预期的目标。
虽然在短期内,这套方法显得效率不高,但是它在最大程度上了保持了脑力的输出,减少了选择综合征出现的概率。
这样做能将自己的生活安排的井井有条,有一种掌控感,知道自己处于什么样的状态。
而不用时刻把所有的事情都装入脑中。</p>
<h2>习惯>意志力</h2>
<p>习惯的力量远远大于意志力。
其实这是同一件事,只是不同的理解角度而已。
如果我们把一件事当成是一种习惯,而不是一种消耗意志力的事情,那么这件事更能坚持下来。
比如每天早起这件事,一旦你把它当成了习惯,就不觉得有多辛苦了,也不会给自己增加额外的心理负担。</p>
<h2>全局化思维</h2>
<p>小到写一段代码,大到人生规划,我们都需要明确我们的目标是什么。
很多时候,我们太过关注当前的事情,忽略了长期的目标。
然而,长期的目标才是我们真正的目标。</p>
<p>为了看清长期的目标,我们就需要常常跳出局部的环境,从全局角度观察自己。
当你面对困难的时候,站在人生的角度想想,你现在面临的困难究竟是不是如你所想般那么的困难?一个月后你是否还会记得这件事?1年后呢?
一旦当你站在全局角度看待当前孤立的事件的时候,你就会发现,其实你所面对的困难只是沧海一粟,只是你整个人生经历中即将抛弃的一个点。
此时此刻,你的心态就会平静下来,集中注意力解决眼前的困难。</p>
<h1>总结</h1>
<p>就像我在「前言」中所说的,我的2017是没什么成果的一年.
然而,好的一面在于,在这一年里积累了不少的资源:</p>
<ol>
<li>两个可运行的系统,这说明我已经积累了足够的科研生产资料,希望能在2018能孵化出一两篇论文。</li>
<li>完成了大部分的课程学习任务和TA任务,接下去的一年可以有更多的时间花费在工作上。</li>
</ol>
<p>博士生涯的前奏已经完结,即将进入正曲。</p>
<h1>更新日志</h1>2017年11月书单2017-12-03T00:00:00-07:002017-12-03T00:00:00-07:00Flyawaytag:zhouyichu.com,2017-12-03:/reading-list/Reading-List-2017-November/<p>Reading-List-2017-November</p><h1>经济解释1</h1>
<p>作者: 张五常</p>
<h2>缺乏与竞争</h2>
<p>竞争规则: 应该在竞争中遵守的行为规范,跑步时不能把对手打到在地。
竞争准则: 评判竞争结果的方法。跑步时第一个跑过终点的就是竞争胜利。</p>
<p>竞争规则决定了竞争准则。</p>
<p>在市场经济下,竞争规则就是私有制,而竞争准则就是市价,而市价则是唯一不会产生浪费的竞争准则。
而竞争准则则会决定社会经济的行为。</p>
<h2>经济分析与价值观</h2>
<p>经济学只是分析什么样的选择会导致什么样的结果,至于结果的好与坏不是经济学来判断的。
判断好与坏则是一个伦理问题或价值观问题。
中国以前的人民公社导致民不聊生,为什么会导致民不聊生,这是经济学需要分析的,但是民不聊生是好还是坏则是一个主观判断了。
同样的道理,其实可以扩展到任何一个科学领域。</p>
<p>这真是一本非常好非常好的书,张五常先生真是有大家风范,文字非常严谨,从逻辑学开始,一步一步地严格说明了经济学到底是一个什么样的学科。
虽然有些地方需要反复阅读、思考才能理解,但是这本书确实让人获益良多。
记录脑图如下所示:</p>
<p><img alt="econmic_explaination_1" src="http://zhouyichu.com/images/econmic-explaination_1.png"/></p>
<h1>历代经济变革得失</h1>
<p>作者: 吴晓波</p>
<p>在这本书里,吴晓波主要讲述了中国历史上历代经济变革的得失,从制度方便分析了经济的变化规律。
其中有些思想让我印象深刻:</p>
<ol>
<li>中国文化本质上渴望一个大一统的国家,渴望一个中央集权的政府。</li>
<li>中国人对集权政治有着极强的忍耐力。</li>
<li>整个历史过程可以看成是中央与地方分权与收权的周期性变化,直到现在。</li>
</ol>
<p>由于是在工作的间隙看的这本书,我没能做出脑图来。
要说这本书告诉了我什么的话,我就最重要就是: 中国自有中国的道路,尽管有过混乱、有过动荡,但要想崛起,绝不是照搬西方的一套就能成功的。至于这条道路是什么样的,没人知道。</p>2017年10月书单2017-10-29T00:00:00-06:002017-10-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-10-29:/reading-list/Reading-List-2017-September/<ol>
<li>苏菲的世界 2. 浪潮之巅 3. 文明之光</li>
</ol><h1>苏菲的世界</h1>
<h2>自然派哲学家</h2>
<ul>
<li>泰利斯: 水是万物之源</li>
<li>安纳克西曼德: 无限定者构成了整个世界(很接近于原子论)</li>
<li>安那西梅尼斯: 气是万物之源</li>
<li>安娜萨格拉斯:大自然是由无数肉眼看不见的小颗粒组成, 所有事物都可以被分割成更小的部分。</li>
<li>德谟克利特斯: 每一种事物都是由“原子”组成的</li>
</ul>
<p>这个时期的哲学家探求的都是大自然的变化奥秘。</p>
<h2>雅典的哲学</h2>
<ol>
<li>
<p>苏格拉底: 追求永恒的真理。
苏格拉底和孔子很像,都没有留下自己的手稿,他们的思想能够留存是因为他们的弟子编纂整理了他们的言行。
奇妙的是,他们两位哲学家都是被弟子以对话录的形式记录了下来;同样被当时的当权者所厌弃,苏格拉底被赐毒而死,孔子一生颠沛,不受重用。</p>
</li>
<li>
<p>柏拉图</p>
</li>
</ol>
<p>柏拉图是苏格拉底最优秀的学生,也是继承了其衣钵的人。
他认为整个世界分为两部分: 理型的世界和感官的世界。
理型的世界是永恒不变的,是完美的;而感官世界是不断流动的,不是破损不完美的。
感官世界中的任何一个东西都是理型世界中的投影,都是不完整的。
而我们整个大自然就是处于感官世界中。
这样的思想很有意思,就像面向对象编程中的「类」和「实例」的关系,很有意思。</p>
<ol>
<li>亚里士多德</li>
</ol>
<p>亚里士多德的贡献在于他是第一个将大自然进行系统分类的人,同事他也创立了逻辑学,利用严格的推理来认知世界。</p>
<h2>希腊哲学</h2>
<p>在雅典之后,希腊文化开始兴起。
他们都是从柏拉图建立的学院开始的,后来演化出了4个不同的学派:</p>
<ol>
<li>犬儒学派: 真正的幸福不依靠稍纵即逝的东西</li>
<li>斯多葛学派: 相信宇宙有公理的存在,强调人要接受自然的命运。</li>
<li>伊壁鸠鲁学派: 人生至善之事乃是享乐。</li>
<li>新柏拉图学派: 宇宙万物都是一体的。</li>
</ol>
<h2>两种文化</h2>
<p><strong>印欧文化</strong></p>
<p>包括了所有的欧洲国家,信仰多神论。
他们认为整个世界是善与恶的战斗场,历史就是一个轮回,人生的终极目的就是要脱离轮回。
包括印度教和佛教。</p>
<p><strong>闪族文化</strong>
包括: 犹太教、基督教、伊斯兰教.
他们信仰一神论,他们认为历史是一条直线,人生的终极目标是等待最终审判的到来,从罪恶与谴责中得到救赎。</p>
<p>奇怪的是,后来闪族文化征服的整个欧洲大陆,一神论和直线型的历史观成为了欧洲的主流。</p>
<h2>中世纪</h2>
<p>中世纪是一段比较黑暗的时期,思想被压抑,教会垄断了教育。
所有的哲学活动都是围绕着上帝进行的。</p>
<h2>文艺复兴</h2>
<p>在这个时期,欧洲经济从自给自足的经济转化为货币经济。
人文主义开始流行,这时期一大批科学家先驱开始出现: 伽利略、牛顿。</p>
<h2>巴洛克时期(17世纪)</h2>
<ol>
<li>笛卡尔: 我思故我在。</li>
</ol>
<p>笛卡尔认为世间一切万物都是虚幻的,唯有思考本身才能让自己感受到自己的存在,因此而得出了「我思故我在」这样的结论。
他是现代哲学之父,是第一个试图用一个统一的哲学体系来解释整个世界。
他相信二元论: 这个世界是由思想与外扩组成的。</p>
<ol>
<li>史宾诺莎</li>
</ol>
<p><strong>人并没有自由意志,一切都是依照天性在生活</strong></p>
<p>这个观点很有意思,它是说,虽然我们觉得每个人是有自由意志的,能够选择自己喜欢的颜色,自己喜欢的衣服;但实际上所有的这一切都跳不出人类本身固有的限制。
比如人类需要群居、需要被爱、需要性生活,这些都是人类的天性,是大自然编码在人类体内的代码,人类是不可能突破这个天性的。
所以,说到底,人类的「自由意志」也仅仅是在一个很小的范围以内,从总体上看,人类并没有自由意志。</p>
<h2>经验主义</h2>
<p>从感官的经验获取一切关于世界知识的人。</p>
<p><strong>洛克</strong></p>
<p>我们所有的思想和观念都反映我们曾看过、听过的事物。</p>
<p><strong>休姆</strong></p>
<p>人应回到对世界有自发性感觉的状态。
无法回溯到特定感官认知经验的思想与观念都是无法接受的。</p>
<p>人有两种不同的感官:</p>
<ol>
<li>印象: 对于外界实在的世界感受</li>
<li>观念: 对印象的回忆</li>
</ol>
<p><strong>柏克来</strong></p>
<p>柏克来是一位天主教主教。
他认为我们的灵魂是形成我们各种概念的原因.</p>
<h2>启蒙运动</h2>
<ol>
<li>反抗权威</li>
<li>理性主义</li>
<li>启蒙运动</li>
<li>文化上的乐观态度</li>
<li>回归自然</li>
<li>自然宗教</li>
<li>人权</li>
</ol>
<p>自然神论: 相信上帝在万古之前创造了了世界,但从此以后没有再现身,他只是透过自然法则向人类显现。</p>
<h2>康德</h2>
<p>时间和空间属于人类的条件,时空是人类感知的方式,并非物质世界的属性。</p>
<p>事物的本来面目和我们看到的事物并不一定是一样的,我们看到的东西受到我们心灵的影响。</p>
<p>人类对于世界的观念受到两种因素左右:
1. 必须透过感官才能知道的外在情况
2. 人类的内在情况。</p>
<h2>浪漫主义</h2>
<p>向往大自然和大自然的神秘</p>
<p>代表人物: 谢林</p>
<h2>黑格尔</h2>
<p>世界不存在永恒的真理。</p>
<p>理性是动态的</p>
<p>辩证法是黑格尔最早提出的。</p>
<h2>个人主义</h2>
<p>能由理性推断的是事情都是不重要的,因为它独立于人而存在。
对那些无法被证明的事情才是重要的,因为你无法确切的知道它。</p>
<p>祁克果人生三段论:
1. 美感阶段: 只为现在而活。
2. 道德阶段: 对生命抱持认真的态度。
3. 宗教阶段: 信仰宗教</p>
<h2>马克思</h2>
<p>历史唯物主义</p>
<p>基础结构:</p>
<ol>
<li>生产条件</li>
<li>生产工具</li>
<li>生产关系</li>
</ol>
<p>人类社会的历史就是一部阶级斗争史。</p>
<h1>浪潮之巅</h1>
<p>作者: 吴军</p>
<h2>创业</h2>
<p>一将功成万骨枯</p>
<ol>
<li>创始人必须是一个实干家</li>
<li>能盈利的商业模型</li>
<li>判断力和执行力</li>
<li>运气</li>
</ol>
<h2>信息产业的规律</h2>
<ol>
<li>
<p>70-20-10定律: 一个市场通常有一个领导者(占有市场的70%),一个追赶者(占有市场20%),和一群跟跑者(占有市场不到10%)组成。
领导者之所以不消灭其他竞争者主要是因为反垄断的要求,保留它们这些竞争者利大于弊。
形成主导者的原因:</p>
<ol>
<li>规模优势,信息产业一旦大规模生产,制造成本可以忽略不计。</li>
<li>信息产业耦合性非常强,上下游依存度很高,容易形成壁垒。</li>
</ol>
</li>
<li>
<p>诺威格定理: 当一个公司的市场占有率超过50%以后,再也无法使市场占有率翻番。
启示: 我们需要前瞻性的预见到市场的饱和性,并且及时开拓新的成长点。</p>
<p>可行途径: 扩展现有业务和转型。</p>
</li>
<li>
<p>基因决定论,创始人对公司的发展有着不可磨灭的影响。</p>
</li>
</ol>
<p>商场如战场,这些总结出的规律并不是100%都是成立的,总是会有一些反例。
尤其是基因决定论,最著名的反例就是IBM,它成功地从硬件制造商转型为服务公司。</p>
<h1>文明之光</h1>
<p>作者: 吴军</p>
<p>吴军老师在文明之光中讨论了很多人类历史上不为人知但又意义重大的事件。
站在上帝视角来看待人类文明发展的过程,非常过瘾。</p>2017年8月书单2017-08-28T00:00:00-06:002017-08-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-08-28:/reading-list/Reading-List-2017-August/<ol>
<li>高效能人士的七个习惯 2. 穷查理宝典 3. 死亡通知单</li>
</ol><h1>高效能人士的七个习惯</h1>
<p>2、3年前曾经阅读过一次这本书,当时其实没有留下多少深刻的印象,也没有努力实践这几个习惯。
经过这几年的学习生活,再次拿出这本书来,感触很多。</p>
<h2>习惯一: 积极主动</h2>
<p>这里的积极主动是更为广泛的意义,指的是不要只是简单的对外界的刺激做出反应,而是停下来思考一下,面对已经发生的情况,我该如何做出合适的行为。
这个思想和我想要达到的心如止水的状态不谋而合。
我想这几年来这是我唯一做到过的一个习惯吧。</p>
<p>任你外界八面威风,我内心只一路去!</p>
<h2>习惯二: 以终为始</h2>
<p>老实说,第一次阅读的时候,我想我并没能真正理解这个习惯的含义。
以终为始: 做任何事情之前都要认清方向。
在处理每一件事情的时候,都不要忘记你的目标是什么,不要被生活中的琐事给淹没了。
以原则为中心生活。</p>
<h2>习惯三: 要事第一</h2>
<ul>
<li>利用时间管理矩阵,区别出真正有意义的事情。</li>
<li>学会说不。其实这就像是剪枝,将那些不重要的事情剪除,才能足够专心处理重要的事情。少即是好!</li>
<li>授权: 并不是每件事情都需要事必躬亲的,实际上这只会降低你的产能。
个人案例:之前要实现一个machine learning的系统,从头到尾都是自己写的代码,虽然对代码的掌握程度很强,然而却要花费大量的时间去进行细节调试。
如果我一开始就使用一些开源包,性能和时间都能得到节省。
授权有两种不同的形式:<ol>
<li>指令性授权: 告诉别人怎么做</li>
<li>责任性授权: 关注最终的结果</li>
</ol>
</li>
</ul>
<h2>习惯四: 双赢思维</h2>
<ul>
<li>建立充足的情感账户</li>
<li>双赢步骤:<ol>
<li>从对方角度看问题</li>
<li>认清主要问题和顾虑</li>
<li>确定大家都能接受的结果</li>
<li>找到实现这种结果的各种可能途径</li>
</ol>
</li>
</ul>
<h2>习惯五: 知彼解己</h2>
<ul>
<li>学会聆听,真正花时间去聆听,而不是简单的敷衍</li>
<li>四大误区:<ol>
<li>价值判断</li>
<li>追根究底</li>
<li>好为人师</li>
<li>自以为是</li>
</ol>
</li>
</ul>
<h2>习惯六:统和综效</h2>
<ul>
<li>判断和尊重差异,取长补短。</li>
<li>沟通的三个层次:<ol>
<li>低层次: 人与人之间互相提防,步步为营,为情况恶化做打算</li>
<li>中间层次: 彼此尊重的交流方式,双方保持礼貌,却不一定为对方设想。</li>
<li>第三条路: 跳出非此即彼的思想</li>
</ol>
</li>
</ul>
<h2>习惯七: 不断更新</h2>
<ul>
<li>不断更新的四个方面:<ol>
<li>身体</li>
<li>精神</li>
<li>智力</li>
<li>社会/情感</li>
</ol>
</li>
<li>学习、坚持、实践,螺旋式地上升</li>
</ul>
<h1>穷查理宝典</h1>
<p>作者: 彼得·考夫曼</p>
<p>这是一本久负盛名的书,然而阅读下来,真正带给我的启发并不多。
我想主要还是因为领域有所不同,目前我所关注的东西暂时还不是这本书的主要内容,它无法引起我的共鸣。</p>
<h1>死亡通知单</h1>
<p>作者: 周浩晖</p>
<p>国产侦探小说,写得很不错。
推理逻辑很扎实,值得一看。</p>2017年7月书单2017-08-07T21:27:32-06:002017-08-07T21:27:32-06:00Flyawaytag:zhouyichu.com,2017-08-07:/reading-list/Reading-List-2017-July/<p>1.清明上河图密码4 2. 历史深处的民国 3.六道众生 4. 田园 5. 2.5次世界大战</p><h1>清明上河图密码4</h1>
<p>作者: 冶文彪</p>
<p>等了一年多,第四部终于出来了,第一时间就买了。
还是同样的风格,案中有案,层层嵌套。
纯技术流的小说。</p>
<h1>历史深处的民国</h1>
<p>作者: 江城</p>
<p>自从「明朝那些事」火了之后,一大波同样风格讲历史的书就像雨后春笋般出现了。
虽然以诙谐的口吻来讲述历史,很能吸引人。</p>
<p>这部「历史深处的民国」走的是同样的套路,以诙谐的手法调侃每一个历史人物。
由于民国还算是「前朝」,作者有意回避了很多历史细节,不过,这也可以理解。</p>
<h1>六道众生</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BD%95%E5%A4%95">何夕</a></p>
<p>这是第一次阅读何夕的作品,是一种不太一样的科幻风格。
他关注的更多的是人文精神方便,而不是科幻本身。</p>
<p>本作故事描述的是人类创造出了六个不同的平行世界来缓解人类人口膨胀带来的压力,这六个平行世界由于能量的基本单元大小不同,相互直接没有任何联系。
然而,突然出现了两个能够自由穿梭多个世界的人,打破了六个世界的平静生活。</p>
<p>作者想用这六个世界对照佛教中的六道轮回,然而这样的映射似乎有点牵强。
除了同样是数字6以外,6个平行世界和佛教的六道轮回没有什么关系。</p>
<h1>田园</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BD%95%E5%A4%95">何夕</a></p>
<p>本作中的「何夕」利用基因技术培育出了传说中的禾木,一种多年生的木本植物,只要播种一次,就能不断产出小麦。
以这个基础,作者讨论了基础科学研究与前沿科学研究的矛盾。
科研研究也是受到经济规律的影响的,能够带来的经济效益的研究才会得到资金支持。
然而,真正能够推动人类社会大步伐前进的却是基础科学,然而短期内基础科学不会带来任何经济效益。</p>
<h1>虫:2.5次世界大战</h1>
<p>这是一本银河奖的获奖作品集,收录好几个科幻短片和中篇,很有意思。</p>
<p>印象比较深刻的是王晋康的「2.5次世界大战」,其中描写了几个顶尖的科学家利用神经学技术,将自己的思维连接起来,组成了一个思维能力更为强大的思考体。
利用这样的技术,他们几个人迅速得出了宇宙的大统一模型,将人类科技强力向前推进了500年。
然而,由于他们觉得人类社会还不够成熟,还无法驾驭这样的技术,因此他们选择将这个技术封存起来。
后来发生的战争表明,现在的人类确实还无法驾驭领先这个时代的科技。</p>
<h1>更新日志</h1>2017年6月书单2017-07-03T00:00:00-06:002017-07-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-07-03:/reading-list/Reading-List-2017-June/<p>1.只有医生知道 2. 好好学习 3. 美国众神 4.永恒的边缘</p><h1>只有医生知道</h1>
<p>作者: 张羽</p>
<p>这只是三本系列书籍的第一本,主要是讲妇科大夫的日常。。。。</p>
<p>虽然干货不多,也不够系统,但是还是很有鉴于我在这方面毫无了解,这本书还是提供了大量的实用知识。</p>
<p>脑图如下:</p>
<p><img alt="Only-doc-knows" src="http://zhouyichu.com/images/only-doc-knows.png"/></p>
<h1>好好学习: 个人知识管理指南</h1>
<p>作者: 成甲</p>
<h2>临界知识</h2>
<p>临界知识: 少数知识能够给我们带来关键的影响.</p>
<p>两个基本思想:</p>
<ol>
<li>绿灯思维: 放下自己的防卫心理,接受不同的观点、假设。</li>
<li>以慢为快: 把慢功夫放在真问题上,花大力气理解关键概念,融会贯通。</li>
</ol>
<p>具体的方法:</p>
<ol>
<li>
<p>反思: 深刻分析事件发生的原因、假设是否合理。
这就好比是在做科研,你做出假设,进行实验,实验结果不理想,那就需要反思假设哪里出了问题。
对于一个假设,需要精雕细琢。</p>
<p>对标模型、对比模型、目标模型都是同一个概念,都是在说我们需要有一个标尺来对比你的行为。
最近两年来,我一直在坚持每天写日记,但是每每写日记的时候,总是写不出的东西来。
在我眼中,每一天都是长的如此相似,记无可记。
看了本书,出现上述情况的原因之一也许就是因为没有参照系,没有对照目标,无法进行深入的反思。</p>
<p>关于反思,书中提到了一个小技巧: <strong>记录自己的情绪和思考过程,而不是单纯的记录事情的结果</strong></p>
<p>反思的三个方法:
1. 从小事反思,深入突破
2. 把生活案例化: 我们每天都在发生经验,然而只有经验却没有反思。从具体的案例中抽象出规律。
3. 培养记反思日记的习惯</p>
</li>
<li>
<p>以教为学
教10%的内容,你需要准备100%的知识。</p>
</li>
<li>
<p>刻意练习
提高元认知水平,建立心里图谱。</p>
<ol>
<li>对基本核心知识划小圈</li>
<li>将基本知识组合成更大的能力单元</li>
<li>在各知识能力单元之间构建认知框架</li>
</ol>
<p>这三点似乎就是罗胖子曾经提到过的点线模型,先一个个扎实的做好点,然后把这些点连城线,然后再在新的线上面打孔建点。</p>
</li>
</ol>
<h2>提升学习能力</h2>
<ol>
<li>记录<ol>
<li>如实记录。我们的大脑会扰乱我们的记忆,就像是在看看哈哈镜。
因为我们需要及时、客观的记录重要的事件。
另外,如实记录的时间越长,越能让自己看到更深层的规律。</li>
<li>
<p>记录是一个主动思考的过程,记录不仅仅需要记录所做出的决定,还需要记录影响决策的所有因素,以便于我们将来复盘整个过程。
如何记录思考过程:</p>
<ol>
<li>思考时的目标是什么</li>
<li>在这个目标下考虑到了哪些因素,哪些因素没有考虑到</li>
<li>当时为什么要这么考虑,哪些因素失控了</li>
<li>实际结果和预期之间的差距</li>
</ol>
<p>其实,将这几个步骤抽象出来就是: 目标(1)、过程(2,3)、结果(4).
2. 定期回顾
1. 周/月回顾
a. 本周/本月的期望是什么
b. 实际情况如何
c. 为什么
d. 总结经验
2. 年度回顾
3. 五年以上的回顾:
a. 审视我们现在所处的状况: 骄傲事情是什么,成就是什么,困难与障碍是什么
b. 三条线记录事件: 自己身上的重要事件;家庭、公司的重要事件;发生在全局的重要事件
c. 思考这些事件的联系,它们是如何影响我们的。</p>
</li>
</ol>
</li>
</ol>
<h2>刻意练习</h2>
<ol>
<li>抓住问题的本质进行练习
品牌起名的十大原则 vs 降低传播成本
很显然,所谓的十大原则并不是问题的本质,只是这个问题技术层面上的解答;本质是要"降低传播成本".</li>
<li>大量持续的练习</li>
</ol>
<h2>核心临界知识</h2>
<h3>复利效应</h3>
<p>复利效被称为世界第八奇迹。
复利效应的本质: <strong>A导致B,而B又能继续增强A,整个过程是一种正反馈机制</strong></p>
<p>两个关键点:</p>
<ol>
<li>利率</li>
<li>时间</li>
</ol>
<p>不是很小的利率加上很长的时间就能引起一次大爆炸.</p>
<p>我已经在很多本书中看到这个概念了,然而,我在现实生活中的应用似乎从来没有引爆过什么。。。</p>
<h3>概率论</h3>
<p>这个世界也许并不是严格按照因果律的,我们应该把我们的生活看成是一个概率分布。
一次成功,也许不代表你做对了什么,仅仅是因为“运气”,小概率事件也是有可能发生的;同样,一次失败,也许也不代表你做错了什么,仅仅是因为你运气不好,大概率事件也不是必定发生。
如果我们能够这么看待这个世界,那偶尔几次的失败或成功并不能说明什么。
这种思维方式给我们的启示在于: </p>
<p><strong>不断投入到概率大的事件中,避免小概率事件造成的打击.
我们能够通过努力,最大化事件发生的likeihood,而永远不能保证100%</strong></p>
<p>比如健身这件事,目前人们对于练出/保持好身材这件事的认知是做好吃、睡、练三部分。
但是做好吃、睡、练也不一定保证有好身材,只能说做好这三点,你将会有大概率得到一个好身材。
毕竟人类对于自己的认知还是很粗浅的。</p>
<h3>黄金思维圈</h3>
<p>What-How-Why</p>
<p>思考问题要从问为什么开始</p>
<p>透过问题的表象看到本质。</p>
<p>以前我看书做脑图的时候,总是试图摘录书中的提出的各种技术方法,而没有去考虑这些方法为什么有效。
突然之间发现,过去很多都是白读了,因为我没能从这些书籍中获取对我来说真正有用的知识。
我仅仅是在记录what和how,而很少思考why.</p>
<p>真正有价值的东西其实是why,只有理解了why,你才能构造出属于自己的、适合自己的方法!</p>
<h3>进化论思想</h3>
<p>不要抓住过去的思想不放手,在环境发生变化的时候做出积极的响应.</p>
<ol>
<li>精益创业: 最小成本试错。</li>
<li>模仿领先者的行为: 变化的环境才不管你是模仿还是原创,只要你适应环境就可以了。</li>
</ol>
<h3>系统思考</h3>
<p>两个重要假设:</p>
<ol>
<li>系统结构决定“部分”的行为。</li>
<li>
<p>系统不是简单的线性因果关系。也许这个世界未必是严格按照因果律运作的。
系统中的每件事都是相互影响的,因就是果,果就是因。
突破口: 从事物的互动“关系”入手。</p>
<p>概率图模型,关注事物之间的关系!</p>
<p>关键点: 找到系统中的特定位置,施加小小的变化,就能导致系统行为发生重大变化。</p>
<p><strong>学习系统性思维</strong>
1. 关注关系而非事物
2. 分析系统结构
3. 独立思考,快速试错,观察系统结果
4. 系统关键解有时在信息制高点。</p>
</li>
</ol>
<h3>二八法则</h3>
<p>20%的朋友给你带来80%的价值</p>
<p>20%的关键朋友: 和我们拥有差异资源的人脉</p>
<p>结构洞-->带来差异化信息</p>
<p>蜂窝式结构
和朋友建立信任感:
1. 自我暴露
2. 做一个给予者</p>
<p>二八法则出现的原因: 系统正反馈机制。
初始条件相同,但是影响因素会不断叠加。</p>
<p>20%的工作,决定80%的业绩成果。
以后,每当在工作上面临决策时候,思考二八法则</p>
<h3>安全空间</h3>
<p>建立有效的安全空间:</p>
<ol>
<li>建立冗余备份机制</li>
<li>精简: 减少极端事件的发生概率</li>
<li>提升系统的反脆弱性,增强系统对极端事件的应对能力</li>
</ol>
<p><img alt="Person-Knowledge" src="http://zhouyichu.com/images/person-knowledge.png"/></p>
<h1>美国众神</h1>
<p>作者: [Neil Richard Gaiman][]</p>
<p>这本书在很多网站上都被打上了科幻的标签,然而实际读下来,根本就是一本奇幻小说,和科幻没有半点关系。。。
主要讲的就是新神与旧神之间的战争。
虽然网上的风评很不错,但我觉得还是没到让我惊艳的程度。
也许因为我对西方神话中的那些神祗不是那么了解,无法真正体会作者的表达吧。</p>
<h1>永恒的边缘</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Ken_Follett">Ken Follett</a></p>
<p>世纪三部曲终于看完了,三代人的故事终于迎来了完结。
在这第三部中,记述了几个重要的历史事件:</p>
<ol>
<li>古巴导弹危机</li>
<li>美国黑人的平权运动</li>
<li>美国水门事件</li>
<li>东欧各国的社会主义变化</li>
<li>苏联的政治变化</li>
</ol>
<p>从这些处于关键位置上的「小人物」视角观看了上个世纪后半叶的世界局势,十分过瘾。</p>
<p>世纪三部曲完整讲述了整个20世纪人类的两次世界大战以及战后的世界政治秩序,掺杂了大量平凡人物心酸生活史。</p>
<h1>参考资料</h1>
<h1>更新日志</h1>2017年5月书单2017-05-31T00:00:00-06:002017-05-31T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-05-31:/reading-list/Reading-List-2017-May/<ol>
<li>老人战争 2. 幽灵舰队 3. 消失的殖民星球 4. 群星,我的归宿 5. 少年维特的烦恼 6. 亲爱的安德烈 7. 名人传 8. 交响乐十八讲 9. 一个叫殴维的男人准备去死</li>
</ol><h1>老人战争</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/John_Scalzi">John Scalzi</a></p>
<p>这又是一部以外星为题材的科幻作品,不过,尽管它曾被提名雨果奖,但是它并没有带给我很大的惊喜。
书中的很多设定让人无法理解,很多细节深入思考之后就会发现其实这样的背景设定并不合理。</p>
<p>比如:</p>
<ul>
<li>人类已经发展到了能够向外星殖民了,为什么地球却一直在被压制,从演变的角度也不太可能出现这种情况。</li>
<li>人类已经能够利用基因和克隆技术创造超强肉体,并且能够传送意识,为什么这些技术没有被用来追求人类的永生,从而产生伦理、社会的一系列问题。
要知道,追求永生可是人类上千年来的终极梦想。</li>
<li>既然宇宙中存在那么多需要相同环境的智慧生物,为什么没有形成联盟,而仅仅只是相互争夺殖民地。
相互争夺的结果只能是零和博弈。</li>
</ul>
<p>不过,尽管它的设定我无法完全认同,但是写作手法还是很流畅的,一口气读完,还是很过瘾的。
看得出,作者试图制造出类似<a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a>笔下的庞大世界观。
然而,和大神<a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a>相比,还是有一定的差距。</p>
<h1>幽灵舰队</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/John_Scalzi">John Scalzi</a></p>
<p>这是承接「老人战争」宇宙观设定的另外一个故事。
主要介绍了一个企图背叛人类整个种族的科学家被自己的克隆体打败的故事。
撇开那些我认为不合理的背景设定之后,整篇故事比「老人战争」要更加凝练和成熟。
然而却并没有太多的惊喜,故事走向一直处于预料之中。</p>
<h1>消失的殖民星球</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/John_Scalzi">John Scalzi</a></p>
<p>这是「老人战争」系列的第三部,主角又回到了第一部中的主角佩里身上。
这次他担任了一个人类新殖民地的总督,带领2500人开拓一个新的星球。
然而,这颗星球却成为了全宇宙各个智慧文明的博弈中心。
经过一系列的运筹帷幄之后,主角再一次化解了危机,并开启了新的时代。</p>
<p>从大的框架来说,尽管它试图模仿「基地系列」营造一个庞大的宇宙世界观,但是总觉得缺少了一些什么,缺少了一些细节。
并且由于整个大的背景设定不够具有说服力,阅读过程中很容易出戏。</p>
<p>不过,它也还算是比较好看的科幻小说,算是我最近一段时间以来读到的比较好的科幻作品了。</p>
<h1>群星,我的归宿</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Alfred_Bester">Alfred Bester</a></p>
<p>豆瓣上对这部小说有很高的评价,其他评论网站上也是好评居多。
然而,我并不觉得这部作品如传言所说的那么好。</p>
<p>首先是节奏感并不是很强,章节之间切换时很容易出戏,剧情跳跃不太自然。
整体剧情我无法接受,简单来说就是一个科幻版的复仇故事。
其中充满了个人英雄主义的色彩。
整体讴歌的是个人的力量,然而面对浩瀚无垠的宇宙,个人的力量难道不是无比渺小的吗?
后来查询的时候,才知道原作者参与了超人这个这个超级英雄的设计,那么其小说中包含了浓郁的个人英雄主义色彩就不奇怪了。</p>
<p>我可以看得出作者试图构造一个宏大的未来图景,然而总觉得不是很自然。
思动的设定就让人不太能接受了,在未来世界,竟然每个人都可以瞬间移动?</p>
<p>现在我每阅读一部科幻作品,我都会将其和<a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a>做比较。
实话说,这部小说依然没能达到「基地系列」的水准,文字略显粗糙,不如Isaac那么细腻和有深度。</p>
<h1>少年维特的烦恼</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Johann_Wolfgang_von_Goethe">Johann Wolfgang von Goethe</a></p>
<p>这可以说是一本青少年读物,是歌德年轻时最重要的一部作品。
然而,现在的我阅读起来,似乎已经无法感同身受了。
全文表达的仅仅是一个青年的感情困扰,爱上了一个不该爱的人。
其实,用现在的话来说,他就是在钻牛角尖。</p>
<p>由于其广为人知的名气和我的阅读感受并不一致,特意去查询了一下本书的写作时代和背景。
本书出版于1774年,当时正是各种新思想、解放运动兴起的时候。
这篇作品从一个「第三者」的角度描绘了爱情的纯洁,在当时应该算是超越当时时代的。
大大激励了年轻人敢爱敢恨的精神。</p>
<p>明白了这一点之后,我就释然了。
我并没有受到大的触动,是因为我对自由恋爱这一思想早已接受并认为是理所当然的,因此本书并未能引起我的共鸣。</p>
<p>除了内容主旨以外,本书的写作可谓是非常的优美,对自然景物有着深入的描写,但又不会觉得拖沓,阅读感受非常好。</p>
<h1>亲爱的安德烈</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E9%BE%8D%E6%87%89%E5%8F%B0">龙应台</a></p>
<p>上次阅读<a href="https://zh.wikipedia.org/wiki/%E9%BE%8D%E6%87%89%E5%8F%B0">龙应台</a>的书应该是在研一的时候,阅读她的「野草集」,当时她的文笔很犀利,引起了我不少的思考。</p>
<p>本书是她和儿子的通信记录,总体感觉她对这个儿子充满了无奈与妥协。
过去曾经以为,一个受到多种文化教育的孩子长大之后多半会成为一个比较优秀的人。
然而,看了本书我发现,其实多文化教育并不代表一定了培养出优秀的人才。
安德烈的观点总体感觉属于比较颓的,和东方文化格格不入。</p>
<p>虽然我并不认同他的大多数观点,但是他的思想是独立的,是纯粹的,并没有受到「权威」的压制。</p>
<p>书中有些话很有意思,我摘录如下:</p>
<blockquote>
<p>不要无条件地相信理想主义者,除非他们已经经过了了权力的测试。</p>
<p>所以每一次的受伤都是人生的必修课,受一次伤,就在人生的课表上打一个勾,面对下一堂课。</p>
<p>我也要求你读书用功,不是因为我要你跟别人比成就,而是因为,我希望你将来会拥有选择的权利,选择有意义、有时间的工作,而不是被迫谋生。</p>
</blockquote>
<h1>名人传</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Romain_Rolland">Romain Rolland</a></p>
<p>一口气读了三个伟大艺术家的传记,然而却收获不多。</p>
<p>主要原因是传记写作实在让人读不下去,传记并不是按照时间线来写的,让我很难勾勒出伟人的整体人生轨迹。
书中虽然有很多引用,但是这些引用有断章取义之嫌。
我相信人的是会随着时间不断改变的,你用20岁时写的一封信就能证明一个人一生的观点吗?
显然是不可能的。</p>
<p>另外,尽管罗曼罗兰的大名如雷贯耳,但是他的作平真的是很难读下去(不排除是翻译的问题)。
包括之前读的「约翰克利斯朵夫」,耐着性子读了一个多月,才读了不到一半。</p>
<p>此处并没有贬低罗曼罗兰的意思。
实际上,罗曼罗兰是出生在19世纪的,他的文字对于我们来说应该已经算是古文了吧。
难怪阅读起来会如此的痛苦。</p>
<p>总体上来说,这三本传记给我留下的唯一印象就是,这三个艺术伟人都是非常固执、臭脾气的,虽然生活不尽人意,但对艺术的追求却从不妥协。</p>
<h1>交响乐十八讲</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E5%88%98%E9%9B%AA%E6%9E%AB">刘雪枫</a></p>
<p>抱着好好了解一下古典音乐的目标才读了这本书。
虽然没能完全满足我原始的期望,但是还是帮我大体勾勒出了整个古典交响乐的框架。</p>
<p><img alt="symphony" src="http://zhouyichu.com/images/symphony.png"/></p>
<p>要想通过一本书就了解整个领域显然是不可能的,后续我想我还会继续阅读有关音乐方面的书籍。</p>
<h1>一个叫殴维的男人准备去死</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Fredrik_Backman">Fredrik Backman</a></p>
<p>又是一本治愈型的书。</p>
<p>我是先看了电影介绍然后再看书的,最后又去看了一遍电影。
整体风格和「一个人的朝圣」非常相似,都是一个平静而温暖的平凡故事。</p>
<p>故事十分简单:一个失去妻子的孤寡老人在寻死的路上被各种打断,而又因为其外冷内热的性格得到了新邻居的喜爱,最终放弃了寻思之路。
故事小巧和温暖。</p>
<h1>参考资料</h1>
<h1>更新日志</h1>
<ul>
<li>2017年5月5日 添加「老人战争」</li>
<li>2017年5月5日 添加「幽灵舰队」</li>
<li>2017年5月5日 添加「消失的殖民星球」</li>
<li>2017年5月16日 添加「群星,我的归宿」</li>
<li>2017年5月16日 添加「少年维特的烦恼」</li>
<li>2017年5月16日 添加「亲爱的安德烈」</li>
<li>2017年5月29日 添加「名人传」</li>
<li>2017年5月29日 添加「交响乐十八讲」</li>
<li>2017年5月31日 添加「一个叫殴维的男人准备去死」</li>
</ul>Vim个人配置文件2017-05-14T00:00:00-06:002017-05-14T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-05-14:/vim/Vim-Configuration/<p>Vim的个人配置文件,主要针对Python、Latex的配置。</p><p>本篇博文对自己的Vim配置文件进行了说明.</p>
<h1>插件配置</h1>
<p>一共使用了13个第三方插件,主要列表和说明如下:</p>
<ol>
<li><a href="https://github.com/SirVer/ultisnips">UltiSnips</a>: 代码片段的插件,能够根据你输入的代码片段进行自动不足。还能设置自定义代码片段进行补足。</li>
<li><a href="https://github.com/honza/vim-snippets">vim-snippets</a>: 同样是代码插件,包含了大量预定义的代码片段。</li>
<li><a href="https://github.com/vim-scripts/The-NERD-tree">The-NERD-tree</a>: 老牌的文件管理插件,在我的配置里快捷键配置为F10和F9,F10打开树形文件浏览窗口,F9关闭窗口。</li>
<li><a href="http://www.vim.org/scripts/script.php?script_id=2657">VOoM</a>: 文档目录浏览插件,支持绝大部分文件类型,包括Python,markdown等文件格式。在我的配置文件中,常用的Python、markdown、tex等文件类型自动启用该插件。另外设置了快捷键F8,对插件进行启用和关闭。</li>
<li><a href="https://github.com/Yggdroot/indentLine">indentLine</a>: 显示各级缩进的插件,对于像Python这样利用缩进排版的语言特别有用,不可或缺。</li>
<li><a href="https://github.com/vim-airline/vim-airline">vim-airline</a>: 显示各个打开文件的状态插件,对于同时编辑多个文件的情况下,非常有用。</li>
<li><a href="https://github.com/scrooloose/nerdcommenter">nerdcommenter</a>: 快速注释和解开注释。</li>
<li><a href="https://github.com/vim-syntastic/syntastic">syntastic</a>: 这也是一个神器插件,能够自动对各种语言进行语法检查,对保持一个良好的代码风格很有帮助。</li>
<li><a href="https://github.com/moll/vim-bbye">bbye</a>: 管理文件缓冲区,可以同时打开各个不同的文件。</li>
<li><a href="https://github.com/ervandew/supertab">supertab</a>: 代码自动补全插件,但是只能补全已经存在代码。</li>
<li><a href="https://github.com/rizzatti/dash.vim">dash</a>: Dash的辅助插件,和Vim结合之后能够自动搜索文档内容。</li>
<li><a href="https://github.com/pangloss/vim-javascript">vim-javascript</a>: Javascript的语法辅助插件。</li>
</ol>
<p>这13个插件都是用<a href="https://github.com/VundleVim/Vundle.vim">Vundle</a>进行管理的,非常方便。</p>
<h1>个人配置</h1>
<p>关于个人配置上面,我主要针对Python、markdown和tex文件进行了一系列的配置。
详细配置可以在{% post_link Vim-Insert-Title Vim自动插入文件头部 %}中和具体的配置文件中查看。</p>
<h1>配置效果</h1>
<p><img alt="Vim" src="http://zhouyichu.com/images/vim.png"/></p>
<h1>一键安装</h1>
<p>我将我所有的配置都放在了Github上面,并且写了相应的shell,可以做到一键安装配置。
具体地址在: <a href="https://github.com/flyaway1217/dotfiles">https://github.com/flyaway1217/dotfiles</a></p>
<h1>更新日志</h1>
<ul>
<li>2017年5月14日写作并发表初稿。</li>
</ul>2017年四月书单2017-05-01T00:00:00-06:002017-05-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2017-05-01:/reading-list/Reading-List-2017-April/<ol>
<li>幻夜 2. 罗生门 3. 世界的凛冬 4. 巨婴国 5. 未来简史</li>
</ol><h1>幻夜</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>从剧情上来看,这是「白夜行」的续集,但是比「白夜行」更加黑暗。
雪穗失去了亮司之后,彻底失去了唯一的光明,彻底黑化成为了「幻夜」中的新海美冬。</p>
<p>其实,有时候很是佩服美冬,一个人的心理是要多么的强大,心思是需要多么的细腻,才能算无遗策,才能一往无前呢?
无疑,美冬这个形象已经脱离现实了,似乎仅仅是体现了东野圭吾对「魔女」这个形象的迷恋。</p>
<p>另外,在写作手法上感觉并没有「白夜行」那么精致,有点平凑的感觉。</p>
<h1>罗生门</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/芥川龙之介">芥川龙之介</a></p>
<p>不得不承认,这本短篇集合我是完全没能看懂……
仅仅就表面文字过了一遍。</p>
<p>芥川的文字很忧郁,甚至有些黑暗的感觉。
目前不太符合我的口味,也许若干年后,我会重读他的作品。</p>
<h1>一个人的朝圣</h1>
<p>作者: <a href="http://baike.baidu.com/item/%E8%95%BE%E7%A7%8B%C2%B7%E4%B9%94%E4%BC%8A%E6%96%AF">蕾秋·乔伊斯</a></p>
<p>一个懦弱男人晚年最后的救赎。</p>
<p>整个故事就是在告诉我们,没事就要多出去走走,老是闷在一个地方,不仅身体禁锢了,思想也被禁锢了。</p>
<p>当然,出去浪的前提就是要保持联系,如果哈罗德一个人踏上旅程,且并没有和莫林保持联系,我想他是不会自重达到的目的地的。</p>
<h1>世界的凛冬</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Ken_Follett">Ken Follett</a></p>
<blockquote>
<p>每一个迈向死亡的生命都在热烈生长。</p>
</blockquote>
<p>用这句话形容整部小说最贴切不过了。</p>
<p>「巨人的陨落」中的贵族们纷纷谢幕,新时代的人们登上了历史舞台。
小说的大部分人物都来自「巨人的陨落」中人物的第二代,历史的巨轮裹挟着一代又一代的往前走。
其中很多人物的成长,都让人感慨激动。</p>
<p>小说的角度恰到好处,很多人物都是权力中心的边缘人物,既能通过让他们的视角描述整个历史事件,也能从他们身上看到一个个平凡的普通人,如何被历史的潮流所裹挟。</p>
<h1>巨婴国</h1>
<p>作者: <a href="http://baike.baidu.com/item/%E6%AD%A6%E5%BF%97%E7%BA%A2">武志红</a></p>
<p>在我看来这是一本内容有料,但是组织很差的书。
之所以说有料,是因为它很好地分析了中国人的心理特征,提出了巨婴的概念,并进行了详细的阐述。
让我从深层次了解了中国的家庭的构成要素以及到底是什么集体主义。
从内容上说,这确实是一本无可非议的好书,强烈推荐。</p>
<p>然而,从写作或者说全书的组织结构来说,我觉得真是差到爆了。
各个标题词不达意,根本反应不出章节的主旨,而且说话很啰嗦,同一个的子主题会出现书的不同地方,反复叙述,而不是统一有条理的叙述。
整本书只是N篇博文的集合体,毫无组织结构。</p>
<p><img alt="巨婴国" src="http://zhouyichu.com/images/gaintbaby.png"/></p>
<h1>未来简史</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Yuval_Noah_Harari">Yuval Noah Harari</a></p>
<p>一图胜千言,直接上脑图:</p>
<p><img alt="Future" src="http://zhouyichu.com/images/future.png"/></p>
<p>人类过去的三大议题:</p>
<ul>
<li>饥荒</li>
<li>瘟疫</li>
<li>战争</li>
</ul>
<p>人类现在的三大议题:</p>
<ul>
<li>追求不死</li>
<li>追求幸福</li>
<li>升级成为智神</li>
</ul>
<p>书中提出了很多有趣的观点:</p>
<ul>
<li>生物本身也是一套精密的算法,根据外界的刺激作出适当的反应。</li>
<li>计算机有没有自我意识不重要,重要的是的智能是否已经超越人类。计算机不需要有意识就能消灭人类。</li>
<li>科学用于事实声明,而宗教用于伦理判断</li>
</ul>
<p>总体上作者认为科技对人类社会的影响越来越大,我们的社会形态也会逐渐改变。</p>
<h1>更新日志</h1>2017年2月书单2017-02-27T00:00:00-07:002017-02-27T00:00:00-07:00Flyawaytag:zhouyichu.com,2017-02-27:/reading-list/Reading-List-2017-February/<p>1.神探伽利略 2.神塔伽利略2 3.黑笑小说 4.禁忌魔术 5.湖畔杀人事件 6.最璀璨的银河 7.时间回旋 8.刻意练习 9.放学后</p><h1>神探伽利略</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>一共由五篇短篇组成,主题就是解决看似超自然但其实是人为的案件。
还算精彩,采用了一些不为人知的物理技术来解释案件。
无聊时可以看看。</p>
<h1>神探伽利略2</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>风格和第一部很像,由几篇短篇组成,同样是解决一些貌似灵异的案件。
解谜过程还是挺具有可读性的。
但是,在人物刻画上觉得不太丰满,汤川学的人物形象一直没有什么深入的描写,不过对于侦探小说来说,似乎也没什么必要。</p>
<h1>禁忌魔术</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>还是一些短篇的集合,东野的产量挺高,已经看了好几本短篇集了。。。</p>
<h1>黑笑小说</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这又是一本短篇集,但是风格却不太一样了。
主题甚至不是侦探,仅仅是一些荒诞不经的小短篇。
也许东野圭吾是在尝试不同的风格。</p>
<h1>湖畔杀人事件</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这是东野圭吾的长篇小说,推荐广告将其与白夜行排在了一起,但是在我看来还是和「白夜行」有一些差距的。
而且,我并不认为「白夜行」是东野的巅峰,「信」才是东野的巅峰……</p>
<p>整个故事其实还是比较简单的,一群成年人试图掩藏杀人案件。
看得出,东野在这个故事里希望从探案故事的框架里有所上升,但其实并怎么成功。
我后来还查了一下,「湖畔」是发表于2002年,而我心中的巅峰之作「信」是发表于2003年的。
从这个时间线上,可以看得东野的写作能力和思想都有了极大的提高。</p>
<h1>最璀璨的银河</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E5%88%98%E6%85%88%E6%AC%A3">刘慈欣</a></p>
<p>这是大刘的短篇集合,也是一些脑洞大开的想象。
印象比较深刻的是「地球大炮」,直接挖了一条贯穿地球的隧道,最后还利用隧道作为加速轨道,将太空船直接发射进太空。
想象力真不一般。</p>
<p>从这些短篇中可以看到,大刘的科幻风格一般都是一些大框架背景下的,他其实并不擅长刻画细致的人物形象。
但是,要论故事框架的宏伟程度,大刘确实是大师级的。</p>
<h1>时间回旋</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Robert_Charles_Wilson">Robert Charles Wilson</a></p>
<p>虽然也是包着科幻小说的外衣,但是其脑洞、其规模都无法和「三体」系列相比,更不用说是基地系列了。
不过,这部小说却更具有文学性,更加细腻。
大量的生活细节,让我觉得十分真实。
如果需要进行类比的话,「时间回旋」就像是一棵矮小但是却枝繁叶茂的树;而三体系列则是一棵没多少树叶,但是却高大威猛树。
这完全是两种不同的美感。</p>
<p>具体谈谈小说剧情,主人公与一对兄妹同时经历了人类历史上最大的变化——时间回旋之后,分别选择了不同的道路。</p>
<p>主角选择默默忍受,假装整个世界没有发生改变。
兄妹中的哥哥杰森却立誓要解开时间回旋之谜,从此投入到科研工作中去。
而兄妹中的妹妹拥有和哥哥同样的高智商,却选择了宗教,并且还不是足够虔诚的宗教信徒。</p>
<p>其实,我也常常无法理解,面对未知和不解,为什么总有那么多人诉诸于无法证实(当然也无法证伪)的宗教呢?
小说人物中我最欣赏的是哥哥杰森,同样面对未知,他选了面对,并用一生去尝试解释未知。
比其他人更值得尊敬。</p>
<p>这篇小说似乎引起了我对科学的信仰,我从来都是一个没有宗教信仰的人,但这并不表示我没有信仰。
我的信仰就是科学(科学也许是另外一种信仰)。
我信仰一切能够实证的事物,排斥一切虚无缥缈无法证实的宗教学说。</p>
<h1>刻意练习</h1>
<p>作者: Anders Ericsson / Robert Pool</p>
<p>这是2016年最火的几本书之一,花了两周的时间看完了。</p>
<p>这算是之前10000小时定理的加强版,很有启发性。
其中的关键点总结如下:</p>
<ol>
<li>大脑就像肌肉,可以通过训练进行增强。</li>
<li>单纯的反复练习没有意义,必须是错误驱动的练习,才会有效果。
每一次练习都要走出舒适区。</li>
<li>大量错误驱动的练习导致大脑形成「心理表征」,而心理表征就是区别杰出人物和普通人物的重要特点。</li>
<li>成功没有捷径,只有经过大量错误驱动的练习才能有所提高。</li>
</ol>
<p>脑图如下:</p>
<p><img alt="deliberate_practice" src="http://zhouyichu.com/images/deliberate_practice.png"/></p>
<h1>放学后</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这个月看了不少东野圭吾的小说,而且风格都不太一样。
就推理而言,这部作品很精彩,一波三折,各种伏笔。
结尾不能说是大反转,也可以说是90度的转变,而且还算合理,可以接受。
但是,杀人的理由,我实在是无法理解也无法认同。。。
最重要的动机仅仅是「可能被看到」。</p>
<h1>更新日志</h1>Sampling Trick2017-02-18T00:00:00-07:002017-02-18T00:00:00-07:00Flyawaytag:zhouyichu.com,2017-02-18:/machine-learning/Sampling-Trick/<p>快速估算子集大小的小技巧</p><p>最近在阅读论文过程中,发现我们常常需要估计一个大集合中的某个子集的大小,而这两个集合都是非常巨大的,遍历一遍非常耗时,在实际过程中根本不可行。
因此,我们需要一种方式能够快速估计子集的大小。
一个典型的应用场景就是在<a href="https://en.wikipedia.org/wiki/Learning_to_rank">Ranking Problem</a>中,我们需要知道排在当前实例<span class="math">\(x\)</span>之前有多少个元素。
而且这样的操作我们需要对每个实例都进行,很显然每次都遍历整个集合是不现实的。</p>
<h1>Sampling</h1>
<p>一个合理方法就是通过采样来估计集合大小。</p>
<p>首先,我们假设大集合是<span class="math">\(Y\)</span>,它的大小<span class="math">\(\vert Y\vert\)</span>是已知的,我们需要估计的子集是<span class="math">\(S\subset Y\)</span>,而<span class="math">\(\vert S\vert\)</span>是未知的,也是需要我们估计的。</p>
<h2>几何分布</h2>
<p>在论文<a href="WSABIE">WSABIE: Scaling Up To Large Vocabulary Image Annotation</a>中提到了一种利用几何分布的采样方式。
具体过程是:</p>
<blockquote>
<p>不停地从<span class="math">\(Y\)</span>中随机挑选(有放回)一个元素<span class="math">\(y\)</span>,直到采样出的元素<span class="math">\(y\in S\)</span>为止。
记录下一共的采样次数,记为<span class="math">\(N\)</span>.
那么,<span class="math">\(S\)</span>的大小就可以估计为<span class="math">\(\vert S\vert =\frac{\vert Y\vert}{E[N]}\approx \frac{\vert Y\vert}{N}\)</span>.</p>
</blockquote>
<p>证明:</p>
<p>整个过程是非常简单的,其证明过程也同样简单。
我们用<span class="math">\(p\)</span>来表示采样出的元素<span class="math">\(y\)</span>属于<span class="math">\(S\)</span>的概率,那么很显然我们有:</p>
<div class="math">$$
p = Pr[y\in S] = \frac{\vert S\vert}{\vert Y\vert}
$$</div>
<p>那么,根据采样的方式,我们继续得到:</p>
<div class="math">$$
Pr[N=i] = (1-p)^{i-1}p
$$</div>
<p>因为,当<span class="math">\(N=i\)</span>时,表示我们采样了<span class="math">\(i\)</span>次,说明前<span class="math">\(i-1\)</span>都没有采样到<span class="math">\(S\)</span>中的元素,第<span class="math">\(i\)</span>次采样到了<span class="math">\(S\)</span>中的元素。
这是一个<a href="https://en.wikipedia.org/wiki/Geometric_distribution">几何分布</a>,那么它的期望<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>就是:</p>
<div class="math">$$
E[N] = \frac{1}{p} = \frac{\vert Y\vert }{\vert S\vert}
$$</div>
<p>讲上述公式转化一下,我们就能得到:</p>
<div class="math">$$
\vert S\vert = \frac{\vert Y\vert}{E[N]}
$$</div>
<p>同时,我们知道,当采样轮数趋近于无穷大时,经验值就等于期望值,因此我们有:</p>
<div class="math">$$
E[N] = \lim\limits_{m\rightarrow \infty}\frac{1}{m}\sum\limits_{i=1}^m N_i.
$$</div>
<p>其中,<span class="math">\(N_i\)</span>表示第<span class="math">\(i\)</span>轮采样中,需要的采样次数。
为了快速估计,我们可以使<span class="math">\(m=1\)</span>,此时,我们就能得到:</p>
<div class="math">$$
\vert S\vert \approx \frac{\vert Y\vert}{N}
$$</div>
<p><span class="math">\(\blacksquare\)</span></p>
<h2>贝努利分布</h2>
<p>除了上述基于几何分布的采样方式以外,实际上还有其他的采样方式。
我们可以采用基于<a href="https://en.wikipedia.org/wiki/Bernoulli_distribution">贝努利分布</a>的采样方法。
其具体过程如下:</p>
<blockquote>
<p>持续地从<span class="math">\(Y\)</span>中连续(有放回)采样<span class="math">\(N\)</span>次,检查这<span class="math">\(N\)</span>个元素中有多少是属于<span class="math">\(S\)</span>的,记为<span class="math">\(M\)</span>。
显然,<span class="math">\(M<N\)</span>.
那么,<span class="math">\(\vert S\vert\)</span>的大小可以估计为<span class="math">\(\vert S\vert=\frac{E[M]\cdot \vert Y\vert}{N}\approx \frac{M\vert Y\vert}{N}\)</span>.</p>
</blockquote>
<p>证明:</p>
<p>同样的,我们首先用<span class="math">\(p\)</span>表示任意一个元素<span class="math">\(y\in Y\)</span>属于<span class="math">\(S\)</span>的概率,我们有:</p>
<div class="math">$$
p=Pr[y\in S] = \frac{\vert S\vert}{\vert Y\vert}
$$</div>
<p>那么,根据这种采样方式,我们有:</p>
<div class="math">$$
Pr[M=i]=\binom{N}{i} (1-p)^{N-i} p^i
$$</div>
<p>这表示<span class="math">\(N\)</span>次采样中有<span class="math">\(i\)</span>次采样到了<span class="math">\(S\)</span>中的元素,而每次采样都是有放回且独立的。
这是一个<a href="https://en.wikipedia.org/wiki/Bernoulli_distribution">贝努利分布</a>,那么它的期望<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>是:</p>
<div class="math">$$
E[M]=pN=\frac{\vert S\vert}{\vert Y\vert}\cdot N
$$</div>
<p>将上述公式重写,我们可以得到:</p>
<div class="math">$$
\vert S\vert = \frac{E[M]}{N} \cdot \vert Y\vert
$$</div>
<p>同样根据期望值的定义,我们有:</p>
<div class="math">$$
E[M] = \lim\limits_{m\rightarrow \infty}\frac{1}{m}\sum\limits_{i=1}^m M_i
$$</div>
<p>其中<span class="math">\(M_i\)</span>表示第<span class="math">\(i\)</span>轮采样中,有多少个元素是属于<span class="math">\(S\)</span>的。
同样,为了快速估计,我们可以使<span class="math">\(m=1\)</span>,我们即可得到:</p>
<div class="math">$$
\vert S\vert \approx \frac{M\vert Y\vert}{N}
$$</div>
<p><span class="math">\(\blacksquare\)</span></p>
<h1>实验</h1>
<p>为了比较这两种不同采样方式的差别,我做了一些实验。
下面是我的实验结果。</p>
<h2>估计值的准确性</h2>
<p>首先我比较了这两种采样方式得出的估计值的准确性,在不同的<span class="math">\(\vert Y\vert, \vert S\vert\)</span>的比例情况下,我们得到如下四张图:</p>
<p><img alt="Experiments" src="http://zhouyichu.com/images/Y200S100.png"/>
<img alt="Experiments" src="http://zhouyichu.com/images/Y2000S100.png"/>
<img alt="Experiments" src="http://zhouyichu.com/images/Y20000S100.png"/>
<img alt="Experiments" src="http://zhouyichu.com/images/Y200000S100.png"/></p>
<p>从四张图的变化趋势,我们可以得出以下结论:</p>
<p><strong>当<span class="math">\(\vert Y\vert\)</span>和<span class="math">\(\vert S\vert\)</span>比例较大(0.5)时,贝努利分布的采样方式更稳定;而当比例逐渐变小时(0.0005), 几何分布的估计值更加稳定。</strong></p>
<h2>采样时间花费</h2>
<p>另外一个重要指标是采样的时间,毕竟,我们一切的工作都是希望能加速计算过程。
下面四张图是在同样的设定下,采样时间的对比:</p>
<p>{% asset_img timeY200S100.png %}
{% asset_img timeY2000S100.png %}
{% asset_img timeY20000S100.png %}
{% asset_img timeY200000S100.png %}</p>
<p><img alt="Time" src="http://zhouyichu.com/images/timeY200S100.png"/>
<img alt="Time" src="http://zhouyichu.com/images/timeY2000S100.png"/>
<img alt="Time" src="http://zhouyichu.com/images/timeY20000S100.png"/>
<img alt="Time" src="http://zhouyichu.com/images/timeY200000S100.png"/></p>
<p><strong>对于时间花费来说,当<span class="math">\(\vert Y\vert\)</span>和<span class="math">\(\vert S\vert\)</span>比例较大(0.5)时,几何分布要明显比贝努利分布快;而当比例逐渐变小时(0.0005),几何分布将会花费越来越多的时间,此时贝努利分布就更占优势。</strong></p>
<h1>参考资料</h1>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Learning_to_rank">Ranking Problem</a></li>
<li><a href="http://www.thespermwhale.com/jaseweston/papers/wsabie-ijcai.pdf">WSABIE</a></li>
<li><a href="https://en.wikipedia.org/wiki/Geometric_distribution">几何分布</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bernoulli_distribution">贝努利分布</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2017年2月18日 完成初稿</li>
<li>2017年2月19日 添加实验结果并发布</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>关于几何分布的期望证明,我在这篇<a href="http://zhouyichu.com/randomized-algorithm/randomized-algorithms-2/">博文</a> 中证明过。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>关于贝努利分布的期望证明,我在这篇<a href="http://zhouyichu.com/randomized-algorithm/randomized-algorithms-2/">博文</a>中证明过。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2017年1月书单2017-01-29T14:14:55-07:002017-01-29T14:14:55-07:00Flyawaytag:zhouyichu.com,2017-01-29:/reading-list/Reading-List-2017-January/<ol>
<li>睡个好觉:如何改善你的睡眠 2. Powerful Sleep 3. 百年孤独 4. 睡眠正能量 5. 时间的朋友2016</li>
</ol><h1>睡个好觉: 如何改善你的睡眠</h1>
<p>作者: 周不润</p>
<p>知乎出品的小册子,比较系统的介绍了目前人类对睡眠的理解。
其中详细说明了以下几个概念:</p>
<ul>
<li>睡眠的四个阶段</li>
<li>睡眠的作用</li>
<li>改善睡眠的作用</li>
</ul>
<p>尽管书中提出了不少的建议,但是依然属于很常见的建议,比如多运动、不喝咖啡等。
人类对睡眠的理解还是很粗浅啊。</p>
<p>{% asset_img sleep_well.png %}
<img alt="Sleep" src="http://zhouyichu.com/images/sleep_well.png"/></p>
<h1>Powerful Sleep</h1>
<p>作者: Kacper M. Postawski</p>
<p>这是目前为止我见到关于睡眠论述最全的一本书,可以看成是「睡个好觉:如何改善你的睡眠」的一个加强版。</p>
<p>书中提到了一个另外一个「睡个好觉」中没有提到的因素——阳光日照。</p>
<p>阳光能够抑制体内褪黑素的分泌,每天足够的日照,对睡眠状态也是很有帮助的。
这也能解释为什么冬天大家普遍想要睡得更多:因为冬天的阳光较少,褪黑素水平有所上升。</p>
<p>这也许也能解释为什么现代人睡眠差的情况越来越多: 整天都是在室内活动,很少接触真正的阳光,每天的日照严重缺乏。</p>
<p><img alt="Poewrful Sleep" src="http://zhouyichu.com/images/powerful_sleep.png"/></p>
<h1>百年孤独</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Gabriel_Garc%C3%ADa_M%C3%A1rquez">Gabriel García Márquez</a></p>
<p>看了一个多月终于将这本巨著看完了,不过,老实说,基本是属于没看懂的那种。
「百年孤独」刻画了一个充满魔幻元素的世界,其中各种光怪陆离的事情不断在发生:</p>
<ul>
<li>吃土的女孩</li>
<li>无限产仔的牲畜</li>
<li>越活越萎缩的主母</li>
<li>最终升天的女孩</li>
<li>乱伦</li>
<li>各种奇怪的且真实的语言</li>
</ul>
<p>阅读过程中,我能感受到作者的核心是两个: <strong>轮回</strong>和<strong>孤独</strong></p>
<p>整个布恩迪亚家族,七代人,一代又一代发生同样的事情,每个人都面对着属于自己的孤独。</p>
<p>整个小说的写作就像小时候看的格林童话一样,没有铺垫、没有因果,直接了当的描述。
阅读的过程行云流水,感觉一阵一阵的文字铺面而来,不娇柔,不造作。
整个人都淹没在了「百年孤独」中……</p>
<p><img alt="solitude" src="http://zhouyichu.com/images/solitude.jpg"/></p>
<h1>睡眠正能量</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Richard_Wiseman">Richard Wiseman</a></p>
<p>这是调研的第三本睡眠书籍,其中的内容和前面两本有不少的重复,看来人类对睡眠的认知还处于一个十分浅显的地步。</p>
<p>本书的另外一个重点是关于梦境的讨论,有接近一半的篇幅都是在论述有关梦境的研究成果。</p>
<p>书中还有两个有实际帮助的结论:</p>
<ol>
<li>深睡眠能够恢复体力</li>
<li>REM能够减缓压力</li>
</ol>
<p>这也就能解释,压力大的时候,老是睡不深而且容易做梦。</p>
<h1>时间的朋友2016</h1>
<p>作者: <a href="http://baike.baidu.com/item/%E7%BD%97%E6%8C%AF%E5%AE%87/1982837">罗振宇</a></p>
<p>这是罗振宇2016跨年演讲的演讲稿,我是先看了一遍视频,然后又看了一遍他的演讲稿。</p>
<p>今年演讲的主题是对未来商业的预测,在演讲中他列举了五个新出现的黑天鹅,它们分别是:</p>
<ol>
<li>时间战场</li>
<li>服务升级</li>
<li>人工智能</li>
<li>认知税</li>
<li>共同危机</li>
</ol>
<p>这些预测未必是对的,也只是罗振宇的一家之言。
但是,多看一些大趋势的东西,能够帮助我更好的理解这个世界。</p>
<h2>时间战场</h2>
<p>随着基本物质生活的满足,商业的本质越来越趋近于相同,争夺用户的时间。
其实,本质来说,不能说是争夺时间,而应该是争夺用户的注意力。
现代社会的信息高度发达,每时每刻都处于信息洪流之中。
我们不可能去阅读每一条信息,精力和注意力都是有限的。
注意力因此而变得宝贵,不止对于商人来说,对于任何一个想要有所作为的人来说,注意力都是宝贵的。
管理时间的本质,其实是要管理好自己的注意力。
而对于商业来说,行业差异将会越来越小,最终都是在争夺用户的注意力。
注意力,是21世纪最宝贵的资源。</p>
<h2>服务升级</h2>
<p>这是和「时间战场」争锋相对的,在确定了未来的战场就是时间战场之后。
商业也将发生变化,商人们、创业者们出售的不再是简单的商品,而将会是优质服务。
中国正在逐渐形成为服务买单的消费观念,这将会是一个新的战场。
免费模式将不再是主流,新一轮的收费社群将会出现。 </p>
<h2>人工智能</h2>
<p>作为半个从业人员,我对人工智能的预估并不想罗胖那样乐观。
不可否认,人工智能肯定会发展得越来越好,但是,我们有生之年真的会出现能够代替所有行业的超级计算机吗?
我持怀疑态度。
不可否认,AlphaGo打败李世石之后,人工智能的能力令大家震惊。
但是,距离真正的人工智能———通过图灵测试——还有很大的差距。
目前的人工智能只能在某一领域利用大规模计算能力进行学习,而无法做到像人类一样能够同时处理纷繁负责的社会活动。
虽然现在人工智能概念依然很火爆,但又有谁能保证它不会和去年的智能设备一样遭遇滑铁卢呢?</p>
<h2>认知税</h2>
<p>在这五个黑天鹅中,认知税是我最无法理解的一只黑天鹅。
网红、IP、ASMR等等各种概念层出不穷,而大部分都还在快速发展。
各种网红直播节目,很多知名网红年收入早就超过了1亿。
这已经是一个我无法理解的世界了,作为一个奔三的人,还在异国他乡苦苦求学,而比我年轻的那些人的年收入可能已经我一生也无法达到的水平了。
他们没有我的学历、没有我的知识,却依然能从这个社会中获取大量的财富。
如果是过去的我,我也许会像传统的文人那样,高声痛呼人生不古,生不逢时。</p>
<p>然而,存在即是合理的。
不管这是是否符合你的理解。
面对如此复杂的世界,我也只能默默接受这样的现实。
如果不能及时纠正我的认知,不远的将来我一定会付出更多的认知税!</p>
<h2>共同体</h2>
<p>共同体正在发生越来越大的变化,「我们」这个概念正在逐渐被稀释。
地域、血缘、阶层、单位、专业这些共同体正在逐渐瓦解,每个人的认知都在不断改变,而且都是在飞速改变。
也许,未来的世界事实已经不再重要,重要的是你的立场和你的认知。</p>
<p>将来最大的共同体也许就是认知的共同体。
从这个角度来说,有些科幻小说把未来世界想象成一个不再有家庭的世界也许是合理的。
认知变化太过迅速,也许已经无法保证一个家庭的生活基础.</p>
<h2>优秀的人们</h2>
<p>除了那无知黑天鹅以外,罗胖子还谈到了一些优秀人才交给他的事情。
其实,比起那些对商业的预测,我更关注的是这部分内容。
关注,如何能成长为一个更加优秀的人。</p>
<p><strong>李翔</strong>: 伟大是一直长,长出来的。</p>
<p>做好每一件事,其他的交给时间去办,利用复利效应,雪球总会越滚越大的。</p>
<p><strong>吴军</strong>: 自律,让自己变得更好.</p>
<p>自律,这也是我2017最为关注的一个事情。
正如梁漱溟先生所说,人生就是一个自发向上的过程,对待生活、对待时间要郑重.
自律,从基本的自己的做起,不管外在如何形势,保持自我。</p>
<p><strong>和菜头</strong>: 有趣通往自律,自律通向体面。</p>
<p>问:如何体面的生活?答: 约束好自己。
之前也和女友讨论过,我的观点是,衣服着装只是景上添花的,而不是最本质的东西。
自己的精气神好了,不管穿什么都足以表现出来。
然而,事实也许并非如此。
罗胖子说: 「体面的着装不是炫耀的工具,它是约束自己的工具」
体面的着装其实也是你「精气神」的一部分,也是一中自律的表现。</p>
<p><strong>李笑来</strong>: 一切的根源都是自我</p>
<p>金钱并不能给你带来更好的生活,只有改变自己,从内而外的经营生活,才能达到幸福的彼岸。
很喜欢罗胖最后说的话: </p>
<blockquote>
<p>所谓更牛,就是换个罪受。
我们这一生的宿命是,我们努力,我们变得更牛,我们因此自律,我们换个罪受,因此变得更加体面,这是一条无尽的上升的管道。</p>
</blockquote>
<p>人生就是一条没有尽头的螺旋式轨道,我们不断上升、不断换罪受,不断拓展,永无止尽。
想想,这何尝不是一种幸福的人生呢?</p>
<h1>更新日志</h1>
<ul>
<li>2017年1月15日 增加「睡个好觉:如何改善你的睡眠」</li>
<li>2017年1月15日 增加「Powerful Sleep」</li>
<li>2017年1月17日 增加「百年孤独」</li>
<li>2017年1月29日 增加「睡眠正能量」</li>
<li>2017年1月29日 增加「时间的朋友2016」</li>
</ul>PAC-Learning2017-01-14T00:00:00-07:002017-01-14T00:00:00-07:00Flyawaytag:zhouyichu.com,2017-01-14:/machine-learning/PAC-Learning/<p>关于PAC(Probably Approximately Correct) Learning的总结.</p><h1>评价机器学习算法</h1>
<p>在之前的<a href="http://zhouyichu.com/machine-learning/Mistake-Bound-Algorithm/">博文</a>中,我们说明了对于<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>的机器学习算法的评价方法--Mistake Bound Algorithm.
今天这篇文章将要分析其他类型的机器学习模型的评价方法。</p>
<p>与<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>相对应的另外一种学习模型是<strong>Batch Learning</strong>,与<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>不同的是,Batch Learning首先是在固定的训练集上进行训练,训练完成之后用测试集进行测试。
这也是最常见的机器学习模型。
Batch learning关注的是我们的模型在未来数据上的预测能力。</p>
<p>针对<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>的Mistake Bound Algorithm只是一种理论方法,根据犯错误的次数来评价一个模型的好坏。
它对数据的分布没有什么要求,也不在乎未来数据。
它能够回答:"我们需要犯多少次错误才能收敛?",但是却不能回答: "我们需要多少数据才能收敛?"</p>
<p>然而,对于Batch learning来说,我们需要考虑:</p>
<ol>
<li>假设空间的大小</li>
<li>成功学习的可能性</li>
<li>需要多少样本才能保证学习成功</li>
<li>我们能够目标函数的准确性</li>
</ol>
<p>这些内容在Mistake Bound Algorithm 中都没有被考虑到。
因此,Mistake Bound Algorithm的分析方法并不适用于Online Learning的模型。</p>
<p>由此,我们引入了<a href="https://en.wikipedia.org/wiki/Probably_approximately_correct_learning">Probably Approximately Correct</a>(PAC)学习框架。</p>
<h1>基本概念</h1>
<h2>基本假设</h2>
<p>在PAC的学习框架中,我们有两个<strong>重要</strong>的基本假设:</p>
<ol>
<li>训练集和测试集是来源于同一个分布的。</li>
<li>对于Concept集合中的任何一个Concept,假设空间中总存在一个函数<span class="math">\(h\)</span>能够满足所有的训练样本。(也就是说,Concept集合是假设空间的一个子集)</li>
</ol>
<p>第一个假设非常重要,它是Batch Learning的基本前提,这保证了我们从训练集中学习到的知识同样符合测试集。</p>
<h2>定义错误</h2>
<p>对于Batch Learning模型来说,假设空间中的任何一个函数<span class="math">\(h\)</span>都存在两种不同的错误:</p>
<ol>
<li>经验错误(Empirical Error): 训练集<span class="math">\(S\)</span>中被<span class="math">\(h\)</span>预测错的数据比例。用公式来表示就是:<span class="math">\(error_S(h)=Pr_{x\in S}[h(x)\neq f(x)]\)</span>.</li>
<li>真实错误(True Error): 对于整个数据分布<span class="math">\(D\)</span>中的数据,<span class="math">\(h\)</span>预测错的概率。用公式来表示就是:<span class="math">\(error_D(h)=Pr_{x\sim D}[h(x)\neq f(x)]\)</span>.</li>
</ol>
<p>而过拟合的情况其实就是出现<span class="math">\(err_S(h) << err_D(h)\)</span>时的现象。</p>
<h1>PAC学习</h1>
<h2>PAC定义</h2>
<p>为了能够衡量Batch Learning,我们需要新的评价方式,能够将假设空间的大小、学习成功率、需要的样本数等条件一起考虑。</p>
<p>首先,我们要知道,不管你的学习器有多么强大,我们是永远无法学习到一个完美的模型,能够对所有的数据(包括训练集和测试集)进行正确地预测。
其次,我们也无法期望学习器能够学习到一个无限接近真实函数的模型,因为训练集总是有限的,不可能涵盖所有的未知情况。
所以,唯一可实现的是,期望我们的学习器能够以<strong>大概率</strong>学习到一个足够<strong>近似</strong>真实函数的模型。
因此我们能够得出PAC的定义:</p>
<blockquote>
<p>对算法<span class="math">\(L\)</span>和假设空间<span class="math">\(H\)</span>来说,如果Concept集合<span class="math">\(C\)</span>:
- 对于所有的<span class="math">\(f\in C\)</span>;
- 对所有的可能的分布<span class="math">\(D\)</span>,存在常数<span class="math">\(0\le \epsilon, \delta <1\)</span>;</p>
<p>对所有<span class="math">\(m\)</span>个从<span class="math">\(D\)</span>中独立采样得到样本,算法<span class="math">\(L\)</span>能够以<span class="math">\(1-\delta\)</span>的概率得到一个假设<span class="math">\(h\in H\)</span>且<span class="math">\(h\)</span>的真实错误最多是<span class="math">\(\epsilon\)</span>.
并且,此时的<span class="math">\(m\)</span>是<span class="math">\(\frac{1}{\epsilon},\frac{1}{\delta},n\)</span>和<span class="math">\(\vert H \vert\)</span>的多项式结果。
那么,Concept集合是<strong>PAC可学习的</strong>,
如果<span class="math">\(L\)</span>能够在<span class="math">\(\frac{1}{\epsilon},\frac{1}{\delta},n\)</span>和<span class="math">\(\vert H \vert\)</span>的多项式时间内产生<span class="math">\(h\)</span>,那么<span class="math">\(C\)</span>是<strong>高效可学习</strong>的。</p>
</blockquote>
<p>上述的定义非常绕人,需要多读几遍才能正确理解。
如果,理解上还是有困难,可以参考下面奥卡姆剃原理中的公式推导。</p>
<h2>奥卡姆剃刀原理</h2>
<p><a href="https://en.wikipedia.org/wiki/Occam's_razor">奥卡姆剃刀原理</a>是一个解决问题的方法论,它的核心思想其实就是一句话:</p>
<p><strong>在相同结果的条件下,我们应该选择最简单的模型。</strong></p>
<p>更加简略的表述是:</p>
<p><strong>如无必要,勿增实体</strong></p>
<p>好,现在我们回到PAC问题上。
我们首先提出一个结论:</p>
<blockquote>
<p>存在一个假设<span class="math">\(h\)</span>满足:
1. 能够和所有的<span class="math">\(m\)</span>个训练样本保持一致
2. 它的真实错误<span class="math">\(err_D(h)>\epsilon\)</span></p>
<p>的概率小于<span class="math">\(\vert H\vert (1-\epsilon)^m\)</span>.</p>
</blockquote>
<p>证明:</p>
<p>假如存在真实错误大于<span class="math">\(\epsilon\)</span>的假设<span class="math">\(h\)</span>,那么<span class="math">\(h\)</span>预测对一个训练样本的概率是<span class="math">\(Pr[f(x)=h(x)]<1-\epsilon\)</span>.
因为<span class="math">\(m\)</span>个训练样本是独立同分布的,所以,<span class="math">\(h\)</span>预测对全部的<span class="math">\(m\)</span>个样本的概率<span class="math">\(<(1-\epsilon)^m\)</span>.</p>
<p>根据<a href="https://en.wikipedia.org/wiki/Boole%27s_inequality">Union Bound</a>,大小为<span class="math">\(\vert H\vert\)</span>的集合中存在这样的<span class="math">\(h\)</span>的概率小于<span class="math">\(\vert H\vert (1-\epsilon)^m\)</span>. </p>
<p><span class="math">\(\Box\)</span></p>
<p>我们可以进一步推导,我们希望<span class="math">\(\vert H\vert (1-\epsilon)^m<\delta\)</span>:</p>
<div class="math">$$
\begin{aligned}
& \ln(\vert H \vert) + m\ln(1-\epsilon) < \ln\delta \\
&\Rightarrow \ln(\vert H\vert) - m\epsilon < \ln\delta\\
&\Rightarrow \ln(\vert H\vert) + \ln\frac{1}{\delta} < m\epsilon\\
&\Rightarrow m > \frac{1}{\epsilon}\left[\ln(\vert H \vert) + \ln\frac{1}{\delta}\right]
\end{aligned}
$$</div>
<p>最终我们可以得到如下的不等式:</p>
<div class="math">$$
m > \frac{1}{\epsilon}\left[\ln(\vert H \vert) + \ln\frac{1}{\delta}\right]
$$</div>
<p>其中:</p>
<ul>
<li><span class="math">\(\frac{1}{\epsilon}\)</span>表示随着真实错误率的提高,我们需要更多的训练样本。</li>
<li><span class="math">\(\ln(\vert H\vert)\)</span>表示越大的假设空间,我们需要更多的训练样本。</li>
<li><span class="math">\(\ln\frac{1}{\delta}\)</span>表示置信度越高,我们需要更多的训练样本。</li>
</ul>
<p>其中的<span class="math">\(\frac{1}{\epsilon},\ln(\vert H\vert),\ln\frac{1}{\delta}\)</span>正式PAC中所要求的。
因此,对于一个学习器,我们能够使用上述的不等式来判断该学习器是否是PAC可学习的。</p>
<p>同时,这个公式也告诉我们,在<span class="math">\(\epsilon\)</span>和<span class="math">\(\delta\)</span>固定的情况下,我们应该选择更小的假设空间,这就体现了奥卡姆剃刀原则的要求。</p>
<h1>总结</h1>
<p>PAC是一种分析机器学习模型的理论框架,它能够同时兼顾多项标准:</p>
<ul>
<li>训练集大小</li>
<li>真实错误率</li>
<li>置信度</li>
</ul>
<p>PAC是用来衡量Batch Learning模型的评价体系,它有两个重要的基本假设:</p>
<ol>
<li>训练集和测试集是来源于同一个分布的。</li>
<li>对于Concept集合中的任何一个Concept,假设空间中总存在一个函数<span class="math">\(h\)</span>能够满足所有的训练样本。</li>
</ol>
<p>因为有了第一个假设,我们才能使真实错误和经验错误发生联系;因为有了第二个假设,我们才能使用Union Bound,才能确保<span class="math">\(H\)</span>中一定包含我们需要学习的目标函数。</p>
<p>其实,这两个假设也是很强的假设,接下去的博文将会说明,当这些条件不满足时,我们该如何分析机器学习模型。</p>
<h1>参考资料</h1>
<ul>
<li>奥卡姆剃刀: <a href="https://en.wikipedia.org/wiki/Occam's_razor">https://en.wikipedia.org/wiki/Occam's_razor</a></li>
<li>Union Bound: <a href="https://en.wikipedia.org/wiki/Boole%27s_inequality">https://en.wikipedia.org/wiki/Boole%27s_inequality</a></li>
<li>Vivek Srikumar教授的<a href="http://svivek.com/teaching/machine-learning/fall2016/lectures/08-colt.html">课件</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2017年1月14日 完成初稿并发布</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2016年12月书单2017-01-02T00:00:00-07:002017-01-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2017-01-02:/reading-list/Reading-List-2016-December/<ol>
<li>毛姆短篇小说精选 2. 是一种孤独 3. Bigger Leaner Stronger 4. Common Sense Investing 5. Invest Like a Pro</li>
</ol><h1>毛姆短篇小说精选</h1>
<p>作者:<a href="https://en.wikipedia.org/wiki/W._Somerset_Maugham">W. Somerset Maugham</a></p>
<p>这本精选集是和「月亮与六便士」一起淘到的,都是一些短篇小说。</p>
<p>刚开始读的时候,以为是莫泊桑的风格,结尾会是一些神转折。
然而并不是这样,很多故事只是简短的记述而已。</p>
<p>不过,很多故事很吸引人,我从中看到了「月亮与六便士」的影子,可以窥测到作者的思想变化过程。</p>
<h1>十一种孤独</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Richard_Yates_(novelist)">Richard Yates</a></p>
<p>这也是一本短篇集,刚上来看的时候,都不知道作者在写什么。
在豆瓣上看了一些读后感,才逐渐了解作者想表达的主题。</p>
<p>每个人都是孤独的,不管是父母、战友、朋友还是伴侣,其实都无法真正了解你,甚至其实你自己都做不到真正了解自己……</p>
<h1>Bigger Leaner Stronger</h1>
<p>作者: <a href="https://www.muscleforlife.com/about-me/">Michael Matthews</a></p>
<p>这又是一本有关健身的书籍,这本书看了很久才看完的。</p>
<p>有关健身的林林种种都可以在这本书中找到。
这本书最好的一点就是,它每一个论点都有明确的研究出处,这是很不容易的。
同时,也让人很信服。</p>
<p>本书明确了我一个概念,健身是一个复杂的系统,不仅仅只是去健身训练,这只是健身的一小部分而已。
更重要的是,改变生活习惯,时刻对身体的变化作出调整。</p>
<p>关于健身,我的理解是,它主要有三部分组成:</p>
<ol>
<li>训练</li>
<li>饮食</li>
<li>补充剂</li>
</ol>
<p>每一部分展开都是完整的一个大系统,需要好好学习。</p>
<p>具体内容参看下面的脑图:</p>
<p><img alt="Bigger-Leaner-Stronger" src="http://zhouyichu.com/images/Bigger-Leaner-Stronger.png"/></p>
<h1>Common Sense Investing</h1>
<p>作者: Rick Van Ness</p>
<p>这是一本投资理财的入门书籍,其中提到的很多感念和原则,在很多同类型的书中都有提到。
但是,作为美国的理财书籍,它也向我说明了,美国的投资类型其实也是很有限的,基本只有那么几项:</p>
<ol>
<li>Bound</li>
<li>Stock</li>
<li>Fund</li>
</ol>
<p>其具体脑图如下:</p>
<p><img alt="Common-Sense-Investing" src="http://zhouyichu.com/images/Common-Sense-Investing.png"/></p>
<h1>Invest Like A Pro</h1>
<p>作者: Jesse Mecham</p>
<p>同样的理财入门书籍,内容略微要比Common Sense Investing 深入一些,对具体的理财项目有些详细介绍。</p>
<p><img alt="Invest-like-a-pro" src="http://zhouyichu.com/images/Invest-like-a-pro.png"/></p>
<h1>参考资料</h1>
<h1>更新日志</h1>2016年度总结2016-12-31T00:00:00-07:002016-12-31T00:00:00-07:00Flyawaytag:zhouyichu.com,2016-12-31:/words/Summary-2016/<p>告别2016,迎接2017</p><h1>前言</h1>
<p>又是一年一度的总结时候了,和去年不同的是,今年的总结我是在异国他乡做的。
今年发生了很多的事情,一件接一件的事情,逐步构成了现在的我。</p>
<h1>事业</h1>
<h2>南大毕业</h2>
<p>三年的时间转瞬即逝,在我还没有缓过神来的时候,我已经从南大毕业了。
我现在依然记得三年前我第一次进组时的情形,老板的谈话,同学的帮助,都依然在眼前。</p>
<p>在南大的三年,经历了不少的事情,也收获了很多:</p>
<ol>
<li>遇到了爱情</li>
<li>结识了友情</li>
<li>认识了大神</li>
<li>发表了人生第一篇论文</li>
<li>形成了每天运动的习惯</li>
</ol>
<p>其中,最重要的还是心态的改变,从懵懂学生逐渐转变为科研从业者。
如果说南师大教会了我专业技能,那么南大就教会了我科研技能。</p>
<p><img alt="NanJing" src="http://zhouyichu.com/images/Nanjing-University.jpg"/></p>
<h2>肉身翻墙</h2>
<p>这可算是今年对我来说最大的事情了,努力了那么久终于成功肉身翻墙了。
一个人漂洋过海,一切都是新奇的,一切都是陌生的,这个过程冷暖自知,留过学的人应该都能有体会。
初来美国时的感受,我记述在了之前的一篇<a href="http://zhouyichu.com/words/First-Month-In-USA/">博文</a>里。</p>
<p>现在在犹他大学已经度过了一个学期了,生活、学习都逐渐从新奇归于平静,逐渐变成一种新的习惯。</p>
<p><img alt="Utah-University" src="http://zhouyichu.com/images/Utah-University.jpeg"/></p>
<h2>开源项目</h2>
<p>今年终于完成了一个真正意义上的开源项目,尽管只是一个小项目,但是这件事还是很有满足感的。
详细的情况在这篇<a href="http://zhouyichu.com/project/PYEVALB/">博文</a>中。</p>
<h2>课程</h2>
<p>学习是一种喜悦的事情,尤其是在学习新事物的时候。
对比国内外的课程,其实现在的差距并不是那么大了。
本学期我选了Machine Learning, Natural Language Processing, Advanced Aglorithm三门,这些课程其实我在国内都已经上过了,内容上也有一定的重合。
但依然学到了很多新的概念,刷新了对旧概念的理解。</p>
<p><img alt="Grades" src="http://zhouyichu.com/images/Grades.png"/></p>
<h1>生活</h1>
<h2>健身</h2>
<p>开始系统地学习、实践健身,美国的健身文化深入到生活的点滴之中,也逐渐影响到了我。
从今年开始,系统地阅读了大量有关健身的书籍,包括:</p>
<ul>
<li>囚徒健身</li>
<li>囚徒健身2</li>
<li>囚徒增肌</li>
<li>无器械健身</li>
<li>硬派健身</li>
<li>一平米健身</li>
<li>施瓦辛格健身全书</li>
<li>Bigger Leaner Stronger</li>
</ul>
<p>不仅扩充了大量的健身、营养学知识,在不断亲身实践的过程中,体脂从18%降低到了目前的11%。
算是不小的进步吧。
同时,因为健身,养成了早起的习惯,每天的状态都很好。
一天之计在于晨这句老话还是很有道理的。</p>
<p><img alt="Workout" src="http://zhouyichu.com/images/workout-2016.png"/></p>
<h2>读书</h2>
<p>今年也是读了不少的书,一共阅读了81本书,其中42本小说,38本非小说,1本IT专业书籍.
书目如下所示:</p>
<p><img alt="Books" src="http://zhouyichu.com/images/Books.jpg"/></p>
<p>其中基本每一本都做了相应的笔记、读后感和脑图。
其中我比较推崇的书目主要有:</p>
<p>小说类:
- 东野圭吾的「嫌疑人X的献身」、「信」.对于东野圭吾的作品,大家比较推崇的是「白夜行」,不过我觉得这两本都要比「白夜行」好一些,一本构思更加精巧,结尾的神反转让人拍案叫绝;一本的思想深度更深,细致剖析了罪犯与社会的关系。
- 艾萨克·阿西莫夫的「大银河帝国系列」,包括「机器人系列」和「基地系列」。这绝对是经典中的经典!深度、广度、细节都有,就像是一棵枝繁叶茂的大树,每次阅读都能获得新的养分。
- 肯·福莱特的「巨人的陨落」,这也是一本很丰满的书。多个人物、家族相互交织,呈现了一幅时代巨变图景。
- 艾萨克·阿西莫夫的「永恒的终结」,读完的第一感觉这就是一本神书!大力推荐!据说是最早的时空旅行小说。
- 毛姆的「月亮与六便士」,这也是一本久负盛名的小说,对我来说产生了深深共鸣。很多人都问过我,为什么要读博,其实并没有什么实际的原因,我就是想读而已,仅此而已……
- 伍绮诗的「无声告白」,我是第一次阅读这种乱序写作的小说,首先感觉比较新奇。其次,它的主题我也很能触动我,不同文化组成的家庭如何进行下一代的教育,这也是一个很有趣的话题。</p>
<p>非小说类:
- 奇特的一生: 柳比歇夫执行了一辈子的时间记录习惯,产生了巨大的能量。这也是我开始记录自己时间分配的出发点。
- 自私的基因: 一本观点很神奇的书,对于拓展思维很有帮助。
- 七年就是一辈子: 李笑来的书,在很多人看来这就是一本鸡汤书,也许吧,但是这本书确实有很多学习、思考的新观点。
- Invest Like A Pro: 这是一本在美国进行投资理财的入门书籍,这本书帮我理清了一些我以前很困惑的金融概念。
- 人类简史: 这本书包含了很多新颖的观点,从头到尾用全新的视角剖析了人类历史的发展。但是,看到后面总有种虎头蛇尾的感觉,史前时期的分析特别精彩,近现代的分析就流于平常了。
- Bigger Leaner Stronger: 这是目前阅读到的最全的健身书籍,书中包含了大量的引用,论点和论据都是十分充足。但是,其中提出的健身策略和我以往的认知有一些冲突,目前正在用自己做实验,验证其策略的正确性。</p>
<p>对比前年和去年的阅读数目,今年的阅读数量有了大幅增长,说明阅读正在成为我的生活习惯之一。
过去三年的阅读对比:</p>
<table>
<thead>
<tr>
<th align="center">2014年</th>
<th align="center">2015年</th>
<th align="center">2016年</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">27本</td>
<td align="center">37本</td>
<td align="center">81本</td>
</tr>
</tbody>
</table>
<p>虽然阅读量的增长是一件可喜的事情,但是也未必是绝对的好事。
输入大于输出,很有可能会成为一无是处的穷酸书生。
只会纸上谈兵,而不会动手实践,这是很严重的残疾。
说实话,我已经在我自己身上发现了类似的问题,今后的目标是要在保持输入的情况,增加输出。</p>
<h2>作息习惯</h2>
<p>今年在作息习惯上作出了不少的改变:</p>
<ol>
<li>早起健身</li>
</ol>
<p>这个习惯差不多应该坚持了有一年了,早起的感觉其实真的很不错的。一通健身之后,洗个澡神清气爽。当然,早起并不意味着减少睡眠,早起一个隐含的意义就是要早睡,保证充足的睡眠更重要。</p>
<ol>
<li>晨间日记</li>
</ol>
<p>晨间日记坚持了也有一年的时间,效果感觉也很不错。早上规划好一整天的任务,然后按部就班的执行,这样就不会出现因为事情太多而产生焦虑的情况。有助于我达到「心如止水」的状态。</p>
<ol>
<li>时间记录</li>
</ol>
<p>配合atimelogger,我每天都会对自己的时间花费进行记录,一记录你才会发现,有多少时间是被浪费在了毫无疑义的事情上。记录了时间之后,你才会发现时间是有多宝贵。
目前,我还做的很基础,只是简单的记录而已,记录之后更重要的是分析,然后是改变行为习惯,使得效率提高。
这条路上,还有很长的路要走!</p>
<p><img alt="Time" src="http://zhouyichu.com/images/Time.png"/></p>
<h2>做饭</h2>
<p>这是一块我从未涉足的新领域,由于健身和经济的原因,我现在开始自己做饭。
其实,做饭并不是原来想象的那么难,学会几个简单的之后,就轻松了。
真正的难点在于,每天都要做,这就变得非常琐碎了。
经过我的统计,我做一次饭要花费1个小时左右的时间,对我来说这已经是很花时间的事情了。
目前正在寻找更好的做菜方法,提高效率。</p>
<p><img alt="Dinner" src="http://zhouyichu.com/images/Dinner-0.jpeg"/>
<img alt="Dinner" src="http://zhouyichu.com/images/Dinner-1.jpeg"/></p>
<h1>感悟</h1>
<h2>申请</h2>
<p>其实,去年的整个申请过程可以定性为失败的。申请了20所学校,真正拿到offer的只有两所。
反思整个过程,最致命的错误在于定位错误,犯了眼高手低的错误。
整个申请季结束之后,才深深体会到古希腊阿波罗神庙上的「Know yourself」中包含的朴素真理。
我们时时刻刻都以为自己了解自己,其实给自己正确的定位是十分困难的。
「不识庐山真面目,只缘身在此山中」。
能够真正跳出自己局限看待自己的人,毕竟是少数。</p>
<h2>个人管理</h2>
<p>今年的个人管理系统运转的比去年流畅,已经逐渐养成了习惯。
最重要的几个心得是:</p>
<ol>
<li><strong>要学会放弃</strong>,专注于当前最重要的事情。</li>
</ol>
<p>目标可以有很多,但是必须一次只能有一个。
2年前的一篇<a href="http://zhouyichu.com/words/Models-for-Life/">博文</a> 中,我曾经把人生比做大树模型。
现在我依然这么想,但是就像任何一棵真正的大树一样,我们的人生也需要剪枝。
只留下主要的分枝,才能继续健康的成长。
分枝过多,养分容易分散,每个分枝都不可能有长足的成长。
尤其是在当前社会分工越来越细的情况下,专业知识越来越多的情况,只有专注,才能更好的成长。</p>
<ol>
<li><strong>做计划其实是一个学习的过程</strong>。</li>
</ol>
<p>这里的学习有两个含义: 1. 你不可能一步到位地制定出一个完美的计划。 2. 生活工作是一个动态变化的过程,你必须根据实际情况不断学习、改变你的计划。
永远不要想一劳永逸地制定一个完美的计划,生活工作总是会有一些突发情况是你无法预料的,你不可能制定出事无巨细的计划。
制定计划是一个漫漫学习的过程,你必须知道自己的能力有多少,每个任务需要花费多少时间。
然而,正确地预估时间其实是一个很难的事情。
这也是需要学习认识你自己的一个地方。
目前来说,我最多只能计划我一整天的事情,一周、一个月的计划,制定了我也无法顺利执行。</p>
<h2>生活经验</h2>
<p>出了国之后才发现自己的生活经验是多么的缺乏,真正是一个「手无缚鸡之力」的书生。
这让我觉得自己就像是「飘」中的斯嘉丽,生活发生巨变之后,突然发现自己在新生活中毫无生存能力。
过去都是依靠别人的服务才能生活得那么舒服。
当自己要真正面对生活时,才发现自己什么都不是,只是一个战五渣……</p>
<p>好在,战五渣也是能够提高的,斯嘉丽也做出了改变。
我也开始面对真正的生活。</p>
<h1>更新日志</h1>
<ul>
<li>2016-12-31 完成初稿</li>
</ul>2016年11月书单2016-12-04T00:00:00-07:002016-12-04T00:00:00-07:00Flyawaytag:zhouyichu.com,2016-12-04:/reading-list/Reading-List-2016-November/<ol>
<li>月亮与六便士 2. 无声告白, 3. 七年就是一辈子 4. 菊与刀 5. 余罪1-3 6. 局外人 7. 棋王 8. 第八日的蝉 9. 当我谈跑步时,我在谈些什么 10. 人类简史</li>
</ol><h1>月亮与六便士</h1>
<p>作者:<a href="https://en.wikipedia.org/wiki/W._Somerset_Maugham">W. Somerset Maugham</a></p>
<p>这本「月亮与六便士」可谓是闻名已久了,我在不同的地方、不同的场合都读到、听到别人推荐这本小说。
现在我终于也读完了这本小说,某种程度上也能理解大家推荐的原因了。</p>
<p>首先这个小说的故事是非常简单的,没有曲折、没有大反转,有的只是平实的记录。
书名「月亮与六便士」起的非常好,世俗的名利和心中的明月到底如何取舍?</p>
<p>作者在书中并没有明显的价值取向,我想他是把思考的任务留给了读者吧。
他只是客观中性的描述了一个故事,然后留待读者自己去思考。</p>
<p>其实,对于世俗和高尚的争论已经存在很多年了,至今没有答案。
我认为这是根本不是一个对与错的问题,而只是一个价值观的问题。
价值观的问题是没有对错的,每个人自己的选择不同而已,这个问题不需要争论,最多只需要讨论。</p>
<p>我佩服斯特里克兰的大无畏精神,佩服他敢于抛弃一切的勇气。
但我知道,我永远无法成为那样的人。
为了心中一个梦想,可以无视外界所有事物。
我也不认为选择「六便士」就是可耻的,安逸的环境、富足的生活是正常人的追求,没有可指责的。</p>
<p>但是,但就从故事剧情上说,我有几点疑问:</p>
<ol>
<li>斯特里克兰他早干嘛去了?
为什么到了40多岁才发现自己真正想要的是什么?</li>
<li>我并不认为追求绘画和家庭生活有什么冲突的地方。。。。。</li>
<li>前四十年平淡无奇的一个人,怎么会在中年突然转变性格,抛家舍业地去追求心中的「月亮」?
这样的设定是不是太过突兀了,对于一个人来说突然转了180度,让人有些无法接受。</li>
</ol>
<p>我们大部分人都无法成为斯特里克兰,但我们其实和他是一样的,我们都在追求自己的幸福,我们绝大多数人的幸福是「六便士」,而他的幸福却是「月亮」。</p>
<p>我想,作为一个普通人,我们常常做的就是:</p>
<p><strong>抬头仰望明月,低头捡起六便士。</strong></p>
<p>另外,从风格上讲,我觉得毛姆和海明威有点相像,文风十分简练、干脆。</p>
<h1>无声告白</h1>
<p>作者: <a href="http://www.celesteng.com/">Celeste Ng</a></p>
<p>这本小说在亚马逊首页上顶了很久,我一直没去看,总以为又是什么畅销网络小说。
前段时间书荒,于是拿出来读了一下,一下子被惊艳到了。
这是确实是一部非常好的小说,难怪在亚马逊上被顶了这么久……</p>
<p>小说主题的主要是讨论了青少年的教育和第二代移民的生活状态。
从这本小说中得到的最大体会是:</p>
<ol>
<li>绝不要把自己未完成的梦想压到孩子身上</li>
<li>有多个孩子的情况下,尽量平等对待每一个孩子</li>
</ol>
<p>书中的玛丽玲和詹姆斯绝对是最失败的夫妻,他们有三个孩子,而他们从来只把焦点放在长女身上,完全忽视另外两个孩子。
书中反复出现的一个细节的是,最小的孩子汉娜的习惯行为躲在桌子下面抱腿而坐,完全不在大家的视线范围以内。
每次读到这个细节,总是悲从中来……</p>
<p>长女莉迪亚也是一个悲剧性的角色,10年来总是承受着来自父母的无形压力,书中有句话说得很好:</p>
<blockquote>
<p>父母越是关注你,对你的期望就越高,他们的关心就像雪一样不断落到你的身上,最终把你压垮。</p>
</blockquote>
<p>最终不堪重负的莉迪亚终于选择终结了自己的生命。</p>
<p>三个孩子因为父母的无形偏爱,没有一个是幸福快乐的,这真是悲哀!</p>
<h1>七年就是一辈子</h1>
<p>作者: 李笑来</p>
<p>这是我阅读的第二本李笑来的书了,有点鸡汤文的感觉,但更多的是他各种奋斗之后的总结经验。
书中的很多很多观点和概念,对刷新自己对世界的认识还是很有帮助的。
其中比较重要的几个观点是:</p>
<ol>
<li>复利效应: 学识可以不断累积的,不断更新自己的操作系统,总有一天会变成精英。但是,记住要有耐心,耐心很重要!</li>
<li>活在未来,要主动选择。</li>
<li>风险的大小取决于你赌本的大小: 你拥有足够多的资源,即使是小概率事件,在不断反复尝试下,它总是会发生。
如果拥有丰富的资源,小概率事件就不是什么有风险的事情了。</li>
</ol>
<p>完整的脑图如下所示:</p>
<p><img alt="Seven-Years" src="http://zhouyichu.com/images/seven-years.png"/></p>
<h1>菊与刀</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Ruth_Benedict">Ruth Benedict</a></p>
<p>这又是一本分析日本文化的书,名气很大。
读下来的感觉是,作者的分析很深入,把日本文化中那种矛盾的本质分析得很透彻。</p>
<p>这本书看得比较快,没有做很翔实的笔记,因此也没有做出对应的脑图。。。</p>
<h1>余罪1-3</h1>
<p>作者: 常书欣</p>
<p>这是最近比较流行的小说,看了一部分内容,不想看了。
完全是网络小说的写法,没有什么营养价值。
果断弃看了。</p>
<h1>局外人</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Albert_Camus">Albert Camus</a></p>
<p>这确实是一部不可多得的小说。
虽然故事很简单荒诞,但是作者所描述的内容却直击心灵。
要怎样的人才能成为这样一个局外人?
一个活在自己世界里的人,却无端收到外部世界的攻击。</p>
<p>其实,我觉得自己也是一个活在自己世界里的人。
很多时候,我都喜欢一个人待着,不喜欢处于人群之中。
但是,另一方面,我也很清楚,当前的社会如果没有良好的人际圈子,你是很难有长足的发展的。
这是我的矛盾之一。
既想构建完全属于自己的世界,又不想完全放弃与外界联系,从两难中寻找适合的平衡点。</p>
<h1>棋王</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E9%98%BF%E5%9F%8E_(%E4%BD%9C%E5%AE%B6)">阿诚</a></p>
<p>老实说,我并没怎么看懂这本小说。
也许是因为我并没有经历那一段特殊的历史时期。</p>
<p>文字很朴实,让我联想到了「平凡的世界」.</p>
<p>让我印象最深刻的是,王一生在火车上吃饭时的情形。
刻画得非常生动,也表达出了当年物质匮乏的现状。</p>
<h1>第八日的蝉</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E8%A7%92%E7%94%B0%E5%85%89%E4%BB%A3">角田光代</a></p>
<p>虽然看完了整本小说,但是却无法理解作者想要表达的主题。
书中多次出现的有关蝉的比喻,我实在难以将其与故事剧情结合在一起。</p>
<p>表面上看,小说表达是一种大爱无疆的母爱。
但我又隐隐觉得不应该这么简单。
熏在重新踏上希合子的老路之后,并没有选择同样的处理方式,而是学会了坚强,学会了独立生养孩子。
这和希合子又有所不同。
历史是螺旋的,但却是在上升的。</p>
<h1>当我谈跑步时,我在谈些什么</h1>
<p>作者: <a href="https://zh.wikipedia.org/zh/%E6%9D%91%E4%B8%8A%E6%98%A5%E6%A8%B9">村上春树</a></p>
<p>我觉得这是一本村上春树的散文集合,文字很优美。
看了这本书之后,也有一种冲动想要尝试铁人三项的运动。</p>
<p>但是作为一个学理工科的人来说,似乎这本书并没有让我学到什么重要的意义。
优美的文字只是带给了我精神上的愉悦。
用现在的话说,文字优美,却没有什么干货。</p>
<h1>人类简史</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Yuval_Noah_Harari">Yuval Noah Harari</a></p>
<p>我在各种不同的场合都看到关于这本书的推荐,于是,为了赶``赶潮流"",我开始阅读这本书了。
整个十一月都是在阅读这本书,这部书写得果然很不错。
从史前文明一直论述到我们的现代社会,纵观了整个人类的发展历程。</p>
<p>脑图如下所示:</p>
<p><img alt="A-brief-history-of-humankind" src="http://zhouyichu.com/images/A-brief-history-of-humankind.png"/></p>
<h1>更新日志</h1>
<ul>
<li>2016-11-8添加「月亮与六便士」</li>
<li>2016-11-8添加「无声告白」</li>
<li>2016-11-20添加 「菊与刀」</li>
<li>2016-11-20添加 「余罪」</li>
<li>2016-12-4添加 「局外人」</li>
<li>2016-12-4添加 「棋王」</li>
<li>2016-12-4添加 「第八日的蝉」</li>
<li>2016-12-4添加 「当我谈跑步时,我在谈些什么」</li>
<li>2016-12-4添加 「人类简史」</li>
</ul>2016年10月书单2016-10-30T11:13:52-06:002016-10-30T11:13:52-06:00Flyawaytag:zhouyichu.com,2016-10-30:/reading-list/Reading-List-2016-October/<ol>
<li>一本书读懂日本历史 2. 巨人的陨落 3. 一平米健身 4. 繁星若尘 5. 星空暗流 6. 苍穹一粟 7. 永恒的终结</li>
</ol><h1>一本书读懂日本历史</h1>
<p>作者: 周杰</p>
<p>这本书概括的介绍了日本的历史,从传说中的神武天皇到二战结束。</p>
<p>阅读之后,其实觉得日本历史还是比较简单的,由于其天皇是「万世一系」的,因此并没有发生朝代更替。
只能说是不同的时代,我总结整个日本史也就几个时代而已:</p>
<ol>
<li>神话时代,神武天皇统一日本,开创大和国。</li>
<li>天皇统治期,当时日本积极地向唐朝学习,但是皇族、权臣内斗不断,权力斗争比较激烈。在这一时期也涌现出了一些女性政治家,甚至还有几位女性天皇。</li>
<li>幕府时代,逐渐形成了庄园体制,平清盛建立了第一个武家政权,开创幕府统治的先河.</li>
<li>战国时代,说是战国时代,其实就是一大帮庄园主相互争斗,整个战国时代持续了150年,最大规模的一场战争好像是十几万对十几万,我有点记不清了。</li>
<li>德川幕府时代(江户时代),德川幕府是日本历史上的最后一个将军幕府,统治了200多年。
江户时代晚期也和中国一样奉行闭关锁国的政策,结果被美国用坚船利炮打开了国门。
在发生一系列的政局动荡之后,日本终于确立了明治天皇的统治地位,开始进行制度改革,建立了所谓的「明治大日本帝国」。
其实在当时,日本帝国就明确的知道自己作为一个岛国,发展潜力毕竟有限,在当时乱局中必须向外拓展,才能继续发展。
所以在明治天皇登基初期就确立了「开拓万里之波涛,宣布国威于四方」的政策,也为后来的军国主义埋下了种子。</li>
<li>军国主义时期,当时日本作为一个政治、经济、军事上的暴发户,自信心急剧爆棚,涌现了一大堆的法西斯思想者,其中最出名的就是大川周明和北一辉。
这其中的历史和中国息息相关,此处也不再需要赘述了,大家都知道日本的结局是什么。</li>
<li>二战之后,在二战之后日本在美国的帮助下迅速恢复了经济生产,主要依靠在朝鲜战争期间美国大量的军事订单,日本才能在短短几年的时间内积累了大量资本,使其再次重新崛起。
日本其实是美国为了遏制中国和俄罗斯而安排在亚洲的一个棋子。</li>
</ol>
<p>现在中日矛盾比较激烈,然而我想不明白的是,日本最恨不应该是美国吗?
日本的宪法是美国制定的,日本的国土上至今还有美国驻军,作为一个国家这难道不是奇耻大辱吗?</p>
<p>整本书写得其实还是很不错的,当然它一定是省略了很多的东西。
全书古代史(江户时代之前)只占了50%的比例,后面50%比较详细的阐述了明治维新开始到近现代的日本历史。</p>
<p>整本书读下来,有几点印象比较深刻:</p>
<ol>
<li>日本人似乎不太把名字当回事,书中很多人物都不停改名字,比如丰臣秀吉,原姓木下,后来改姓羽柴,后来又改称丰臣。</li>
<li>日本天皇其实在历史上实际掌权并没有多少时间,真正神化天皇是从明治维新开始的。</li>
</ol>
<p><img alt="日本历史的脑图" src="http://zhouyichu.com/images/history-of-japan.png"/></p>
<h1>巨人的陨落</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Ken_Follett">Kenneth Martin Follett</a></p>
<p>这是一部很长的历史小说,也是属于慢热型。
我曾经一度弃看.
但是,这确实是一本写得非常好的小说。</p>
<p>时代背景是一战时的背景,展现了各个阶层的人物在社会动荡时期的各种表现。
全书没有固定的主角,多条线路同时展开。
某种程度上和「<a href="https://en.wikipedia.org/wiki/A_Song_of_Ice_and_Fire">冰与火之歌</a>」很像,多条线路同时展开。
但又没有像「冰与火之歌」那样的拖沓,相对来说,比较张弛有度。</p>
<p>主要角色有:</p>
<ul>
<li><strong>茉黛</strong>: 英国女勋爵,爱上德国贵族沃尔特,两人在战前秘密结婚,战后一起在德国生活。茉黛是一位女权主义者,为了让当时的英国承认妇女的选举权,积极参与政治活动。</li>
<li><strong>菲茨</strong>: 英国伯爵,茉黛的哥哥。典型的英国贵族,讲究礼仪,爱国,认为英国是世界霸主。同时私生活混乱,有多位情妇。</li>
<li><strong>艾瑟尔</strong>: 英国矿工的女儿,曾今是菲茨伯爵的女管家和情妇。当她看清伯爵的自私之后,毅然投身女权运动中,成为了一名积极的女政治活动家。</li>
<li><strong>比利</strong>: 艾瑟尔的弟弟,战前是一名英国矿工。一战过程立过很多军功,在俄国受到布尔什维克的思想。战后回到了家乡,开始积极参与政治活动。</li>
<li><strong>格斯杜瓦</strong>: 美国参议院的儿子,威尔逊总统的幕僚。为了避免一战积极奔走,战后积极参与筹建合联国.</li>
<li><strong>沃尔特</strong>: 德国贵族,战前积极奔走呼吁避免战争,同时战前与英国茉黛女勋爵秘密结婚,战后两人一起在德国生活。</li>
<li><strong>格雷戈里</strong>: 俄国铸造工,参与十月革命,最终成为俄国共产党骨干。</li>
<li><strong>列夫</strong>: 格雷戈里的弟弟,因在俄国犯案逃亡美国,在美国落地生根。</li>
</ul>
<p>这本书的名字叫「巨人的陨落」,我认为主要有以下几个意义:</p>
<ol>
<li>首先是国家之间的战争,一场大战打完,大家都成为了输家,只有美国崛起了。</li>
<li>底层工人开始争取自己的合法权利,英国工人积极参与政治活动,俄国工人直接发动暴力革命。</li>
<li>女权运动兴起,最终迫使政府给予女性选举权。</li>
</ol>
<h1>一平米健身</h1>
<p>作者: 宾卡</p>
<p>之前看过宾卡的「<a href="https://book.douban.com/subject/26359758/">硬派健身</a>」,但是感觉宾卡的文章是比较客观实在的,大部分的结论都是基于实验数据的,比较有信服力。</p>
<p>这本「一平米健身」一脉相承,保持了相同的特点,大量引用了各种文献资料,内容很充实。
然后,本书也有没有覆盖到的地方,比如饮食方面就基本没有涉及到。
其中有些内容和「硬派健身」有重叠的部分。</p>
<p><img alt="一平米健身" src="http://zhouyichu.com/images/workout.png"/></p>
<h1>繁星若尘</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>这是阿西莫夫<a href="https://zh.wikipedia.org/wiki/%E9%8A%80%E6%B2%B3%E5%B8%9D%E5%9C%8B%E4%B8%89%E9%83%A8%E6%9B%B2">银河帝国系列</a>的第一本,老实说,其实小说本身并不怎么样,和他其他的作品相比,实在不能算是优秀。
也许这也是为什么银河帝国系列的小说并不如其他系列(<a href="https://zh.wikipedia.org/wiki/%E5%9F%BA%E5%9C%B0%E7%B3%BB%E5%88%97">基地系列</a>、<a href="https://zh.wikipedia.org/wiki/%E6%A9%9F%E5%99%A8%E4%BA%BA%E7%B3%BB%E5%88%97">机器人系列</a>)那么出名吧.</p>
<h1>星空暗流</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>这是<a href="https://zh.wikipedia.org/wiki/%E9%8A%80%E6%B2%B3%E5%B8%9D%E5%9C%8B%E4%B8%89%E9%83%A8%E6%9B%B2">银河帝国系列</a>的第二部,算是中规中矩吧,并没有让我太惊艳的地方。</p>
<h1>苍穹一粟</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>这是<a href="https://zh.wikipedia.org/wiki/%E9%8A%80%E6%B2%B3%E5%B8%9D%E5%9C%8B%E4%B8%89%E9%83%A8%E6%9B%B2">银河帝国系列</a>的第三部,引入了时空穿越的剧情,相较于之前的两部,可读性更高一些。</p>
<h1>永恒的终结</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>在看了上面的三部一般性的作品之后,这本「永恒的终结」却带给我意外的惊喜。
剧情好几次峰回路转,让人欲罢不能。</p>
<p>与前面几部不同的是,在这部作品中体现出了作者对人类社会发展的整体性思考:</p>
<ol>
<li>外部环境的恶劣能够促进生物的不断进化,如果人类永远处于舒适而完美的世界中,人类永远无法继续进步,只会一步一步颓废下去。</li>
<li>所谓世界大战、饥荒真的是坏事吗?对于个人来说,毋庸置疑这是毁灭性的打击。但是对于人类整体来说,也许反而是好事。各种各样的灾难能不断促进人类不断进步。现代信息社会的基础不就是在二战期间打下的吗?</li>
<li>个人、国家、人类整体不应该太安逸,要有不断的进取心,向外探索才能保证自我的延续。</li>
</ol>
<h1>更新日志</h1>
<ul>
<li>2016-10-10添加「一本书读懂日本史」读书笔记</li>
<li>2016-10-23添加 「巨人的陨落」</li>
<li>2016-10-23添加 「一平米健身」</li>
<li>2016-10-30添加 「繁星若尘」</li>
<li>2016-10-30添加 「星空暗流」</li>
<li>2016-10-30添加 「苍穹一粟」</li>
<li>2016-10-30添加 「永恒的终结」</li>
</ul>开源项目PYEVALB2016-10-16T16:01:06-06:002016-10-16T16:01:06-06:00Flyawaytag:zhouyichu.com,2016-10-16:/project/PYEVALB/<p>PYEVALB个人开源项目介绍</p><h1>起因</h1>
<p>秋假在家略无聊,在翻阅过去代码的时候,发现曾经为了对句法树进行打分而写过一个小项目。
于是,决定利用这个假期把这个小项目给开源了,取名为PYEVALB.</p>
<p><a href="https://github.com/flyaway1217/PYEVALB">PYEVALB</a>是我个人真正意义上的第一个开源项目,将它发表之后还是感觉很高兴的。</p>
<h1>PYEVALB</h1>
<p>在<a href="https://en.wikipedia.org/wiki/Natural_language_processing">自然语言处理</a>中,有一个称为<a href="https://en.wikipedia.org/wiki/Parsing">句法分析</a>的基本任务: 将一个句子表示成一棵句法树。
而<a href="https://github.com/flyaway1217/PYEVALB">PYEVALB</a>就是用来衡量两棵树的相似程度的一个工具。</p>
<p>目前学术界大家要不就是自己写,要不就是用纽约大学开放的工具<a href="http://nlp.cs.nyu.edu/evalb/">Evalb</a>.
但是<a href="http://nlp.cs.nyu.edu/evalb/">Evalb</a>是用C语言写的,作为独立工具当然是很方便的,但是如果希望能将其集成到某个项目中去,那就比较麻烦了。</p>
<p>因此,为了更好的集成到开发过程中,我用Python重写了<a href="http://nlp.cs.nyu.edu/evalb/">Evalb</a>的功能,开发了<a href="https://github.com/flyaway1217/PYEVALB">PYEVALB</a>项目。</p>
<h2>安装</h2>
<pre><code>:::bash
pip install PYEVALB
</code></pre>
<h2>为句法树库打分</h2>
<p>对两个句法树库进行打分比较:</p>
<pre><code>#!python
from PYEVALB import scorer
gold_path = 'gold_corpus.txt'
test_path = 'test_corpus.txt'
result_path = 'result.txt'
scorer.evalb(gold_path, test_path, result_path)
</code></pre>
<p>在<code>result.txt</code>中,我们会得到:</p>
<pre><code>:::markdown
ID | length | state | recall | prec | matched_brackets | gold_brackets | test_brackets | cross_brackets | words | correct_tags | tag_accracy
---:|-------:|------:|-------:|-----:|-----------------:|--------------:|--------------:|---------------:|------:|-------------:|------------:
0| 44| 0| 0.57| 0.61| 31| 54| 51| 16| 44| 43| 0.98
1| 13| 0| 0.64| 0.60| 9| 14| 15| 3| 13| 12| 0.92
2| 29| 0| 0.97| 0.97| 29| 30| 30| 0| 29| 29| 1.00
3| 20| 0| 0.80| 0.80| 20| 25| 25| 4| 20| 20| 1.00
4| 19| 0| 0.91| 1.00| 21| 23| 21| 0| 19| 19| 1.00
5| 71| 0| 0.67| 0.68| 52| 78| 77| 15| 71| 65| 0.92
6| 16| 0| 0.61| 0.69| 11| 18| 16| 0| 16| 14| 0.88
7| 27| 0| 0.92| 0.96| 24| 26| 25| 0| 27| 26| 0.96
8| 19| 0| 1.00| 1.00| 20| 20| 20| 0| 19| 19| 1.00
9| 41| 0| 0.80| 0.78| 32| 40| 41| 5| 41| 39| 0.95
=================================================================================================================================================
Number of sentence: 10.00
Number of Error sentence: 0.00
Number of Skip sentence: 0.00
Number of Valid sentence: 10.00
Bracketing Recall: 75.91
Bracketing Precision: 77.57
Bracketing FMeasure: 76.73
Complete match: 10.00
Average crossing: 4.30
No crossing: 50.00
Tagging accuracy: 95.65
</code></pre>
<h2>为两棵树打分</h2>
<pre><code>#!python
from PYEVALB import scorer
from PYEVALB import parser
gold = '(IP (NP (PN 这里)) (VP (ADVP (AD 便)) (VP (VV 产生) (IP (NP (QP (CD 一) (CLP (M 个))) (DNP (NP (JJ 结构性)) (DEG 的)) (NP (NN 盲点))) (PU :) (IP (VP (VV 臭味相投) (PU ,) (VV 物以类聚)))))) (PU 。))'
test = '(IP (IP (NP (PN 这里)) (VP (ADVP (AD 便)) (VP (VV 产生) (NP (QP (CD 一) (CLP (M 个))) (DNP (ADJP (JJ 结构性)) (DEG 的)) (NP (NN 盲点)))))) (PU :) (IP (NP (NN 臭味相投)) (PU ,) (VP (VV 物以类聚))) (PU 。))'
gold_tree = parser.create_from_bracket_string(gold)
test_tree = parser.create_from_bracket_string(test)
result = scorer.score_trees(gold_tree, test_tree)
print('Recall =' + str(result.recall))
print('Precision =' + str(result.prec))
</code></pre>
<p>运行上述代码之后,我们能得到如下的输出:</p>
<pre><code>:::bash
Recall = 64.29
Precision = 56.25
</code></pre>
<h1>结论</h1>
<p><a href="https://github.com/flyaway1217/PYEVALB">PYEVALB</a>这个工具还很简陋,只是完成了最初步的功能,还有很多地方需要完善。
后面我也会好好维护这个项目,尽管是比较小众的工具……</p>
<h1>更新日志</h1>Winnow算法及其Mistake Bound2016-10-12T00:00:00-06:002016-10-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-10-12:/machine-learning/Window-Mistake-Bound/<p>Winnow算法的介绍及其Mistake Bound的证明。</p><h1>Winnow算法</h1>
<p><a href="https://en.wikipedia.org/wiki/Winnow_(algorithm)">Winnow</a>和<a href="http://zhouyichu.com/machine-learning/Perceptron-Mistake-Bound/">Perceptron的Mistake Bound</a>算法很相似,都是一种<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>的算法,主要区别在于其更新方式的不同。</p>
<p>Winnow算法的基本设定如下:</p>
<p><strong>Input</strong>: A sequence of training examples <span class="math">\((x_1,y_1),(x_2,y_2),\cdots\)</span>, 其中<span class="math">\(x_i\in R^n,y_i\in \{-1,1\}\)</span></p>
<ol>
<li>初始化: <span class="math">\(w_0=1\in R^n\)</span>, <span class="math">\(\theta = n\)</span></li>
<li>对于每一个训练样本<span class="math">\((x_i,y_i)\)</span>:<ol>
<li>使用<span class="math">\(w_t\)</span>和<span class="math">\(\theta\)</span>进行预测: <span class="math">\(y^{'}=sgn(w_t^Tx_i - \theta)\)</span></li>
<li>如果<span class="math">\(y_i=+1\)</span>而<span class="math">\(y^{'}=-1\)</span>,则:<ul>
<li>对于<span class="math">\(w_t\)</span>中所有<span class="math">\(x_i\)</span>不为零的权重进行更新: <span class="math">\(w_t=2w_t\)</span></li>
</ul>
</li>
<li>如果<span class="math">\(y_i=-1\)</span>而<span class="math">\(y^{'}=+1\)</span>,则:<ul>
<li>对于<span class="math">\(w_t\)</span>中所有<span class="math">\(x_i\)</span>不为零的权重进行更新: <span class="math">\(w_t=\frac{w_t}{2}\)</span></li>
</ul>
</li>
</ol>
</li>
<li>返回最终的权重</li>
</ol>
<p>我们可以看到,<a href="https://en.wikipedia.org/wiki/Winnow_(algorithm)">Winnow</a>算法的框架和<a href="http://zhouyichu.com/machine-learning/Perceptron-Mistake-Bound/">Perceptron的Mistake Bound</a>是非常接近的,只不过<strong>Perceptron</strong>是加法式更新,而<strong>Winnow</strong>是乘法式更新。</p>
<h2>适用问题</h2>
<p>从上述的算法流程中,我们可以看到,<strong>Winnow</strong>算法每次更新时,只更新部分的权重,提高那些有正影响的权重,而降低那些有负影响的权重。
因此,对于那些维度(<span class="math">\(n\)</span>)很大,但实际真正有影响力的维度(<span class="math">\(k\)</span>)却很小(<span class="math">\(k\ll n\)</span>)的问题,<strong>Winnow</strong>应该是一个更好的选择。
在这里,我们能给出<strong>Winnow</strong>算法的Mistake Bound: <strong>Winnow算法的Mistake Bound是<span class="math">\(k(1+\log n)\)</span></strong></p>
<h1>Winnow的Mistake Bound</h1>
<p>基本设定:</p>
<ul>
<li>对任意的训练数据<span class="math">\((x_i,y_i)\)</span>:我们假设<span class="math">\(x_i\in \{0,1\}^n, y_i\in \{0,1\}\)</span></li>
</ul>
<p>在上述这个假设下,我们就来证明<strong>Winnow</strong>的Mistake Bound.</p>
<p>就像算法所描述的,要证明<strong>Winnow</strong>的Mistake Bound,我们需要考虑两方面的内容:</p>
<ol>
<li>Winnow在正例上犯错次数的界,我们用<span class="math">\(m^{+}\)</span>表示</li>
<li>Winnow在负例上犯错次数的界,我们用<span class="math">\(m^{-}\)</span>表示</li>
</ol>
<p>则,整体的Mistake Bound就是<span class="math">\(m^{-}+m^{+}\)</span>.</p>
<h2>在正例上犯错</h2>
<p>根据<strong>Winnow</strong>的更新法则,每一次在正例上犯错,相应的权重都会提高2倍,而预测标准则是<span class="math">\(sgn(w_t^T x - \theta)\)</span>.
这就说明,对于任意一个有影响力的特征来说,它最多会被提高<span class="math">\(1+\log n\)</span>次。
某个有影响力的特征被提高<span class="math">\(1+\log n\)</span>次之后,它就不会再犯错了(此时该权重已经大于<span class="math">\(\theta\)</span>)。</p>
<p>因为一共有<span class="math">\(k\)</span>个具有影响力的特征,因此我们就能得到<span class="math">\(m^{+}=k(1+\log n)\)</span>.</p>
<h2>在负例上犯错</h2>
<p>在负例上的犯错次数就比较麻烦了,我们需要一些技巧。</p>
<p>令<span class="math">\(TW_t\)</span>表示在第<span class="math">\(t\)</span>步时,所有权重的和,也即<span class="math">\(TW_t=\sum\limits_{i}^n w_{ti}\)</span>.</p>
<p><strong>在正例上犯错</strong></p>
<p>如果在<span class="math">\(t\)</span>步时,算法在正例上犯错了,我们可以很容易得到: <span class="math">\(TW_{t+1}<TW_t + n\)</span>.
因此,<span class="math">\(TW\)</span>的整体的增量小于<span class="math">\(nm^{+}\)</span>.</p>
<p><strong>在负例上犯错</strong></p>
<p>如果在<span class="math">\(t\)</span>步时,算法在负例上犯错了,我们就能得到:<span class="math">\(WT_{t+1}<TW_t - \frac{n}{2}\)</span>.
因此,<span class="math">\(TW\)</span>的整体减量小于<span class="math">\(\frac{n}{2}m^{-}\)</span>.</p>
<p>因为<span class="math">\(TW_0=n\)</span>,则最终我们能得到:</p>
<div class="math">$$
0 < TW_t < n+nm^{+}-\frac{n}{2}m^{-} \Rightarrow m^{-} < 2(1+m^{+})
$$</div>
<h2>整体的Mistake Bound</h2>
<p>所以整体的犯错次数是:</p>
<div class="math">$$
m^{+} + m^{-} < m^{+} + 2(1+m^{+}) = 3m^{+} + 2 < 3k(1+\log n) + 2
$$</div>
<p>也就是说,<strong>Winnow</strong>算法的Mistake Bound是<span class="math">\(O(k\log n)\)</span>.</p>
<h1>参考资料</h1>
<ul>
<li>Vivek Srikumar教授的<a href="http://svivek.com/teaching/machine-learning/fall2016/lectures/07-multiplicative-update.html">课件</a></li>
<li>Avrim Blum的<a href="https://www.cs.cmu.edu/~avrim/ML10/lect0120.txt">算法笔记</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2016年10月12日完成初稿并发布</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Perceptron的Mistake Bound2016-10-11T00:00:00-06:002016-10-11T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-10-11:/machine-learning/Perceptron-Mistake-Bound/<p>Perceptron的mistake bound证明. 内容提要 1. Perceptron的Mistake Bound是什么 2. 如何证明</p><p>大概3年前第一次学习<a href="https://en.wikipedia.org/wiki/Perceptron">Perceptron(感知机)</a>的时候,就已经写过相关的<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Perceptron/">博文</a>。
但是,当时仅仅只是在搬运知识而已,其实当时很多内容自己都是一知半解的。
但是现在随着学习的深入,逐渐领悟到了更多的东西,逐渐理清了整个体系。
因此,觉得有必要再好好整理输出一下,加深理解。</p>
<h1>Perceptron(感知机)</h1>
<p><a href="https://en.wikipedia.org/wiki/Perceptron">Perceptron(感知机)</a>算是机器学习中最简单的模型之一了,其基本框架如下所示:</p>
<p><strong>Input</strong>: A sequence of training examples <span class="math">\((x_1,y_1),(x_2,y_2),\cdots\)</span>, 其中<span class="math">\(x_i\in R^n,y_i\in \{-1,1\}\)</span></p>
<ol>
<li>初始化: <span class="math">\(w_0=0\in R^{n+1}\)</span></li>
<li>对于每一个训练样本<span class="math">\((x_i,y_i)\)</span>:<ul>
<li>使用权重<span class="math">\(w_t\)</span>进行预测:{% math %}y^{'}=sgn(x_t^T x_i){% endmath %}</li>
<li>如果<span class="math">\(y_i\neq y^{'}\)</span>: 更新<span class="math">\(w_{t+1}=w_t+r(y_ix_i)\)</span></li>
</ul>
</li>
<li>返回最终的权重</li>
</ol>
<h1>Perceptron的Mistake Bound</h1>
<p>Perceptron是针对线性可分数据的一种分类器,它属于<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>的算法。
我在之前的一篇<a href="http://zhouyichu.com/machine-learning/Mistake-Bound-Algorithm/">博文</a>中提到了<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>模型的Mistake Bound衡量标准。
现在我们就来分析一下Perceptron的Mistake Bound是多少。</p>
<p>在分析其Mistake Bound之前,我们首先需要定义几个概念。</p>
<ol>
<li>我们使用<span class="math">\(R\)</span>表示训练数据集中距离原点最远的点的距离。
也就是说,对于数据集<span class="math">\((x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\)</span>来说,其中任意一个实例<span class="math">\((x_i,y_i)\)</span>都满足<span class="math">\(\Vert x_i \Vert\le R\)</span>.</li>
<li>Perceptron最终学习到的其实是一个分割正负例数据的超平面,我们定义数据集中距离超平面距离最近的点的距离为<span class="math">\(\gamma\)</span></li>
</ol>
<p>在定义了上述两个概念之后,我们就能给出结论:<strong>Perceptron的Mistake Bound是: <span class="math">\((\frac{R}{\gamma})^2\)</span></strong>.</p>
<p>也就是说,Perceptron在训练集上最多会犯<span class="math">\((\frac{R}{\gamma})^2\)</span>次错误.
这被称为<strong>Novikoff定理</strong>.</p>
<h1>Novikoff定理的证明</h1>
<p>在开始我们的证明过程之前,我们首先需要明确一些基本设定:</p>
<ol>
<li>数据是线性可分的</li>
<li>权重初始值为0向量,且更新步长为1.</li>
<li>训练集中最远点的距离为<span class="math">\(R\)</span></li>
<li><span class="math">\(u\)</span>是一个单位向量,且能够完美分割数据的最优超平面(因为已经假设数据是线性可分的,因此<span class="math">\(u\)</span>必然是存在的)</li>
<li><span class="math">\(\gamma\)</span>是数据集中距离超平面<span class="math">\(u\)</span>最近点的距离</li>
</ol>
<p>另外,我们需要知道Perceptron的更新条件和更新法则:</p>
<ol>
<li>Perceptron更新条件是: <span class="math">\(y_i(w_t x_i) < 0\)</span></li>
<li>Perceptron的更新法则是: <span class="math">\(w_{t+1}=w_t+r(y_i x_i)\)</span></li>
</ol>
<p>要证明Novikoff定理,我们只需要证明如下两个不等式.</p>
<h2>1. <span class="math">\(u^Tw_t\ge t\gamma\)</span></h2>
<p>假设Perceptron在学习过程中已经犯了<span class="math">\(t\)</span>次错误,则:</p>
<div class="math">$$
\begin{aligned}
u^Tw_{t+1} &= u^T(w_t+y_ix_i)\\
&= u^Tw_t + u^T y_i x_i\\
&\ge u^Tw_t + \gamma
\end{aligned}
$$</div>
<ol>
<li>其中第一个等号是根据Perceptron的更新法则得到的</li>
<li>不等号是因为: 实际上<span class="math">\(u^T y_i x_i\)</span>表示的是点<span class="math">\(x_i\)</span>到超平面<span class="math">\(u\)</span>的距离,因此这个距离必然大于等于<span class="math">\(\gamma\)</span>.</li>
</ol>
<p>又因为<span class="math">\(w\)</span>的初始值为<span class="math">\(0\)</span>向量,利用归纳法,我们能得到<span class="math">\(u^Tw_t\ge t\gamma\)</span>.</p>
<h2>2. <span class="math">\(\Vert w_t\Vert^2 \le tR^2\)</span></h2>
<p>假设Perceptron载学习过程中已经犯了<span class="math">\(t\)</span>次错误,则:</p>
<div class="math">$$
\begin{aligned}
\Vert w_{t+1} \Vert^2 &= \Vert w_t+x_i y_i \Vert^2 \\
&= w_t^2 + 2w_t x_i y_i + x_i^2\\
&\le w_t^2 + R^2 + 2w_t x_i y_i \\
&\le w_t^2 + R^2
\end{aligned}
$$</div>
<ol>
<li>其中第一个等号是根据Perceptron的更新法则得到的</li>
<li>第一个不等号是根据<span class="math">\(R\)</span>的定义得到的</li>
<li>第二个不等号是因为根据Perceptron的更新条件:<span class="math">\(w_t x_i y_i <0\)</span>.</li>
</ol>
<p>又因为<span class="math">\(w\)</span>的初始值为<span class="math">\(0\)</span>向量,利用归纳法,我们能得到<span class="math">\(\Vert w_t\Vert^2 \le tR^2\)</span>.</p>
<h2>综合</h2>
<p>根据前面两个不等式,我们有:</p>
<ol>
<li><span class="math">\(\Vert w_t \Vert \le \sqrt{t}R\)</span></li>
<li><span class="math">\(u^Tw_t\ge t\gamma\)</span></li>
<li><span class="math">\(u^Tw_t \le \Vert w_t\Vert\)</span></li>
</ol>
<p>第三个不等式是因为:
</p>
<div class="math">$$
u^Tw_t = \Vert u^T \Vert \cdot \Vert w_t \Vert \cdot \cos(\theta) = \Vert w_t \Vert \cdot \cos(\theta) \le \Vert w_t\Vert
$$</div>
<p>因此根据这三个不等式,我们能得到:</p>
<div class="math">$$
t\gamma \le u^Tw_t \le \Vert w_t\Vert \le \sqrt{t} R \Rightarrow t\gamma \le \sqrt{t}R \Rightarrow t\le(\frac{R}{\gamma})^2
$$</div>
<p>证明完成!</p>
<h1>Novikoff定理</h1>
<p>Novikoff定理说明了Perceptron的可学习性,也就是说针对任意的线性可分的数据,Perceptron最多犯<span class="math">\((\frac{R}{\gamma})^2\)</span>次错误就能学到最优的超平面。
同时,也说明了Perceptron算法的收敛性: 只要数据是线性可分的,该算法就一定会收敛。</p>
<h1>参考资料</h1>
<ul>
<li>Vivek Srikumar教授的<a href="http://svivek.com/teaching/machine-learning/fall2016/lectures/06-online-learning-perceptron.html">课件</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2016年10月10日完成初稿并发布。</li>
<li>2016年10月11日修正了一些书写错误。</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Mistake Bound Algorithm2016-10-10T00:00:00-06:002016-10-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-10-10:/machine-learning/Mistake-Bound-Algorithm/<p>Mistake Bound Algorithm的理解。 1. Generic Mistake Bound Algorithm 2. Halving Algorithm</p><h1>前言</h1>
<p>在机器学习中,如何衡量一个机器学习模型的好坏是非常重要的一个方面。
对于<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>模型来说,它主要的衡量标准就是它的Mistake Bound。
Mistake Bound用一个模型在停止训练前所犯的错误次数来衡量一个模型的好坏。
当然,对于一个online模型来说,训练过程中它犯的错误越少越好。</p>
<h1>Online Learning</h1>
<p><a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>是一种基本的机器学习策略,它是一种错误驱动的学习模型。
学习器无法看到整体数据集合,它一次只能看到一个数据实例,处理完当前实例之后,当前实例将会被丢弃。
然后接着处理下一个实例。
整个过程就像工厂里的流水线,样本实例一个一个顺序地过来,学习器一个一个地处理,它永远无法一次看到两个以上的实例。</p>
<p>假设样本空间是<span class="math">\(X\)</span>,目标函数是<span class="math">\(f: X\rightarrow \{0,1\}\)</span>.
则Online Learning的基本框架是:
1. 学习器<span class="math">\(h\)</span>遇到一个样本<span class="math">\(x_i\in X\)</span>
2. 学习器<span class="math">\(h\)</span>作出一个预测<span class="math">\(h(x)\)</span>
3. 如果<span class="math">\(h(x)\neq f(x)\)</span>,则学习器进行更新</p>
<p>当<span class="math">\(h(x)\neq f(x)\)</span>时,我们就认为模型发生了一次错误,我们的目标是希望在训练过程中,这样的错误发生的越少越好。</p>
<h2>优点</h2>
<ol>
<li>对数据分布没有要求</li>
<li>不需要很多的内存消耗</li>
<li>可以容易的转化为batch learning</li>
</ol>
<h2>缺点</h2>
<ol>
<li>太过简单</li>
<li>无法预测错误的发生</li>
</ol>
<h1>Mistake Bound Algorithm</h1>
<p>首先,我们需要给出两个定义:</p>
<ol>
<li><span class="math">\(M_A(f,S)\)</span>表示: 算法<span class="math">\(A\)</span>在训练序列<span class="math">\(S\)</span>上学习目标函数<span class="math">\(f\)</span>时所犯的错误次数。</li>
<li><span class="math">\(M_A(C)=\max\limits_{f,S}M_A(f,S)\)</span>表示: 算法<span class="math">\(A\)</span>在任意的训练序列<span class="math">\(S\)</span>上学习任意的目标函数<span class="math">\(f\)</span>时最多所犯的错误次数。</li>
</ol>
<p>则,如果一个算法<span class="math">\(A\)</span>满足:<em><span class="math">\(M_A(C)\)</span>和特征空间的维度<span class="math">\(n\)</span>是多项式关系的</em>,那么我们就称算法<span class="math">\(A\)</span>是一个<strong>Mistake Bound Algorithm</strong>.
这里的<span class="math">\(n\)</span>用来表示问题的输入规模,而<span class="math">\(M_A(C)\)</span>表示问题的学习代价,如果这两个值是多项式关系的,那么该算法的犯错次数是有一个上界的。</p>
<h1>Generic Mistake Bound Algorithm</h1>
<p>我们首先介绍一种最基本的Mistake Bound Algorithm.
抽象的常规Mistake Bound Algorithm的学习流程如下所示:</p>
<p>在每一次的迭代过程中:
1. <span class="math">\(H_i\)</span>表示在第<span class="math">\(i\)</span>步时的假设空间。
2. 随机地从<span class="math">\(H_i\)</span>中取出一个函数<span class="math">\(h\in H_i\)</span>,然后用它去进行预测。
3. 如果错误发生了(<span class="math">\(h(x)\neq f(x)\)</span>),那么将其从假设空间中去除。
4. 我们得到<span class="math">\(H_{i+1}\subseteq H_i\)</span>.如果发生了错误,那么<span class="math">\(\mid H_{i+1}\mid < \mid H_i \mid\)</span>.</p>
<p>不断循环重复上述过程,我们就能逐渐缩小<span class="math">\(H_i\)</span>,直至<span class="math">\(H_i\)</span>只剩下一个假设函数。
因此这个算法最多会犯<span class="math">\(\mid H_0\mid-1\)</span>次错误。</p>
<p>很明显,这个算法其实就是一种穷举的方式,尝试假设空间中所有的函数,直至只剩下最后一个。
因此它的Mistake Bound就是它假设空间的大小。</p>
<h1>Halving Algorithm</h1>
<p>除了上述这种穷举的方式以外,我们还有一种更快的算法,称为Halving Algorithm.
其过程如下:
1. 初始化<span class="math">\(H_0\)</span>为整个假设空间
2. 当一个样本<span class="math">\(x\)</span>到来时:
1. 使用<span class="math">\(H_i\)</span>中的每一个函数进行预测,选取多数函数预测的标记作为最终的预测结果。
如果多数函数预测为<span class="math">\(0\)</span>,则最终的预测结果就是<span class="math">\(0\)</span>,反之亦然。
2. 如果预测与真实值(<span class="math">\(f(x)\)</span>)不同,则<span class="math">\(H_{i+1}=H_i\text{中所有预测值与f(x)相同的函数}\)</span></p>
<p>不断重复上述过程,直至<span class="math">\(H_i\)</span>中只剩下一个元素(函数).</p>
<p>那么对于Halving算法来说,它的Mistake Bound是多少呢?</p>
<p>其实只要有一点算法基础的人都能看出来,整个Halving算法其实就是一个二分搜索的过程,其Mistake Bound是<span class="math">\(\log \mid H \mid\)</span>.</p>
<p>证明:
</p>
<div class="math">$$
\begin{aligned}
1 = \mid H_n \mid &< \frac{1}{2}\mid H_{n-1} \mid\\
&< \frac{1}{4}\mid H_{n-2} \mid\\
&< \cdots\\
&< \frac{1}{2^n}\mid H_0 \mid = \frac{1}{2^n}\mid H \mid\\
&\Downarrow\\
\mid H \mid &> 2^n \\
&\Downarrow\\
n &< \log \mid H \mid
\end{aligned}
$$</div>
<h1>总结</h1>
<p>Mistake Bound限制了一个学习算法在停止前的犯错次数,这对于Online Learning来说是比较重要,这使得我们能够明确地知道,最多需要犯多少次错误我们的算法才能学得足够好!</p>
<p>但是,我们也能看到,上述的这两个算法都是非常理想化的算法,在实际使用过程中我们永远无法穷举整个假设空间<span class="math">\(H\)</span>.
在接下去的博文中我将会讨论两个具体的<a href="https://en.wikipedia.org/wiki/Online_machine_learning">Online Learning</a>的算法,并分析其Mistake Bound.</p>
<h1>参考资料</h1>
<ul>
<li>Vivek Srikumar教授的<a href="http://svivek.com/teaching/machine-learning/fall2016/lectures/06-online-learning-perceptron.html">课件</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2016年10月9日写成初稿并发布。</li>
<li>2016年10月11日 润色部分细节问题</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>理解NP和NP-Complete2016-10-08T00:00:00-06:002016-10-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-10-08:/algorithm/NP-Complete/<h1>引言</h1>
<p>任何一个学习计算的人都应该了解什么是NP和NP-Complete问题,之前虽然学过,但是很长一段时间没有回顾,基本就已经忘的差不多了。
最近算法课讲到这个问题,本着「好好学习,天天向上」的态度,重新复习一下这几个基本概念。</p>
<p>如果只是需要快速知道什么是NP和NP-Complete,请直接跳跃到最后总结部分。</p>
<h1>「问题」的定义</h1>
<p>我们都知道NP和NP-Complete其实是对不同类别问题的描述,有些是「可解」的问题,而有些是「不可解」的问题。
但是,在区分什么是「可解」和「不可解」之前,我们更需要理解,什么是「问题」.</p>
<p>一个<strong>抽象问题</strong><span class="math">\(Q\)</span>是一个定义在<strong>问题实例集合</strong><span class="math">\(I\)</span>和<strong>问题解集合</strong><span class="math">\(S\)</span>上的一个二元关系。
比如,在最短路径问题中,问题实例就是一个图和两个点组成的三元组,而其对应的解就是一个顶点的序列。</p>
<p><strong>抽象问题</strong>通常分为两个类别:</p>
<ul>
<li>优化问题: 通常需要求得某个值的最大值或最小值</li>
<li>判定问题 …</li></ul><h1>引言</h1>
<p>任何一个学习计算的人都应该了解什么是NP和NP-Complete问题,之前虽然学过,但是很长一段时间没有回顾,基本就已经忘的差不多了。
最近算法课讲到这个问题,本着「好好学习,天天向上」的态度,重新复习一下这几个基本概念。</p>
<p>如果只是需要快速知道什么是NP和NP-Complete,请直接跳跃到最后总结部分。</p>
<h1>「问题」的定义</h1>
<p>我们都知道NP和NP-Complete其实是对不同类别问题的描述,有些是「可解」的问题,而有些是「不可解」的问题。
但是,在区分什么是「可解」和「不可解」之前,我们更需要理解,什么是「问题」.</p>
<p>一个<strong>抽象问题</strong><span class="math">\(Q\)</span>是一个定义在<strong>问题实例集合</strong><span class="math">\(I\)</span>和<strong>问题解集合</strong><span class="math">\(S\)</span>上的一个二元关系。
比如,在最短路径问题中,问题实例就是一个图和两个点组成的三元组,而其对应的解就是一个顶点的序列。</p>
<p><strong>抽象问题</strong>通常分为两个类别:</p>
<ul>
<li>优化问题: 通常需要求得某个值的最大值或最小值</li>
<li>判定问题: 解为<span class="math">\(0\)</span>或<span class="math">\(1\)</span>的问题</li>
</ul>
<p>NP理论关注的只是其中的<strong>判定问题</strong>。
然而实际上,优化问题和判定问题是可以相互转化的。
比如求最短路径问题,很明显这是一个<strong>优化问题</strong>,但是我们可以将问题改写成一个<strong>判定问题</strong>.</p>
<ul>
<li>最短路径的优化问题版: 给定一个图<span class="math">\(G\)</span>及其上的两个顶点<span class="math">\(s,v\)</span>,请找出<span class="math">\(s\)</span>到<span class="math">\(v\)</span>的最短路径。</li>
<li>最短路径的判定问题版: 给定一个图<span class="math">\(G\)</span>,及其上的两个顶点<span class="math">\(s,v\)</span>和一个常数<span class="math">\(k\)</span>,请判定图<span class="math">\(G\)</span>是否存在一条从<span class="math">\(s\)</span>到<span class="math">\(v\)</span>且长度最多为<span class="math">\(k\)</span>路径。</li>
</ul>
<h1>编码</h1>
<p>我们都知道,计算机底层都是二进制的代码。
因此,为了使得计算机程序能够求解一个<strong>抽象问题</strong>,我们需要对<strong>抽象问题</strong>进行编码操作。
我们通常都是采用二进制来对抽象对象进行编码的。
抽象对象集合<span class="math">\(S\)</span>的编码是从<span class="math">\(S\)</span>到二进制串集合的一个映射<span class="math">\(e\)</span>。
举例来说,数字<span class="math">\(17\)</span>的编码就是<span class="math">\(e(17)=10001\)</span>.</p>
<p>其实从抽象概念和编码概念上来说,我们所使用的语言也是一种编码,而我们脑海中的东西才是真正的抽象概念。</p>
<p>我们将一个以二进制序列为集合的实例集合称为<strong>具体问题(Concrete Problem)</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
<h1>P和NP</h1>
<p>在上述的铺垫之后,我们现在可以定义什么才是真正的<span class="math">\(P\)</span>了。</p>
<ul>
<li><span class="math">\(P\)</span>: 在<strong>多项式时间可解决</strong>的<strong>具体判定问题</strong>的集合。</li>
<li><span class="math">\(NP\)</span>: 在<strong>多项式时间可验证</strong>的<strong>具体判定问题</strong>的集合。</li>
</ul>
<p><strong>可验证</strong>是指,在给定一个问题及其可能的一个解,我们能否判断这个解是否是当前问题的解。
从直觉上来说<strong>可验证</strong>要比<strong>可解决</strong>要容易得多,因此,我们可以认为<span class="math">\(P\subseteq NP\)</span>.
问题的关键在于,<span class="math">\(P\)</span>是不是<span class="math">\(NP\)</span>的一个真子集,这个问题困扰了CS理论界很多年了,但依然没有定论。
不过大多数人都认为<span class="math">\(P\neq NP\)</span>.</p>
<h1>规约</h1>
<p>此处的<strong>规约</strong>是指,存在一个多项式时间的算法<span class="math">\(f\)</span>能够将问题<span class="math">\(A\)</span>转化为问题<span class="math">\(B\)</span>,也即<span class="math">\(f\)</span>能够将任意一个实例<span class="math">\(I\in A\)</span>转化为<span class="math">\(f(I)\in B\)</span>,同时存在另外一个多项式时间的算法<span class="math">\(h\)</span>,将问题<span class="math">\(B\)</span>的解转化为问题<span class="math">\(A\)</span>的解,也即能够将<span class="math">\(f(I)\)</span>的解<span class="math">\(S\)</span>转化为<span class="math">\(I\)</span>的解<span class="math">\(h(S)\)</span>.
下图比较直观的说明这个过程。</p>
<p><img alt="图解规约" src="http://zhouyichu.com/images/reduction.png"/></p>
<p>规约在NP理论中是一个非常有用的工具,我们通常用<span class="math">\(A\longrightarrow B\)</span>表示<span class="math">\(A\)</span>能够规约为<span class="math">\(B\)</span>.
有时候也可以表示成<span class="math">\(A\le_p B\)</span>.
这形象地说明了问题<span class="math">\(A\)</span>的难度是「小于等于」问题<span class="math">\(B\)</span>的.</p>
<p>根据定义,我们知道,如果我们能够找到一个算法高效的解决问题<span class="math">\(B\)</span>,那么我们一定也能找到一个算法高效的解决<span class="math">\(A\)</span>.
但是,倒过来却并不成立,如果我们一个算法能高效解决<span class="math">\(A\)</span>,并不代表我们能找到一个算法高效的解决<span class="math">\(B\)</span>.</p>
<p>在<span class="math">\(A\longrightarrow B\)</span>中,问题的能难度随着箭头的方向而增加。
其实,<strong>规约</strong>最大的作用在于证明如果我们能知道解决<span class="math">\(A\)</span>是非常困难的,那么解决<span class="math">\(B\)</span>至少是同样困难的。
也就是说,面对一个新问题<span class="math">\(X\)</span>,如果我们能将某个已知的非常困难的问题<span class="math">\(A\)</span>规约到<span class="math">\(X\)</span>,那么我们就能证明<span class="math">\(X\)</span>至少是同样苦难的,因此不需要花费大量的时间去设计一个求取精确解的算法,我们可以转而寻找可行解。</p>
<p>至于如何<strong>规约</strong>,这已经超出我的需求,我觉得作为一个非专业研究NP问题的人来说,我并不需要知道如何进行规约(有些规约很简单,有些却很复杂)。
我只需要知道基本概念及其之间的关系,这已经满足的应用需求了。</p>
<h1>NP-Complete</h1>
<p>利用规约,我们能够给出NP-Complete的定义:</p>
<blockquote>
<p>NP-Complete: 如果所有的<span class="math">\(NP\)</span>问题都能规约到一个问题,那么这个问题就是NP-Complete.</p>
</blockquote>
<p>另外还有一种来源于「算法导论」的定义方式:</p>
<blockquote>
<p>一个问题<span class="math">\(Q\)</span>是NP-Complete,当它同时满足如下的条件:
1. <span class="math">\(Q\in NP\)</span>
2. 对于每一个<span class="math">\(Q^{'}\in NP\)</span>满足<span class="math">\(Q^{'}\le_p Q\)</span></p>
</blockquote>
<p>很显然,这两个定义其实表达的是同一件事。</p>
<p>根据这个定义,我们可以知道:</p>
<ol>
<li>NP-Complete既可以看成是一个问题,也可以看成是一个问题集合。
因为属于NP-Complete的问题必然是可以相互规约的,也即可以看成是同一个问题。</li>
<li>NP-Complete是<span class="math">\(NP\)</span>中最难的那一部分问题。</li>
</ol>
<p>另外,在Introductino to Algorithm的定义中,如果某个问题<span class="math">\(Q\)</span>只满足第二个条件,但不满足第一个条件,那么这个问题是<strong>NP-Hard</strong>的。
可以认为,<strong>NP-Hard</strong>是比<strong>NP-Complete</strong>还要难的问题的。</p>
<p>NP-Complete问题到目前为止还没人能找出其多项式时间内的解,如果我们在未来的某一天中能够找到一个NP-Complete问题多项式时间内的解,那么我们就能证明其实<span class="math">\(P=NP\)</span>.
因为NP-Complete代表的是<span class="math">\(NP\)</span>中最难的那部分问题,如果这部分问题能在多项式时间内解决,那么整个<span class="math">\(NP\)</span>就都能在多项式时间内解决,也即<span class="math">\(NP=P\)</span>.</p>
<p>下图比较清晰的说明了<span class="math">\(P\)</span>、<span class="math">\(NP\)</span>和NP-Complete的关系.</p>
<p><img alt="NP的空间(假设\(P\neq NP\))" src="http://zhouyichu.com/images/NP-space.png"/></p>
<p>下表列举了一些<strong>NP-Complete</strong>和<strong>P</strong>问题</p>
<table>
<thead>
<tr>
<th align="center"><strong>Hard Problems(NP-complete)</strong></th>
<th align="center"><strong>Easy Problems(P)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">3SAT</td>
<td align="center">2SAT, Horn SAT</td>
</tr>
<tr>
<td align="center">Longest Path</td>
<td align="center">Minimum Spanning Tree</td>
</tr>
<tr>
<td align="center">3D Matching</td>
<td align="center">Bipartite Matching</td>
</tr>
<tr>
<td align="center">Knapsack</td>
<td align="center">Unary Knapsack</td>
</tr>
<tr>
<td align="center">Independent Set</td>
<td align="center">Independent Set on Trees</td>
</tr>
<tr>
<td align="center">Integer Linear Programming</td>
<td align="center">Linear Programming</td>
</tr>
<tr>
<td align="center">Rudrata Path</td>
<td align="center">Euler Path</td>
</tr>
<tr>
<td align="center">Balanced Cut</td>
<td align="center">Minimum Cut</td>
</tr>
</tbody>
</table>
<h1>总结</h1>
<ul>
<li><span class="math">\(P\)</span>: 能够在多项式内解决的问题集合</li>
<li><span class="math">\(NP\)</span>: 不一定能够在多项式内解决,但是给定答案,能够在多项式时间内验证答案的问题集合</li>
<li><strong>NP-Complete</strong>: <span class="math">\(NP\)</span>中的最难的那一部分问题。</li>
<li><strong>NP-Hard</strong>: 比<strong>NP-Complete</strong>还要难的问题。</li>
</ul>
<p>一图胜千言,这几个概念可以用一张图来说明:</p>
<p><img alt="NP理论的总概念图" src="http://zhouyichu.com/images/NP-whole-picture.png"/></p>
<h1>参考资料</h1>
<ul>
<li>Algorithms (Dasgupta, Papadimitriou, Vazirani)</li>
<li>Introduction to Algorithms (Cormen, Leiserson, Rivest, Stein)</li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2016-10-8 完成初稿并发布。</li>
<li>2016-10-10 增加规约的<span class="math">\(\le_p\)</span>符号、算法导论的关于<strong>NP-Complete</strong>和<strong>NP-Hard</strong>的定义、画出NP问题的总概念图。</li>
<li>2016-10-11 修正几处输入错误。</li>
<li>2016-10-12 增加<strong>NP-Complete</strong>和<strong>P</strong>的问题举例列表。</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>有一本书就叫「具体数学」 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2016年9月书单2016-10-02T00:00:00-06:002016-10-02T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-10-02:/reading-list/Reading-List-2016-September/<p>2016年9月书单</p><h1>小狗钱钱</h1>
<p>作者: Bodo Schaefer</p>
<p>这是一本非常非常入门的理财类书籍,定位就是给小孩子看的童话故事,我一天就翻完了。</p>
<p>虽然是作为给儿童阅读的书籍,但是我依然从中学习到了一些东西。从这个角度来说,我对于理财知识来说是显得多么的缺乏。</p>
<p><img alt="小狗钱钱脑图" src="http://zhouyichu.com/images/dog-money.png"/></p>
<p>其他一部分的内容,所谓梦想相册、梦想储蓄罐等概念,我认为都是为孩子准备的,因为他们缺乏足够的自制力,需要具体的东西不断提醒他们。而作为一个成年人,我不认为这些东西对我会有什么用,虽然我自己也有另外一种形式的「梦想相册」。</p>
<h1>小狗钱钱2</h1>
<p>作者: Bodo Schaefer</p>
<p>这本书翻了几页直接就扔在一旁了,这就是一本教育小朋友良好道德水平的书,和我预期差太多,翻了几页就不想看了。</p>
<h1>财务自由之路</h1>
<p>作者: Bodo Schaefer</p>
<p>这还是一本理财入门的书籍,但是实际上并没有太多的新内容。</p>
<p>本书主要强调了储蓄的重要性,只有通过储蓄得到了最原始的资本,才可能进行有效的投资。
你的收入并不等于你的财富,很多高手人群手中其实并没有多少余钱,钱只是从他们左手进,然后从右手出。
这个观点和「穷爸爸,富爸爸」系列中的思想基本差不多。</p>
<p>除了论述储蓄的重要性之后,本书还提出了一些非常粗略的股票、基金选购原则。
在看书的过程中,真的很有一种冲动去买一些股票和基金,但是我依然还是忍住了。
对于我不了解的东西,还是先不要碰了,现在只是财富知识的积累阶段,好好学习才是正途。</p>
<p><img alt="财务自由之路脑图" src="http://zhouyichu.com/images/finance-free.png"/></p>
<h1>邻家的百万富翁</h1>
<p>作者: 托马斯·J. 斯坦利</p>
<p>这本书其实就是一本统计报告,是作者对美国大量的百万富翁尽兴调查研究之后的总结。</p>
<p>经过作者长期的观察和访谈,他总结了美国百万富翁的几个特点:</p>
<ol>
<li>节俭. 私以为,我们努力工作、努力理财,无非是想让生活质量提升,人生幸福感提升。因此一味靠节俭来积累财富,这就违背了理财的本意了。但是,想要有足够的资金进行资产投资,资本的积累也是一个必不可少的过程。</li>
<li>拥有明确的目标体系。这是任何一个成功的人都必备的素质,尤其当下的时代,信息越来越丰富,如何让自己不迷失在这样的信息海洋中,拥有完善的目标体系是关键。</li>
<li>做预算。这部分内容我还没有尝试做过,因为从来没有过固定收入的经历。不过这样的状态即将改变,学校的奖学金即将按月下放,到时可以尝试进行有规划的预算。</li>
<li>投资时要放长线钓大鱼。这个道理谁都懂,但是能做到的没几个。关键在于,没人知道,长线之后钓上来的是臭靴子还是大鱼。</li>
<li>自己做投资决策。一切都要掌握在自己的手里,虽然要付出很大的精力,但是毕竟是自己的资金,自己要对自己负责。</li>
</ol>
<p><img alt="邻家的百万富翁脑图" src="http://zhouyichu.com/images/millionaire.png"/></p>
<h1>就这样理财,就这样生活</h1>
<p>作者: 汪标</p>
<p>严格来说我并不认为这是一本书,这只是一些读者来信的综合本而已。其实本并没有什么干货,就是一些有关理财的问答纪录。</p>
<p>看过就看过了,绝不会再翻第二遍。</p>
<h1>中国缺什么,日本缺什么</h1>
<p>作者: 近藤大介</p>
<p>本书的作者在北京生活了好几年,他结合自己生活经历,对比了日本和中国两个国家的文化差异。
在做着看来,两个国家存在巨大的文化差异,甚至是属于两个文化圈的范畴。</p>
<p>在他的总结中,中国缺少:</p>
<ul>
<li>优质的服务: 中国人至今还有很多人不愿意付钱,甚至包括我。在我刚来美国的时候,我一直很讨厌给小费的习惯,把这些服务费算进用餐费里不就好了吗?为什么顾客还要单独给小费呢?后来在朋友讨论时才想到,小费这样的习俗其实是对服务员服务质量的一种考核,并且这种考核结果是交到了顾客的手里。服务员为了获得更多的小费,必然是提供更好的服务,有点利益驱动的感觉。</li>
<li>协调一致的团结精神: 中国擅长内斗,这是大家公认的事情。中国历史两千多年来的斗争,就是不停地内斗。</li>
<li>细腻的技术: 中国的技术已经接近世界最高水平的90%了,但是就是这剩下的10%是最难的。</li>
</ul>
<p>日本缺少:</p>
<ul>
<li>责任感: 日本职业终身制,很多人不愿意承担责任,只求安安稳稳,一步一步升迁。开会就是推卸责任的过程。</li>
<li>年轻人的力量: 日本的老龄化非常严重,很多老人不愿意退休,一直占着工作职位,年轻人没有出头之日,失去了原有的朝气。</li>
<li>广阔的视野: 岛国人民固有的思维习惯,形成了封闭的思维模式。</li>
</ul>
<p>作者的总结有一定的道理,但也不一定都是对的。比如他认为日本人缺少责任感,但是在我看来,中国人也并没有多很多的责任感。一切都是对上负责,而不对下也不对自己负责。</p>
<p><img alt="What is missing in China" src="http://zhouyichu.com/images/What's-missing-in-China.png"/></p>
<h1>毅力:如何培养自律的习惯</h1>
<p>作者: 吉姆·兰德尔</p>
<p>这是在亚马逊上unlimited的免费书,很短,随手一翻就看完了。
关于培养自律能力,书中总结了几个步骤:</p>
<ol>
<li>识别危机点并将其最小化: 找到那些最考验自己自律能力的时刻。</li>
<li>创建针对危机点的心理反应预设机制: 形成面对诱惑自己本能的反应机制。</li>
<li>创造一个强有力的咒语: 心中牢记一句非常有激励意义的话。
目前对我来说,我记录了有两句话: <ol>
<li>在逆境中坚持计划才能区别普通人和精英。</li>
<li>往往只有最后几组才能将训练效果达到最大。</li>
</ol>
</li>
<li>准备一个固定锚: 当意志力减弱,离开原有轨道的时候,要学会把自己拉回到原来的轨道上。</li>
</ol>
<p><img alt="Self-Discipline" src="http://zhouyichu.com/images/self-discipline.png"/></p>
<h1>虚无的十字架</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>东野圭吾是我比较喜欢的一个作家,尽管不是每一部都非常优秀,但是却市场引人深思。</p>
<p>在「虚无的十字架」中,作者关注的是对杀人凶手的惩罚方式,死刑到底有没有意义?</p>
<blockquote>
<p>要求杀人凶手自我惩戒,根本就是虚无的十字架,即使是这种虚无的十字架,也必须让凶手在监狱中背负着</p>
</blockquote>
<p>其实小说并没有最终说明什么才是正确答案,也许也永远不会有答案。</p>
<p>硬要明确一个答案的话,我认为只有凶手本身真正悔过了,良心的谴责才是真正的十字架。
所谓的有期徒刑、无期徒刑、死刑,对于一个毫无悔罪思想的人来说,毫无意义。
他自己并没有背负十字架,所有的刑罚只是我们的社会强行安在罪犯身上的。</p>
<p>但是,其实除了自己以外,没人能真正确定罪犯是否真的悔过了。
因此,刑罚才具有意义。
只有人为添加的十字架,才能让周围的人感到心安。</p>
<p>总体来说,这部小说还是很不错的。
但是和东野其它的代表作比起来,感觉还是差了一些。
同样是关注社会犯罪问题,我认为「信」写得更加深入人心。</p>
<h1>白夜行</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>终于看完了传说中的「白夜行」,典型的理工科写作方式,并没有太多细腻的内心描写。</p>
<p>虽然主角是桐原亮司和西本雪穗,但是对于他们却几乎没有直接描写,整个故事都是通过他们两个周围的人角度来展开的。
故事其实并不复杂,单纯作为一个探案故事来说,确实写的不错。</p>
<p>有人说,故事的主旨其实是爱情,是桐原亮司和西本雪穗之间的爱情,我只能部分接受这样的观点。
其实,就整个故事来说,仅仅就是一些列的探案故事,我并没有感受到作者太多深入的思考。
作者只是勾画了一个复杂的、曲折的故事。</p>
<p>与其相比,「虚无的十字架」和「信」的写作更加成熟,更加深入人心。
对犯罪这一社会问题进行了更假深入的思考。</p>
<p>我认为「白夜行」只是一部构思精巧、制作精美的的工艺品,而「信」则是一件外表朴素、但具有深厚内涵的艺术品。</p>
<h1>更新日志</h1>
<ul>
<li>2016年9月13日 添加「小狗钱钱1」</li>
<li>2016年9月17日 添加「小狗钱钱2」和「财务自由之路」</li>
<li>2016年9月23日 添加「邻家的百万富翁」</li>
<li>2016年9月26日 添加「就这样理财,就这样生活」</li>
<li>2016年9月26日 添加「中国缺什么,日本缺什么」</li>
<li>2016年9月28日 添加「毅力:如何培养自律的习惯」</li>
<li>2016年9月28日 添加「虚无的十字架」</li>
<li>2016年10月2日 添加「白夜行」</li>
</ul>First-Month-In-USA2016-09-18T21:43:56-06:002016-09-18T21:43:56-06:00Flyawaytag:zhouyichu.com,2016-09-18:/words/First-Month-In-USA/<p>已经记不得上一次写博客是什么时候了,应该也是好几个月前了吧。这几个月,我的生活发生了重大变化——离开了土生土长的亚洲大陆,来到了美丽而又陌生的美洲大陆。为了实现自己的目标,我终于踏上了另一块大陆。我知道,这对很多人来说,其实是一件小事,每年来往于两个大陆的人不计其数。但是,对于我来说,这确实是一个重大的改变。新的生活,新的环境,新的朋友。</p><p>已经记不得上一次写博客是什么时候了,应该也是好几个月前了吧。
这几个月,我的生活发生了重大变化——离开了土生土长的亚洲大陆,来到了美丽而又陌生的美洲大陆。
为了实现自己的目标,我终于踏上了另一块大陆。
我知道,这对很多人来说,其实是一件小事,每年来往于两个大陆的人不计其数。
但是,对于我来说,这确实是一个重大的改变。
新的生活,新的环境,新的朋友。</p>
<p>整体来说,美国的印象和预想的差不多,我也不想再去记录一些别人都已经反复说了无数遍的事情。
只是有几件小事,我觉得有必要记录下,以此对比一下国内外的情况。</p>
<h1>行政手续</h1>
<p>由于我是新生,到学校的第一件事必然是去办各种入学手续。
有关奖学金方面的事情是由两位秘书(Maya和Chethika)负责的,一位负责phd,一位负责master。
当然我去的时候,我并不知道谁是负责什么的。
于是我直接找到了Maya,但是她却是负责master的,她告诉我我必须去找Chethika,然后亲自带我去Chethika的办公桌。
然后......然后就没有然后,故事就到此结束了。</p>
<p>而让我真正有感触的是,国内发生的令外一件事。
我记得当时还是小学二年级,当时我也是需要搞什么事情,去办公室找老师。
然而第一次也没有找对人,我找的那位老师就说了句:"这个事情要找XXX",然后再也没鸟过我。
当时我真是一团乱麻,尼玛我才是一个二年级的小孩,我哪知道谁是谁......</p>
<p>虽然小时候的这件事已经过去那么多年了,但我依然印象深刻。
我无法理解的是,为什么其他人总是要默认我们谁都认识,什么都知道呢?
对比上述在美国发生的这件小事,真心觉得在日常交往中,美国人确实要比国内具有更多的人文关怀。</p>
<p>在此我并不是一定说美国人一定比国内要好,比如那个Chethika就是智商很一般的人,据我所知已经有两个因为她的失误而没有领到第一个月奖学金的人了,其中一个就是我……
这里我想说明的不是办事能力的问题,而仅仅是一个人文关怀的问题。
这里的整体环境让人感到很舒服,尽管很难真正融入白人社会,但是他们所表现出来的待人接物的方式,确实比国内某些办事员要好太多了。</p>
<h1>交通</h1>
<p>众所周知美国是个汽车大国,走在路上很少见到行人,大马路上总是嗖嗖的车子飞驰.
作为一个什么都没有的穷学生,刚来的那几天只能靠自己的两条腿走来走去,每当我要过没有红绿灯时的路口时,所有的车辆都会自动停下来等我先过。
包括我后来骑车之后,汽车总是会主动停车让我先过。
这也是我在国内绝不会有的体验之一。</p>
<h1>拾金不昧</h1>
<p>在美国的第一个月,我还体验了一次美国人拾金不昧的精神。
有一次坐公交回家后发现钱包丢了,当时急的团团转,一路走回公交站台都没有找到钱包。
当时就想,这下完了,各种补办手续要烦死了。
然而几分钟后就收到了一封邮件,一个美国人捡到了我的钱包,从中发现了我的学生卡,于是按照学号给我发了邮件,让我过去拿钱包。
当时真有一种天无绝人之路的感觉,立马第一时间冲了过去。
拿到钱包之后,老美也没有接受我的任何回馈。
这又是一件让我对美国留下好印象的事情。
如果是在国内丢了钱包,你就别想再找回来了……</p>
<h1>总结</h1>
<p>尽管美国也有很多让人不如意的地方,比如行政效率低下、凡事都要预约等等,但是撇开这些具体事务性的东西不谈,当地人所表现出来的宽容、善解人意确实要比国内好太多了。
这和智商无关、和经济条件无关,仅仅是一种国民的修养。
仅从这个角度,美国确实要优于中国。</p>
<p><img alt="校园一角" src="http://zhouyichu.com/images/Utah-University.jpg"/></p>
<h1>更新日志</h1>
<p>2016年9月18日 发布第一版</p>2016年6月书单2016-08-22T00:00:00-06:002016-08-22T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-08-22:/reading-list/Reading-List-2016-June/<p>2016年5月书单</p><h1>神们自己</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>小说开篇的那句话让我印象非常深刻:</p>
<blockquote>
<p>愿与愚昧的战争终将有胜利的一天。</p>
</blockquote>
<p>整部小说也充分反映了这个主题。</p>
<p>全书分为三个部分,第一部分描述了人类收到来自于平行宇宙的物质,建立了「电子通道」,从而获得了清洁的无限能源。
而有一位科学家拉蒙特发现了这种获取能源方式的弊端,最终将会导致我们所在宇宙的崩塌。
而发现这种能量来源的科学家拒绝接受的这个事实,因为这会损害他的名誉。
而其他握有实权的人也拒绝相信拉蒙特的理论,因为他们也害怕失去自己手中的权势。
面对如此重要且明显的问题,这些当权者为了一己私欲而选择视而不见,这就是Isaac所说的「愚昧」,而人类与愚昧的战争将会永远继续。
想想面对所谓的环境保护、核弹危害、种族歧视,那些当权者是如何选择的?</p>
<p>第二部分描述了平行世界中的外星生命,这些外星生命分为幼年状态和成年状态,幼年状态时由三个性别组成一个家庭: 理者、情者和抚育者。
当这三个个人组成家庭并诞生新的后代之后,这三者就会相互融合形成一个成年个体——长老。
第二部分的故事描述了外星世界由于太阳枯竭而急需新的能源,于是长老们发明了「电子通道」,从平行宇宙中获取能源。
但是,有一个不一般的情者发现「电子通道」终将毁灭平行世界,情者面对另一个文明的毁灭和自己种族的生存,产生了激烈的内心斗争,她最终选择破坏「电子通道」,拯救平行世界中的人类。
然而她的反抗是徒劳的,当她最终和理者、抚育者合体之后,她的这种悲天悯人完全被理智和本能所击败。
我觉得这三种不同的性别就象征着人类自己,理智、情感和本能。
情感也许多变、也许高尚、也许强大,但最终依然抵不过理智和本能。
而有时候,最理智的选择也是最黑暗的选择。
就像「三体」中所描述的黑暗森领法则一样,在生存面前,无所谓善良与邪恶,只有赤裸裸的生成本能。</p>
<p>接着是第三部分,人类在月球上终于找到了「电子通道」危机的解决策略,男女主人公也相爱相守在一起了。
这一部分写得太过理想化了,也许这也是寄托了Isaac美好的愿望,正如他开篇所说:</p>
<p><strong>愿与愚昧的战争终将有胜利的一天。</strong></p>
<p>最后摘录几句小说的经典句子:</p>
<blockquote>
<p>有人认为,公众希望环境得到保护,人类存续得以实现,还认为那些为了这类崇高目标而奋斗的理想主义者会得到公众的爱戴,实际上,公众所期望的只有一件事——他们自己过上安逸的生活。</p>
<p>当人们知道吸烟会导致患癌症几率上升而最有效的解决办法就是禁烟使,他们却希望能够发明一种不致癌的香烟。当人们知道内燃机会对大气造成污染而最好的办法就是不再使用这类引擎时,他们却希望能够发明不污染空气的引擎。</p>
<p>面对愚昧,神们自己也缄口不言。</p>
<p>他们只要拒绝相信就行。面对难题,最容易的对策就是拒绝相信它的存在。</p>
<p>凡是对自己有一点利益就会选择相信,有时候即使毫无可能,人们也会冥顽不化。</p>
</blockquote>
<h1>中国文脉</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BD%99%E7%A7%8B%E9%9B%A8">余秋雨</a></p>
<p>时隔多年再次阅读余秋雨的文字,失去了原有的喜爱。
高中时代读过他的「千年一叹」、「行者无疆」和「山居笔记」,那时候真心觉得文章写得好,对文化的分析很透彻。
但现如今再次阅读他的文字,虽然仍然不乏有一些真知灼见,但是总体而言让我觉得缺少了应有的深度,流于表面了。</p>
<h1>参考资料</h1>
<h1>更新日志</h1>
<p>2016年6月11日总结前两本书的读书笔记</p>2016年5月书单2016-06-06T00:00:00-06:002016-06-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-06-06:/reading-list/Reading-List-2016-May/<p>2016年5月书单</p><h1>把时间当作朋友</h1>
<p>作者: <a href="http://baike.baidu.com/view/664966.htm">李笑来</a></p>
<p>这又是一本鸡汤书,我也不知道自己是如何看完的。
这些年来,应该已经对鸡汤文免疫了才对……
不过,时常看看鸡汤应该也不是坏事吧。</p>
<p>书中阐述了很多观点,但是整体逻辑性不强,每一篇都相对独立,而且其中的一些例子比较生硬,不太有说服力。
不过,作者想要说明的还是有一些启发的。</p>
<ol>
<li>
<p>学习上的成功只靠两点: <strong>策略</strong>和<strong>坚持</strong>。
我认为这两点是在两个维度上的考量,而不是像作者所说的那样:“坚持比策略重要”。
当前是个日新月异的世界,你的学习速度越快,学习策略越高明,加上坚持带来的复利效应,越是能走得更远。
蜗牛要花上十年的时间爬到塔顶,而雄鹰几分钟内就飞到塔顶。
尽管都达到了目标,但是时间成本是完全不同的。
而时间,才是每一个人最珍贵的资源!</p>
</li>
<li>
<p>做计划真的是一个需要学习的事情。
从我切身经验来看,这一观点真是切中要害啊!
要真正做出一个能让自己的发挥最大效能的计划其实是非常非常困难的,我们要么低估自己,要么高估自己。
我看到过很多人(包括我自己),在年初、月初制定了满满的计划表,结果到年底、月底的时候,基本没有全部完成的。
这是执行力不够吗?
表面上的原因是执行力不够,但实际上你的计划没做好,如果你真正的了解自己秉性,就应该制定在自己能力范围以内,且不会让自己太有压力的计划。
而不是为了赶目标而制定的计划。
正如苏格拉底说,我们每个人最需要做的是:"Know yourself !"</p>
</li>
<li>
<p>打造人卖不如打造自己。
很喜欢这个提法,不喜欢专营取巧,只要安于本心做好自己。
不需要遗世独立,也不需要阴影狗狗,只要尊崇本心,就像孔老夫子所说:“修文德以来人”</p>
</li>
<li>
<p>寻找不需要比较就能带来幸福的事物。
世上很多烦恼其实都来自于与他人的比较,但是不管你处于什么地位、拥有多少财富,永远会有在你上位的人。
基于比较的幸福感注定是短暂的,注定会让人进入不断攀比的死循环。
因此,作者主张我们应该跳出这个循环,用心去发现那些不需要比较就能得到的幸福感。
话虽不错,但我认为我们还是无法也不应该放弃比较。
只有和他人的比较才能显出我们的不足,才能激励我们不断往前走。
也许经历世事沧桑之后,我们终会发现和别人的比较只是黄粱一梦,该放下的终将放下;然而,此时此刻,只用通过和他人的比较我们才能知道自己处于什么样的位置,只有我们现在拿起了,日后我们才能放下!</p>
</li>
</ol>
<p>书中还提到一个表格:</p>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">自己知道的</th>
<th align="center">自己不知道的</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">别人知道的</td>
<td align="center">1</td>
<td align="center">2</td>
</tr>
<tr>
<td align="center">别人不知道的</td>
<td align="center">3</td>
<td align="center">4</td>
</tr>
</tbody>
</table>
<p>这个表格很能说明问题,1中的内容是我们的基本状态,2中的内容是我们需要接受批评并改正的,3中的内容是属于自己的小秘密,而4中的则是我们需要自己发掘的自身潜力。
我想所谓学习或成长,应该是把4中的内容转移到1中的过程吧。</p>
<hr/>
<h1>拿破仑传</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Emil_Ludwig">Emil Ludwig</a></p>
<p>以前从来就没有真正了解过拿破仑的历史,这本传记从某种程度弥补了这一空白。</p>
<p>不过此本传记写得并不好,感觉很多史料都是东拼西凑的,尤其是各种引用拿破仑写的信、说过的话,完全没有上下文,仅仅是引用。。。</p>
<hr/>
<h1>虚像小丑</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这本小册子是东野圭吾的短篇小说集,说实话,其实写得很一般,感觉失去了东野圭吾原来的水平。
和「嫌疑人X的献身」、「信」等创作相比,感觉就像是练手之作,而没有进行精心的雕琢。</p>
<hr/>
<h1>十一字杀人案</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这是东野圭吾早期的作品,虽然比不上他的巅峰之作,但是这部小说还算可读。</p>
<p>可惜的是结尾处略显慌乱,“我”对于山森的质问似乎毫无根据,这一设置感觉有些多余。</p>
<p>不过,从这个作品中就可以看到,东野圭吾很早之前就开始考虑道德、犯罪、名誉之间的关系。
正是因为这么多年的思考与酝酿,他最终才能写出「信」这样的佳作。</p>
<hr/>
<h1>清明上河图密码1</h1>
<p>作者: 冶文彪</p>
<p>这是一部非常精彩的历史推理小说,时代背景是北宋的巅峰时期,围绕一些市井小人物的案件,逐渐引出一个巨大谜团。
这部作品的一大特点是,任何一个人物出场时,你都以为TA只是个路人甲,但也许TA就是这个案件的关键人物。
每一个出场的人物都其背景,都有其令人叹惋的无奈。
从卖饼的小哥到宰相的孙子,每一个人都有其自己的烦恼,每一个人都有其忧愁,接着一个一个案件,向我们展示了北宋时期整体的社会面貌。</p>
<p>这部作品还有一个和大多数推理小说不一样的是,作者的重心是放在案件所涉及的各色人物身上,而不是办案人物本身。
也就是说,这部作品中并没有像福尔摩斯那样智商爆表的神探,而仅仅是一些市井的小人物,以及他们的日常。
这正是这部作品接地气的地方,才让我真正进入了那个时代,进入了北宋的繁华。</p>
<hr/>
<h1>疾风回旋曲</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>真不敢相信这是东野圭吾的作品,平铺直叙没有转折,没有伏笔,什么都没有……</p>
<p>搜索了一下,发现这是东野圭吾2013年的作品,难道这是大师灵感枯竭的前兆?</p>
<hr/>
<h1>当卢浮宫遇见紫禁城</h1>
<p>作者: 周兵, 徐欢</p>
<p>央视曾拍过一部同名的纪录片,这本小册子是纪录片的整理文档。
整本书对比了东西方文化的差异,分析了一些具体的艺术作品,作为一个入门级的读者来说,这本书还是不错的。</p>
<p>一个让我印象最深刻的对比是,中国最古老的文字是出现在甲壳上甲骨文,是用来祭祀的;而西方文化中最古老的文字是用来记账的。
这就体现了东西方文化从最初的差异: 西方文化讲求实际,实用主义至上;中国讲求灵性,追求天人合一。
从后来的中西方绘画技术也能看出这些差别,水墨画重意境轻细节,油画重技法轻感染。</p>
<hr/>
<h1>自私的基因</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Richard_Dawkins">Clinton Richard Dawkins</a></p>
<p>这本书提出一个很有意思的观点: 地球上的一切生活其实仅仅是一个生存容器,真正永远延续的是基因,我们只是基因的傀儡而已。
而「物竞天择,适者生存」的对象也不是单个个体,更不是一个物种,而是最小的单位: 基因。</p>
<p>基因为了不断延续下去,继而创造出了具体的各种形态的生物,每一种生物都具有求生和繁衍的本能,而基因隐藏在生物体内,利用生物活动来保护自己。
这种想法一开始你会觉得很有趣,但是仔细想想,还是很恐怖的!
假设,我们真的是基因生存的容器,那么,这就引出了一个问题,我们为什么会有思想?
最近人工智能领域发展迅速,人们为了能够创造出能够自己「思考」的机器而不懈努力。
如果,基因寄生理论成立,那对于基因来说,我们岂不是就已经是会「思考」的机器了?
而且这机器还以为自己是处于主宰地位的,其实真正躲在幕后操纵一切的是基因。</p>
<p>尽管这本书反应的主题很有意思,也很具有深入思考的价值,但是文章写得真是不怎么样。
似乎就是很多学术论文集结成的一本书,其中的句子又臭又长,实在不具有可读性。</p>
<hr/>
<h1>马伯庸笑翻中国简史</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%BC%AF%E5%BA%B8">马伯庸</a></p>
<p>之前真是没想到马伯庸还会写一些文化方面的主题,不得不佩服马亲王的知识面。
王朝德性这玩意向来不是什么主流的东西,马亲王能从犄角旮旯里研究出这些历史过程,真心不容易。
作为一本扩展知识面的小册子,本书还是写的很不错的。</p>
<hr/>
<h1>超新星纪元</h1>
<p>作者:<a href="https://zh.wikipedia.org/wiki/%E5%88%98%E6%85%88%E6%AC%A3">刘慈欣</a></p>
<p>这基本不算是什么科幻小说,仅仅是一个嵌套在虚构框架下的童话故事。
这是刘慈欣的早期作品之一,很显然还略显粗糙。
不过,从这部小说中,我也还能看到一些<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E4%BD%93_(%E5%B0%8F%E8%AF%B4)">三体</a>的影子,比如不同时代的演化过程,看来大刘是非常喜欢对这种架空历史的想象。
我想,这很有可能是受到<a href="https://zh.wikipedia.org/wiki/%E5%9F%BA%E5%9C%B0%E7%B3%BB%E5%88%97">基地系列</a>的影响吧。</p>
<hr/>
<h1>球状闪电</h1>
<p>作者:<a href="https://zh.wikipedia.org/wiki/%E5%88%98%E6%85%88%E6%AC%A3">刘慈欣</a></p>
<p>这应该可以算是<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E4%BD%93_(%E5%B0%8F%E8%AF%B4)">三体</a>系列的外传吧,整部小说整体要比「超新星纪元」有了很大的提升,拥有了更多硬科幻的内容。
大刘果然是理工科出身的,感觉他对武器有着不一般的痴迷,文中描写了很多想象中的尖端武器,看起来很有意思。
在这部作品中,也能看到一些<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E4%BD%93_(%E5%B0%8F%E8%AF%B4)">三体</a>的影子,比如文中多次强调的,人生需要有一样东西让你为之着迷,这样的人生才是圆满的。
这种着迷的感觉,和<a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E4%BD%93_(%E5%B0%8F%E8%AF%B4)">三体</a>中提出的「空」的概念很相似。</p>
<p>「超新星纪元」和「球状闪电」都称不上是经典的作品,但是从它们身上可以看到大刘科幻世界官的逐步形成过程,这也是一件很有意思的事情。</p>
<hr/>
<h1>参考资料</h1>
<ul>
<li><a href="https://zh.wikipedia.org/wiki/%E5%8D%81%E4%B8%80%E5%AD%97%E6%AE%BA%E4%BA%BA">Wiki:十一字杀人案</a></li>
</ul>
<h1>更新日志</h1>
<ul>
<li>2016年5月15日总结前四本书的读书笔记</li>
<li>2016年5月22日增加三本书的读书笔记</li>
<li>2016年6月5日增加最后四本书的读书笔记</li>
<li>2016年6月5日发布</li>
</ul>2016年4月书单2016-05-08T00:00:00-06:002016-05-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-05-08:/reading-list/Reading-List-2016-April/<p>2016年4月书单</p><h1>银河帝国10: 裸阳</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a></p>
<p>在这部小说里作者设想了一个和「 <a href="https://zh.wikipedia.org/wiki/%E9%8B%BC%E7%A9%B4">钢穴</a> 」完全不同的未来世界,在这个世界里,人类的生活生产完全依赖于机器人,整个星球限制人口增长,每个人都能获得一大片领地,拥有上万个机器人为其工作。每个人都能够自给自足,完全不需要和其他人产生任何交互。</p>
<p>然而,如此的代价就是人类舍弃了最根本的东西: 群居。人们不再有任何肢体接触,完全靠三维显像和其他人交互。</p>
<p>当然,我也不认为这就是人类的未来,但是当钱互联网的大背景下,确实存在着大量的宅男现象,沉迷于网络,吃在网络,玩在网络,甚至工作在网络。如果把这种趋势无限扩大,那就会变成「<a href="https://zh.wikipedia.org/zh/%E8%A3%B8%E9%99%BD">裸阳</a>」中描述的情况了。</p>
<p>不可思议的是,作者是在1957年就写出了「<a href="https://zh.wikipedia.org/zh/%E8%A3%B8%E9%99%BD">裸阳</a>」,大师的想象力果然非凡啊!</p>
<hr/>
<h1>囚徒健身2</h1>
<p>作者: 保罗·威德</p>
<p>囚徒2主要分成了三部分的内容,分别是:</p>
<ol>
<li>专门部位</li>
<li>关节训练</li>
<li>生活方式的建议</li>
</ol>
<p>但是,对于我来说,除了关节训练的内容确实对我有启发作用,其他两部分的内容并没有太多的新颖之处。</p>
<p>在关节训练中主要学习到了三个健身方针:</p>
<ol>
<li>前链: 解决脊柱。动作:桥。</li>
<li>后链: 解决盆骨。动作:直角式。</li>
<li>侧链: 解决上肢。动作:扭转式。</li>
</ol>
<p>这3个动作和「囚徒健身」中的六艺一样,是不断慢慢升级的,这些动作就是为了解决身体柔韧性。</p>
<p>不得不说,保罗果然没怎么受过系统训练的人,写出来的书,虽然确实有干活,但是废话也不少,整个行文欠缺逻辑,看他的书其实还是挺痛苦的……</p>
<hr/>
<h1>银河帝国11: 曙光中的机器人</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a></p>
<p>这是一部长篇小说,整个故事其实比较简单,基本的世界设定和<a href="https://zh.wikipedia.org/zh/%E8%A3%B8%E9%99%BD">裸阳</a>中的差不多,人类的生活完全依赖于机器人的协助。</p>
<p>老实说,看完<a href="https://zh.wikipedia.org/zh/%E8%A3%B8%E9%99%BD">裸阳</a>就不会觉得这部小说有多惊艳了,其实我觉得这两部小说很相似,因此「曙光中的机器人」并没有太多惊喜。</p>
<p>虽然剧情和设定上没有惊艳,但是写作手法上感觉很舒服,整个读下来就像是一棵枝繁叶茂的大树,让我心情愉悦。科幻思想、描写手法都处理得非常好,真不愧是经典之作。</p>
<p><a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a>的小说就像是古典小说和现代小说的桥接器一样,古典小说中的拖沓冗余的景色描写和缓慢的剧情推进在<a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a>的笔下得到了很大的改善,剧情推进速度合理,细节到位;而现代小说则是进一步的约减,几乎没什么细节处理,总是拼命地往前推剧情,抛出一个又一个悬疑不断吸引读者,这显然又走向了另外一个极端。</p>
<p>看<a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a>的小说,确实是一种享受!</p>
<hr/>
<h1>囚徒增肌</h1>
<p>作者: 保罗·威德</p>
<p>这又是一本囚徒系列的书,从本书的名字就可以知道,本书关注的增肌。
虽然保罗的写作能力确实不敢恭维, 但是其中内容还是很值得学习的。
在书中,保罗说明了两种的不同的阻力训练:</p>
<ol>
<li>神经系统训练(力量训练)</li>
<li>肌肉系统训练(肌肉训练)</li>
</ol>
<p>囚徒1-2关注的是神经系统的训练,而这本「囚徒增肌」则关注的是肌肉系统训练。</p>
<p>下图说明了两者的区别:</p>
<p><img alt="Differnrece" src="http://zhouyichu.com/images/different_training.png"/></p>
<p>书中还列举了很多锻炼原则,但是其中也有很多重复的地方,这里只摘录书中最早提出的十点建议:</p>
<ol>
<li>高次数,高强度</li>
<li>艰苦训练: 坚持坚持再坚持</li>
<li>做简单和复合型的动作(囚徒1中的六艺)</li>
<li>高次数,低组数</li>
<li>写训练日志</li>
<li>休息</li>
<li>适当可以吃点垃圾食品</li>
<li>多睡</li>
<li>锻炼意志</li>
<li>力量训练和肌肉训练相互轮询</li>
</ol>
<p>{% blockquote 保罗, 囚徒增肌 %}
完美的健美者应该尽量少花时间进行训练,这样他们能够有更多的时间来生长肌肉;而完美的力量训练者应该尽量多花时间进行训练,这样他们的神经系统可以得到最强的配置。
{% endblockquote %}</p>
<hr/>
<h1>时间的朋友2015</h1>
<p>作者: <a href="http://baike.baidu.com/subview/2908128/15895528.htm">罗振宇</a></p>
<p>这本小册子其实是罗胖子在2016元旦时的演讲稿,我看过那场演讲,也看过这个小册子,感觉确实有些收获的。</p>
<h2>点与线</h2>
<p>其中谈到了几个有趣的概念: 点和线。</p>
<p>基础设施是一代一代往上叠加的,而当新一代基础设施出现的时候,往往先是出现一个一个的点,然后有人发现了这些点,自然有人就会去做线,把这些孤立的点给连接起来,形成新一代的基础设施。</p>
<p>有人通过做线形成了自己的帝国,有人通过做点默默盈利,两种方式都是可行,重点在于当我们站在这个时间节点,我们需要做出判断,我适合做点还是适合做线?</p>
<hr/>
<h1>银河帝国12: 机器人与帝国</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a></p>
<p>花了1个月的时间,终于把整个银河帝国8-12五本系列小说给看完了,小说结尾也和基地系列完美衔接,将多部小说归纳到了同一个世界体系中。</p>
<p>想象着丹尼尔这个守护了人类2万年的机器人,有一种非理性的感动,一个被人类制造出来当作奴隶的机器人,最终为了全体人类的利益,默默守护了人类2万年。他究竟是奴仆,是伙伴还是守护者?</p>
<p>整部小说也讨论不少社会问题,作者想象出了很多极端社会形态:</p>
<ol>
<li>长寿的太空族建立了安逸的社会,而这些社会是以机器人为基础的,每个人太空族长达3、4百年的寿命,让他们缺乏了探索未知的欲望,仅仅满足当下富足的生活。就像是清朝末年,在极大的物质财富下,大清朝从上到下都处于一片糜烂的氛围,没人想到要继续向外拓展,也没有人想到当下的社会基础是否稳固。所以,这样不思进取的社会必将消亡。</li>
<li>短寿的地球人,由于人口爆炸,人类只能寄居在超大型的室内城市,称为钢穴。这样称谓非常形象,爆炸式的人口就像一个一个蚂蚁一般住在金属制成的洞穴中。</li>
<li>积极进取的太空殖民者。这是一群富有探索精神的人类,不满足于寄居在所谓的钢穴之中,不断向外探索,发现新的世界,开拓新的世界。</li>
</ol>
<hr/>
<h1>当人类群星闪耀时</h1>
<p>作者: <a href="https://en.wikipedia.org/wiki/Stefan_Zweig">Stefan Zweig</a></p>
<p>不知道该把这本小册子归类为历史还是该归类为小说,作者抓住了几个人类历史发展的几个瞬间,对此展开了充分的想象。从这个点切入,充分体现了Zweig的特点,对细节精雕细琢,让人觉得就像是在欣赏一个精美的艺术品。
之前在阅读他的「一个陌生女人的来信」的时候,也有这种感觉,驾驭文字的能力确实令人惊叹。</p>
<p>在这部作品中,最吸引我的是「亨德尔的复活」,这个小故事写得非常细腻,让人看得热血沸腾,尽管它一点都不热血也不沸腾。
但却将一个不服输的老人,一个人对创作充满热情的作曲家的不屈不挠表现得淋漓尽致。</p>微观经济学读书笔记-22016-04-24T00:00:00-06:002016-04-24T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-04-24:/economics/microeconomics-2/<p>微观经济学学习笔记2-向经济学家一样思考。</p><h1>经济学的研究方法</h1>
<p>经济学分为两类:</p>
<ol>
<li>微观经济学: 研究家庭和企业如何做出决策,以及它们如何在特定市场上相互交易。</li>
<li>宏观经济学: 研究整体经济现象。</li>
</ol>
<h2>用科学的方式研究经济学</h2>
<ol>
<li>提出理论</li>
<li>搜集数据</li>
<li>分析数据</li>
<li>证明或反证理论</li>
</ol>
<h1>经济模型</h1>
<p>分析研究任何一个自然或社会现象,我们都需要建立合理的数学模型来对这个现象进行分析,而建模的过程又不可避免的要做出一些假设,只有通过这些假设,将复杂的世界进行简化,我们才能做出合理的分析。</p>
<p>但是,我们需要知道不是所有的假设都是成立的,很多时候我们只是为了便于分析,才进行有选择性的简化。</p>
<h2>循环流量图</h2>
<p>一个说明货币如何通过市场在家庭与企业之间流动的直观经济模型。</p>
<p><img alt="Flow" src="http://zhouyichu.com/images/circular-flow-diagram.png"/></p>
<h2>生产可能性边界</h2>
<p>该模型表明在可得到的生产要素和生产技术既定时,一个经济所能生产的产品的数量的各种组合的图形.</p>
<p><img alt="Frontier" src="http://zhouyichu.com/images/production-possibility-frontier.jpg"/></p>
<ul>
<li><strong>有效率</strong>: 一个经济从它可以获得的稀缺资源中获得了它能得到的全部东西(ABEF点))</li>
<li><strong>无效率</strong>: 该经济的产量小于它从可以获得的资源中所能得到的最大可能产量(D点))</li>
</ul>
<p>一个经济可以用它拥有的资源在生产可能性边界上和以内的任何一点进行生成,但它不能在这条边界以外的任何一点进行生产。</p>
<h1>本章脑图总结</h1>
<p><img alt="Mindmap" src="http://zhouyichu.com/images/mindmap-economic-2.png"/></p>
<h1>参考资料</h1>
<ul>
<li>「微观经济学」第七版 - 曼昆</li>
</ul>
<h1>修改日志</h1>
<ul>
<li>2016年4月24日 首次发布</li>
</ul>微观经济学读书笔记-12016-04-23T20:37:49-06:002016-04-23T20:37:49-06:00Flyawaytag:zhouyichu.com,2016-04-23:/economics/microeconomics-1/<p>微观经济学学习笔记1-经济学十大原理</p><h1>经济学定义</h1>
<p>在学习任何学科之前,首先要明确这个学科的定义是什么,有哪些基本公设,这样才能有一个坚实的基础,之后所有的知识都建立在这个基础之上的。</p>
<p>在自学「微观经济学」的过程中,明确了一些以前没怎么理清的概念.</p>
<p>首先,我们必须承认的是,当前这个社会拥有的资源的是有限的,尽管整个宇宙拥有的物质资源可能是无限的,但是我们人类能获取的资源却是有限的。</p>
<p>而当一个东西是有限的时候,那就必然会涉及到对它的分配问题,而经济学就是用来研究整个社会是如何进行有限资源的管理和分配的。</p>
<blockquote>
<p><strong>经济学</strong>: 研究社会如何管理自己的<em>稀缺资源</em> 。</p>
</blockquote>
<p>经济学研究的主要内容有:</p>
<ol>
<li>研究人们如何做出决策</li>
<li>研究人们如何相互影响</li>
<li>分析影响整个经济的力量和趋势</li>
</ol>
<p>其中前两项是属于<a href="https://zh.wikipedia.org/wiki/%E5%BE%AE%E8%A7%82%E7%BB%8F%E6%B5%8E%E5%AD%A6">微观经济学</a>,最后一项属于<a href="https://zh.wikipedia.org/wiki/%E5%AE%8F%E8%A7%82%E7%BB%8F%E6%B5%8E%E5%AD%A6">宏观经济学</a>.</p>
<h1>十大原理之一: 人们面临权衡取舍</h1>
<p>首先需要定义两个概念:</p>
<blockquote>
<p><strong>效率</strong>: 指社会能从其<em>稀缺资源</em>中得到的最大利益。
<strong>平等</strong>: 将这些利益<em>平均</em>地分配给社会成员。</p>
</blockquote>
<p>整个社会其实就面临着<strong>效率</strong>和<strong>平等</strong>的取舍,这两者某种程度上是相互制约的,讲究效率必然会减少平等,而追求平等必然会降低效率。</p>
<p>换句话说,<strong>效率</strong>是希望把经济蛋糕做大;而<strong>平等</strong>是希望把经济蛋糕切成均等的小块,分配给每一位社会成员。</p>
<h1>十大原理之二: 某种东西的成本是为了得到它所放弃的东西</h1>
<p>这个原理其实描述的就是一个概念: <strong>机会成本</strong></p>
<blockquote>
<p><strong>机会成本</strong>: 为了得到某种东西必须放弃的东西.</p>
</blockquote>
<p>机会成本是经济学中最重要的几个概念之一,后面的考量贸易的优点时,机会成本是个很重要的工具。</p>
<h1>十大原理之三: 理性人考虑边际量</h1>
<p>在经济学中,我们总是默认每一个人都是理性的,只有基于这样的假设,经济学家才能做出正确的分析<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<blockquote>
<p><strong>理性人</strong>: 系统而有目的地尽最大努力去实现其目标.
<strong>边际变动</strong>: 对行动计划的微小增量调整。</p>
</blockquote>
<p>当且仅当一种行为的边际收益大于边际成本时,一个理性决策者才会采取这种行为。</p>
<h1>十大原理之四: 人们会对激励做出反应</h1>
<blockquote>
<p><strong>激励</strong>: 引起一个人做出某种行为的某种东西(惩罚或奖励的预期)</p>
</blockquote>
<p>在分析激励的时候,要特别小心,因为很多情况下我们并不知道一个国家政策会导致什么样的激励。也许某项政策的出发点是好的,但是由于没考虑到可能引起的不同激励,反而起到了反效果。</p>
<p>在经济生活中,激励起着中心作用,正是因为人们对各种不同的激励做出不同的反应,才发展出了这个大千世界。</p>
<h1>十大原理之五: 贸易可以使每个人的状况都变好</h1>
<p>这个原理其实很简单,就是在强调贸易的重要性。在后面的章节中,会对贸易进行具体的分析。</p>
<h1>十大原理之六: 市场通常是组织经济活动的一种好方式</h1>
<blockquote>
<p><strong>市经经济</strong>: 当许多企业和家庭在物品与服务市场上相互交易时,通过他们的分散决策配置资源的经济</p>
</blockquote>
<p>这就是传说中看不见的手啊!在一般情况下,每个个体都会追求自我利益的最大化,而在这个过程会导致整个社会利益的最大化,这确实是一个很神奇的现象。</p>
<h1>十大原理之七: 政府可以改善市场结果</h1>
<p>但是,完全依赖于市场自身的调节,有时候并不能达到社会资源配置的整体最优,这种情况称为<strong>市场失灵</strong>:</p>
<blockquote>
<p><strong>市场失灵</strong>: 市场本身不能有效配置资源的情况</p>
</blockquote>
<p>而导致市场失灵的原因主要有两个,分别是:</p>
<blockquote>
<p><strong>外部性</strong>: 一个人的行为对旁观者福利的影响.(工厂的环境的污染)
<strong>市场势力</strong>: 单个经济活动者对市场价格有显著影响的能力(垄断)</p>
</blockquote>
<p>当发生市场失灵的时候,政府就要出手干预,干预的目标在于两点:</p>
<ol>
<li>促进社会效率</li>
<li>促进社会平等</li>
</ol>
<h1>十大原理之八: 一国的生活水平取决于它生成物品与服务的能力</h1>
<p>一国的生成能力主要用<strong>生产率</strong>来衡量:</p>
<blockquote>
<p><strong>生产率</strong>: 每单位劳动投入所生产的物品与服务数量</p>
</blockquote>
<p>一国生产率的增长决定了它的平均收入的增长率。</p>
<h1>十大原理之九: 当政府发行了过多的货币时,物价上升</h1>
<p>这就是我们经常听到的<strong>通货膨胀</strong>:</p>
<blockquote>
<p><strong>通货膨胀</strong>: 经济中物价总水平的上升.</p>
</blockquote>
<h1>十大原理之十: 社会面临通货膨胀与失业之间的短期权衡取舍</h1>
<h1>本章脑图总结</h1>
<p><img alt="MindMap" src="http://zhouyichu.com/images/MindMap.png"/></p>
<h1>参考资料</h1>
<ul>
<li>「微观经济学」第七版 - 曼昆</li>
</ul>
<h1>修改日志</h1>
<ul>
<li>2016年4月23日 首次发布</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实这是个很基本的假设,后面所有的分析都是基于这个假设。但在实际生活中,这个假设未必成立。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Python剖析02016-04-23T20:26:26-06:002016-04-23T20:26:26-06:00Flyawaytag:zhouyichu.com,2016-04-23:/python/analysis-python-0/<p>本文总结了Python源代码文件的组织结构,为后续学习Python源代码打好基础。</p><h1>写在前面</h1>
<p>之前一直在纠结该不该把「算法导论」的读书笔记系列写完,后来考虑到下半年出国读书时,高级算法课依然将会是一门必修课,因此决定把「算法导论」读书笔记系列安排到上课时一起进行,而不需要分两次学习算法了。</p>
<p>于是,马上切换到下一个比较感兴趣的点上——Python源码剖析。</p>
<p>陈儒先生曾经出过一本书,就叫「Python源码剖析」,但是这本书出得比较早,是2008年出版的,现在基本已经买不到了,早就停印了。
曾经在大学期间和研究生期间看过,确实对理解Python的内部实现有很大帮助,可惜随着时间的推移,这本书:</p>
<ol>
<li>太古老了,Python语言每年都在进行变化,很多内部结构发生了变化,「Python源码剖析」中的内容很多都和现在的源码不一致了。</li>
<li>只涵盖了Python2的部分,对于目前主流的Python3并没有涉及。</li>
</ol>
<p>因为上述两个问题,使得我们很难真正理解Python的底层实现是什么样的,于是乎我就产生了好好研究一下Python源码的想法。</p>
<p>虽然在很多人看来,这也许是一个没有太大意义的事情,只要懂得用就行了,何必花大力气去看源码呢?而且在众多的语言中 Python的实现绝不是最好的。</p>
<p>对于这些疑问,我只能说,这就是我的兴趣,我喜欢Python,我更加深入地了解它,仅此而已!</p>
<p>在正式开始之前,有个研究PLT的朋友向我推荐了15年新出的一本书: 「 <a href="https://www.amazon.cn/Fluent-Python-Ramalho-Luciano/dp/1491946008/ref=sr_1_sc_1?ie=UTF8&qid=1461411698&sr=8-1-spell&keywords=fluent+ptython">Fluent Python</a> 」,这也是一本针对Python的高阶书籍,主要是对Python的设计哲学进行论述,感觉还不错。</p>
<p>接下去的计划是这样的:</p>
<ol>
<li>首先把陈儒先生的「Python源码剖析」和Luciano Ramalho的「Fluent Python」过一遍,做出读书笔记,对Python实现有个大概了解</li>
<li>在陈儒先生的基础之上,自己阅读目前Python3的源码,分析提炼出自己觉得有价值的内容。</li>
</ol>
<h1>何谓Python</h1>
<p>这里所说的<a href="http://python.org/">Python</a>其实包含了两个意思,第一层意思是指Python语言,这是一种具体的编程语言,它有它相应的规范和文法;第二层意思是指Python这个编程语言的具体实现,最常用的一个实现就是CPython,用C语言实现的Python版本,其他还有JPython,PyPython等等。
这就好比是C语言有<a href="https://zh.wikipedia.org/wiki/ANSI_C">ANSI C</a>这个规范,同时有很多符合这个规范的实现(编译器),比如GCC系列和Borland系列.
而对于Python这种动态语言来说,它的具体实现称作解释器。
我比较感兴趣的是CPython的具体实现,因此本文以及后续所有的文章都是围绕CPython这个实现来展开的。</p>
<h1>Python总体框架</h1>
<p><img alt="Python Structure" src="http://zhouyichu.com/images/python-structure.jpg"/></p>
<p>Python的整体框架如上图所示,主要有三个组成部分:</p>
<ol>
<li>文件系统: 包含了Python本身的代码文件、内置的库文件已经用户自定义的模块。</li>
<li>Python核心: 本质其实就是Python解释器,通过词法分析、语法分析、生成字节码等流程,将写好的Python程序转化成为Python虚拟机可以执行的字节码。</li>
<li>Python运行时环境,包括了对象/类型系统(Object/Type structures),内存分配器(Memory Allocator)和运行时状态(Current State of Python).对象/类型系统负责管理Python运行过程中的各种内建对象以及用户自定义的类型和对象;内存分配器负责自动管理内存的申请和释放;运行时状态则维护了程序执行过程中各种不同状态的切换。</li>
</ol>
<h1>Python源代码组织</h1>
<p>Python 3.5.1的源代码组织结构如下所示:</p>
<p><img alt="Source-Code-Structure" src="http://zhouyichu.com/images/source-code-structure.png"/></p>
<p>其中各个目录主要作用如下:</p>
<ul>
<li>Doc: 不用说,这个目录是存放Python文档的目录.Python的文档是基于<a href="http://sphinx-doc.org/">Sphinx</a>制作的,采用reStructuredText进行写作。</li>
<li>Grammar: 该目录只有一个Grammar文件,包含了描述Python整个文法,以BNF的形式写在了Grammar文件中。</li>
<li>Include: 该目录下包含了Python提供的所有头文件。</li>
<li>Lib: 该目录包含了Python自带的所有标准库,Lib中的库都是用Python写成的。</li>
<li>Mac: 针对Mac系统的配置代码</li>
<li>Misc: 一些不太好归类的文件都放在这里了。</li>
<li>Models: 该目录包含了所有用C语言编写的模块,这些模块对速度有比较高的要求,因此都是用C写成的,而对速度没有太高要求的模块都是用Python写成放入Include目录。</li>
<li>Objects: 该目录中包含了Python的内建对象的实现。</li>
<li>Parser: Python的词法分析器和语法分析器。</li>
<li>PC: 比较老的Windows和OS2的Port的项目以及Port用到的一些公用文件放在这里,PCBuild要用到这个目录的内容.</li>
<li>PCBuild: Python用于VS 2015的Project文件</li>
<li>Programms: 可执行文件的源代码。</li>
<li>Python: 该目录下包含了Python解释器和虚拟机,是Python运行的核心。</li>
<li>Tools: 扩展Python所需要的工具。</li>
</ul>
<h1>参考资料</h1>
<ul>
<li><a href="http://blog.csdn.net/atfield/article/details/1457035">Python源码分析4 – Grammar文件和语法分析</a></li>
<li>Python源码剖析</li>
</ul>
<h1>修改日志</h1>
<ul>
<li>2016年4月23日 首次发布</li>
</ul>2016年3月书单2016-04-02T16:17:03-06:002016-04-02T16:17:03-06:00Flyawaytag:zhouyichu.com,2016-04-02:/reading-list/Reading-List-2016-March/<p>2016年3月阅读书单</p><h1>嫌疑人X的献身</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这是我看的第二部东野圭吾的推理小说,和「<a href="http://zhouyichu.com/reading-list/Reading-List-2016-Febuary/">秘密</a>」不同,这确实一部合格的推理小说。</p>
<p>虽说从一开始就知道谁是凶手,但是确实在没想到石神的方案会是这么极端,这么不计后果</p>
<p>最后揭露的手法,确实是整部小说的点睛之笔。</p>
<p>但是,在推理逻辑上有点牵强,汤川仅仅通过对老友的一个表情就对他产生了怀疑,这样的转折太过生硬了,显得很不自然。</p>
<p>另外,结尾也觉得非常突兀,靖子竟然去自首了……或许是为了照顾主流思想吧……</p>
<p>尽管略有瑕疵,但是不失为一部精彩的小说。</p>
<hr/>
<h1>雪国之劫</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>相较于「嫌疑人X的献身」,这部「雪国之劫」就略逊一筹了。</p>
<p>不到40%,我就猜到是谁参与了犯案,虽然原因不知道,但从细节中我很早就锁定了嫌疑人,所以最终的揭露除了原因以外,其他都在预料之中。</p>
<p>相比之下,东野圭吾和阿加莎克里斯蒂就差了不少,阿加莎的功力明显要比东野要强,故事更加紧凑,多条分散而又有联系。</p>
<hr/>
<h1>信</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这是一部非常好的作品,深刻讨论了罪犯、歧视等社会问题。</p>
<p><strong>歧视</strong></p>
<p>主人公哥哥为了能凑钱让弟弟上大学,入室行窃被主人发现后,失手杀死了主人。
从此弟弟就要一直背负杀人凶手家属的这个标签。</p>
<p>原来我们都觉得歧视是一种不合理的存在,可实际上,即使我们明白歧视是不合理的,我们也仍然会不自觉地产生歧视心理。
这不是你主观想要的,但就是会发生。
就像主人公直贵因为背负一个杀人犯哥哥的标签,生活中处处碰壁,倒不是人们故意对他有歧视或不公正待遇。
仅仅是因为不想和他发生联系,怕引起麻烦。</p>
<p>想想生活中那些事,其实还不是都是这样的……</p>
<blockquote>
<p>他们希望直贵的到幸福,但并不想跟自己有太多瓜葛,如果别人能给予帮助更好。</p>
</blockquote>
<p>人们怀着旁观的想法,希望他的到幸福,却也不愿自己成为那个帮助他的人。想想那些乙肝携带者、艾滋病患者。</p>
<p>书中东野借社长之后总结了两种方式来面对歧视问题:</p>
<p>1.直面被歧视这个事实,坦坦荡荡直面被歧视的人生。</p>
<blockquote>
<p>孜孜不地一点一点恢复他与社会的相容性。一根一根地增加与他人联系的线。等形成了以你为中心的像是蜘蛛网一样的联系,就没有人无视你的存在。</p>
</blockquote>
<p>这也许是一条看似艰辛的道路,这也许也是大部分遭遇歧视的人的解决方案。</p>
<p>2.直接斩断和过去的所有联系,重新开始。</p>
<blockquote>
<p>只要自己堂堂正正地做就可以了,这种想法是不对的。那只不过是一种让别人接受自己做法,实际上应当选择更为艰难的道路。</p>
</blockquote>
<p>而直贵最终也是选择了这条道路,彻底和哥哥断绝一切关系。</p>
<p>其实这个结局挺忧伤的,没有人做错事,却最终导致了一个悲伤的结局。</p>
<p><strong>犯罪</strong></p>
<p>从另外一个角度来说,一个人做错事,真的只需要自己付出代价吗?
其实远远不是这样,你做错了事,你周围的人也会因此而付出代价。
最终接受惩罚的不仅仅是你一个人,还有你的亲人、朋友。</p>
<p><strong>选择</strong></p>
<p>人生总是要面对很多艰难的选择,有些选择不管怎么选都是错的。
也许,完美的人生就是将错就错,一错到底.</p>
<blockquote>
<p>得到那个,就得不到这个。人生就是要选择什么就要舍弃什么的反复。</p>
</blockquote>
<p>最后,尽管这个小说的主题非常好,但是在剧情设置上有明显的不合理之处——直贵的妻子。
由实子这个人物出现的太突兀了,彷佛就是从天而降的,就是为了来给直贵创造幸福生活的。
看到她的时候,我脑海中闪现出了另外一个身影——扫地神僧!
这个人物就像是金庸笔下的扫地神僧一样,完全是剧情需要才出现的人物,从整个故事框架来看,非常的突兀不和谐。</p>
<hr/>
<h1>知乎周刊: 新技能get</h1>
<p>这本小册子是跳着读的,只看一些自己的感兴趣的部分,主要摘录如下:</p>
<ol>
<li>做一件很困难的事情,不求一次坐好,先做出一个框架,然后慢慢修改。</li>
<li>积累=(平均记忆-平均忘却) x 时间</li>
<li>学习就是: 生疏--> 找到时能找到-->熟练-->本能</li>
<li>别人告诉你的答案终究是答非所问的提示,终究还得靠自己领悟。本质就是想说,答案不重要,重要的是得到答案的过程。</li>
<li>没有人有义务透过连你自己都毫不在意的邋遢外表去发现你优秀的内在。</li>
<li>通向地狱之路,常由善意铺就。</li>
</ol>
<hr/>
<h1>奇特的一生</h1>
<p>作者: 格拉宁</p>
<p>这也是本小册子,很快就看完了。</p>
<p>不过,老实说,这本书写的其实真不怎么样。</p>
<p>真正有价值的大概只有详细描述柳比歇夫时间记录的法的那一章吧,其他的章节不知所云,一味的吹嘘柳比歇夫有多伟大,像老太太一样的絮叨。</p>
<p>真正有干货的那一章还是很值得学习的,柳比歇夫那事无巨细的时间统计体系把他整个人生像快照一样记录了下来,而且他还是在没有现代化电子设备的年代,纯靠纸和笔做到的。</p>
<p>虽然我平时也在对自己进行时间的记录,但都是浅尝辄止的,并没有像柳比歇夫那样细致无比的分析。</p>
<p>不过,他形成这样的体系也是花了好几年的时间,也许若干年后,我能做到吧。</p>
<p>在柳比歇夫的时间记录法中,他把各个系统都集合在一个系统——他的时间分析系统。而目前的我,是拥有多个管理系统的,比如任务管理系统、健身管理系统、读书管理系统,当然也包括时间管理系统。这几个系统基本是相互独立的,各自记录各自的事务。</p>
<p>看了「奇特的一生」之后,我也在考虑是否可以把所有的系统都集合在一起,形成一个大型的个人成长管理系统。</p>
<p>一步一步来吧,先从改善时间管理系统开始!</p>
<hr/>
<h1>囚徒健身</h1>
<p>作者: 保罗·威德</p>
<p>这是我第二遍看「囚徒健身」,尽管我不喜欢作者的写作方式与态度,但是他写的健身方式还是有一些效果的。</p>
<p>之所以重看一遍,是为了继续阅读后续的「囚徒健身2」、「囚徒爆发力」和「囚徒增肌」.</p>
<hr/>
<h1>银河帝国8: 我,机器人</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a></p>
<p>时隔大半年之后,我又继续开始看<a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a>的银河帝国系列了,作为最负盛名的科幻小说,银河帝国确实有着无比的魅力。</p>
<p>这部小说其实是一部小说集,整本书分为若干篇短文,分别讲述了机器人即使在<a href="https://zh.wikipedia.org/wiki/%E6%9C%BA%E5%99%A8%E4%BA%BA%E4%B8%89%E5%AE%9A%E5%BE%8B">三大定律</a>之下也有可能存在的各种各样的问题。</p>
<ul>
<li>小机: 人类小女孩对机器人产生了依赖感。</li>
<li>转圈圈: <a href="https://zh.wikipedia.org/wiki/%E6%9C%BA%E5%99%A8%E4%BA%BA%E4%B8%89%E5%AE%9A%E5%BE%8B">三大定律</a>使得机器人处于癫狂的状态。</li>
<li>理性: 机器人和人类具有完全不同的世界观,但这并不妨碍机器人为人类服务。</li>
<li>抓兔子: 机器人可能存在的指挥故障。</li>
<li>骗子: 一个可以窥测人类心灵的机器人。</li>
<li>消失无踪: 修改三大法则可能产生的后果。</li>
<li>逃避: 人类开始使用超级机器人开发新技术。</li>
<li>证据: 出现了完全仿真的机器人,机器人开始从政。</li>
<li>可避免的冲突: 机器人开始掌管人类社会,整个经济系统由四台超级计算机进行调配和管理。</li>
</ul>
<hr/>
<h1>银河帝国9: 钢穴</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E6%92%92%C2%B7%E8%89%BE%E8%A5%BF%E8%8E%AB%E5%A4%AB">Isaac Asimov</a></p>
<p>这部小说相比银河帝国的其它的作品来说,显然差了一些,没有让人太过惊艳的感觉。</p>
<p>同时,我也认为,小说中的描述的由钢穴组成的大城世界是不可能会发生的,尽管当前社会依然是分工越来越细,但人类社会是不可能最终发展成蜜蜂式的社会结构。每个人都有自己不同的诉求,而且这些诉求从来就没有统一过,怎么可能所有人类都最终集中到超级大城之中去呢?</p>
<p>这部小说作为银河帝国的前传,仅仅也只是起到了一个铺垫作用,科幻程度、对未来的思考力度都有所欠缺。 </p>三种梯度下降法2016-03-28T20:13:22-06:002016-03-28T20:40:22-06:00Flyawaytag:zhouyichu.com,2016-03-28:/machine-learning/Three-Gradient-Descent/<p>总结了三种最常用的梯度下降算法</p><h1>写在前面</h1>
<p>最近需要手写一个Feedforward的网络结构,在选择优化算法的时候,猛然发现原来Batch Gradient Descent和mini-Batch Gradient Descent是两种不同的优化策略,感觉这里遗漏了一大块知识,赶忙补充了一下,此处做一下记录。</p>
<h1>Batch Gradient Descent</h1>
<p>在优化目标函数的时候,Batch Gradient Descent(BGD)是先计算整个数据集上的梯度,然后再进行更新操作。对于参数<span class="math">\(\theta\)</span>来说,每更新一次其中的某一位权重<span class="math">\(\theta_j\)</span>,BGD都需要遍历整个数据集。</p>
<p>对于目标函数<span class="math">\(h_{\theta}(x)\)</span>用公式来表示就是:</p>
<div class="math">$$
\begin{equation}
\theta_j := \theta_j + \alpha\sum\limits_{i=1}^m(y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)} \label{BGD}
\end{equation}
$$</div>
<p>其中的<span class="math">\((y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)}\)</span>其实就是对于训练样例<span class="math">\( x^{(i)} $的\)</span>j<span class="math">\(属性的梯度,\)</span>m$是训练集的大小,具体的推导过程可以在<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/">这里</a>查看。</p>
<p>从公式<span class="math">\(\ref{BGD}\)</span>中可以看到,BGD是对整个数据集进行扫描然后计算整体梯度(<span class="math">\(\sum\)</span>求和过程),进行更新。其实,这才是真正的梯度.</p>
<p>BGD的优点在于对于凸问题,它是能够保证收敛到全局最优点的。而缺点就是,计算量很大,计算每一位的权重都要遍历整个数据集,这代价未免太大了,计算量是无法接受的。随之而来的另外一个缺点就是BGD是无法进行online训练的,它必须要知道全部的训练集的情况下才能进行训练,这对于一些线上系统也是一个问题。</p>
<h1>Stochastic Gradient Descent</h1>
<p>SGD是对BGD的一个改进方案,改变之处在更新时不需要遍历整个数据集,而是每一个实例都进行更新。具体公式是:</p>
<div class="math">$$
\begin{equation}
\theta_j := \theta_j + \alpha(y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)} \label{SGD}
\end{equation}
$$</div>
<p>比较公式<span class="math">\(\ref{BGD}\)</span>和<span class="math">\(\ref{SGD}\)</span>,我们可以发现区别就在省略了求和过程<span class="math">\(\sum\)</span>,也就是说更新权重的时候,不需要计算整体的梯度,而是仅仅依靠当前实例的梯度进行更新。</p>
<p>如此改变之后,速度明显提高了很多,但是这也是有风险的。由于进行频繁的梯度更新,很有可能直接跳过了最优点。因此,SGD实际上是无法保证收敛到全局最优点的,而且不是那么的稳定。</p>
<h1>Mini-Batch Gradient Descent</h1>
<p>而Mini-Batch是对上述两种策略的一种中和,它的基本思想就是从整个训练集上选取一个子集,对这个自己进行BGD的更新。具体公式可以表示为:</p>
<div class="math">$$
\begin{equation}
\theta_j := \theta_j + \alpha\sum\limits_{i=1}^n(y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)} \label{mini-BGD}
\end{equation}
$$</div>
<p>比较公式<span class="math">\(\ref{BGD}\)</span>和<span class="math">\(\ref{mini-BGD}\)</span>会发现唯一的区别在于求和时的项数不一样,此处的<span class="math">\(n\)</span>不再是训练集的大小,而是一个小于或等于<span class="math">\(m\)</span>的数,通常范围在于50-256。</p>
<p>简单来说,先把大小为<span class="math">\(m\)</span>的训练集平均分为大小为<span class="math">\(n\)</span>的<span class="math">\(\frac{m}{n}\)</span>个子集,每次读入一个子集,进行梯度计算,更新权重。</p>
<p>相比SGD来说,它更加稳定;相比BGD来说,它计算量较小。</p>
<h1>总结</h1>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">BGD</th>
<th align="center">SGD</th>
<th align="center">mini-Batch</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">训练集</td>
<td align="center">固定</td>
<td align="center">固定</td>
<td align="center">固定</td>
</tr>
<tr>
<td align="center">单次迭代样本数</td>
<td align="center">整个训练集</td>
<td align="center">固定</td>
<td align="center">训练集的子集</td>
</tr>
<tr>
<td align="center">算法复杂度</td>
<td align="center">高</td>
<td align="center">低</td>
<td align="center">一般</td>
</tr>
<tr>
<td align="center">收敛性</td>
<td align="center">稳定</td>
<td align="center">不稳定</td>
<td align="center">较稳定</td>
</tr>
</tbody>
</table>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>在Gitbook中使用Markdown写日记2016-03-27T00:00:00-06:002016-03-27T00:00:00-06:00Flyawaytag:zhouyichu.com,2016-03-27:/misc/Write-Diary-in-Gitbook/<p>在Gitbook中使用Markdown写日记。</p><p>我平时有写日记的习惯,而且特别想要使用<a href="http://wowubuntu.com/markdown/">Markdown</a>来写日记,可惜没能发现比较合适的工具。</p>
<p>对于这类工具,我主要有如下几点要求:</p>
<ol>
<li>便于组织,能够打开即写</li>
<li>支持<a href="">Markdown</a>格式</li>
<li>远程同步,由于写日记这是个长期的习惯,我可不希望换机器的时候,连日记一起丢失了。</li>
</ol>
<p>过去一段时间内,折腾过的工具主要有如下三种:</p>
<h1>Evernote</h1>
<p>原来是一直使用<a href="https://evernote.com/intl/zh-cn/">Evernote</a>作为日记工具的,它的组织和同步功能堪称一流,唯一的不足就是不支持<a href="http://wowubuntu.com/markdown/">Markdown</a>的语法,而且在可预见的未来,<a href="https://evernote.com/intl/zh-cn/">Evernote</a>似乎也不太可能支持<a href="http://wowubuntu.com/markdown/">Markdown</a>.</p>
<p>虽然如此,我却一直苦于没有合适的工具,只能一直屈从于Evernote的富文本协议。</p>
<h1>Hexo</h1>
<p><a href="https://hexo.io/">Hexo</a>本身是一个静态博客框架,基于<a href="https://nodejs.org/en/">Node.js</a>构建的,在各个静态博客工具中,属于做的比较好的。由于它天生就支持<a href="http://wowubuntu.com/markdown/">Markdown</a>,使用它来构建我自己的日记系统似乎也是一种比较好的选择。</p>
<p>然而,Hexo不足的一点在于对于日记的组织能力不够,当然这也许可以通过一些<a href="https://hexo.io/plugins/">插件</a>来解决,但这又和我简约的要求相违背了。</p>
<h1>Gitbook</h1>
<p><a href="https://www.gitbook.com/">Gitbook</a>其实之前就看到过有人推荐这个工具了,但是一直没有仔细深入研究过。借着这次机会,我深入了解了一些<a href="https://www.gitbook.com/">Gitbook</a>,它本身是一个用来写作电子书的工具,它的目的在于让大家更方面的写作属于自己的电子书.它的一些特性对我来说,完美的满足了我的需求。</p>
<h2>便于组织</h2>
<p>整本电子书是按章节分割的,每一个章节都可以独立成单个文件。对我写日记的需求来说,我可以把把每月、每周、每天都作为一个独立章节来对待,每一天都是独立的一个文件。</p>
<p>而这些文件完全不需要手动建立,需要你做的只需要编辑项目根目录下的<code>SUMMARY.md</code>文件,其他的工作就可以统统交给<a href="https://www.gitbook.com/">Gitbook</a>来完成了。</p>
<h2>支持Markdown</h2>
<p>这是最重要的特性,如果没有这个特性我是不会选择<a href="https://www.gitbook.com/">Gitbook</a>的。它不仅支持普通的<a href="http://wowubuntu.com/markdown/">Markdown</a>,还支持<a href="http://help.gitbook.com/format/markdown.html">GFW</a>,也就是我们能够在日记中使用表格.</p>
<h2>简约</h2>
<p>利用<a href="https://www.gitbook.com/">Gitbook</a>来写日记,只需要掌握两个命令就可以了:</p>
<ul>
<li><code>gitbook init</code>: 初始化一个项目</li>
<li><code>gitbook serve</code>: 运行一个项目</li>
</ul>
<h2>远程托管</h2>
<p>其实<a href="https://www.gitbook.com/">Gitbook</a>是支持远程托管的,但是对于免费用户来说,所有托管的电子书都是公开的,这显然是不适合日记这类写作目的的。</p>
<p>其实,还有别的方案的:托管的功能可以交给Dropbox同步就可以了。</p>
<p><a href="https://www.gitbook.com/">Gitbook</a>在我本地只是扮演一个组织者和渲染工具的角色,云端保存的任务交给Dropbox就可以了。</p>
<p>最后贴一张<code>SUMMARY.md</code>的样例:</p>
<p><img alt="SUMMARY.md的样例" src="http://zhouyichu.com/images/summary.png"/></p>2016年2月书单2016-03-01T00:00:00-07:002016-03-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2016-03-01:/reading-list/Reading-List-2016-Febuary/<p>2016年2月阅读书单</p><h1>秘密</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a></p>
<p>这是第一次看<a href="https://zh.wikipedia.org/wiki/%E6%9D%B1%E9%87%8E%E5%9C%AD%E5%90%BE">东野圭吾</a>的书,一直都是风闻,而没有眼见,这次终于眼见了一下。</p>
<p>小说描写的是男主角平介的妻子直子因为一次交通事故,她的意识进入到了小学五年级的女儿身上,从此两个人即是夫妻又是父女的奇怪关系就展开了。</p>
<p>这样的故事从一开始它的结局就是注定的了,随着时间的推移,直子必然会逐渐进入到一个小女孩的角色,重新开始她新的生活。他们的分离是注定的。</p>
<p>整体来说,这部小说像是一条中规中矩的小溪,比较温情,情节没有明显起伏,我看到70%的时候就猜到了结局。</p>
<p>当直子决定重新过一遍没有后悔的生活的时候,有两句话说得挺好,摘录如下:</p>
<blockquote>
<p>只有有一次破例,就会有第二次、第三次不是吗?失败过一次就会一直失败下去。</p>
<p>那种深深的后悔,经历一次,就算是死也不愿再经历第二次了。</p>
</blockquote>
<p>可惜的是,这只是一部小说,直子有机会重新来过她的生活,而我们却只有一次机会。虽然这不是这本小说的主题,但是却是最让我铭记的一点。</p>
<hr/>
<h1>楚留香新传1: 借尸还魂</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a></p>
<p>就本身故事性而言,其实这部「借尸还魂」也不算出众,看到一半左右的时候,我就猜到了基本的结局。</p>
<p>之前看过<a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a>的「多情剑客无情剑」,不过说实话,古龙的风格我并不是很喜欢。风格太过飘逸,主人公太过神话,不像是小说,而更像是散文,或者干脆就是新体诗。</p>
<p>然而这种风格仍然吸引了大量的读者,也许他们仅仅是喜欢这种飘逸的文风。</p>
<hr/>
<h1>楚留香新传2: 蝙蝠传奇</h1>
<p>作者: <a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a></p>
<p><a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a>小说中的爱情是属于那种少男少女喜欢的,只要看一眼就深深的爱上,并且至死不渝。然而,这对稍微年长的一点的人来说不太容易接受。</p>
<p>真正经过爱情的人明白,其实生活中并没有那么多的花前月下,更多的是琐碎。</p>
<p>「蝙蝠传奇」中有句话比较喜欢,摘录如下:</p>
<blockquote>
<p>一个人只要还没死,无论在任何情况下,都得忍耐。</p>
</blockquote>
<p>这句话通俗地来说,就是「好死不如赖活」.</p>
<hr/>
<h1>楚留香新传3: 桃花传奇</h1>
<p>连续看了三部「楚留香」,这是第三部。</p>
<p>剧情的发展一部比一部诡异,这里的诡异可不是什么褒义词,甚至有点贬义。对于我这种理工生来说,古龙的逻辑我实在无法理解。。。</p>
<p>看古龙的著作,也只是看他的语言,而不能看他的故事。</p>
<p>一部小说其实有很多角度可以评说,我目前认为有两点是优秀小说必备的:</p>
<ol>
<li>语言能力,文字是否优美。</li>
<li>剧情发展是否合理,是否能抓住人物的心理。</li>
</ol>
<p>我觉得古龙在第一点上发挥到了极致,但是对于第二点来说,还是差了那么一点。而<a href="https://zh.wikipedia.org/wiki/%E9%87%91%E5%BA%B8">金庸</a>似乎相反,语言文字一般,但剧情发展设置比较引人入胜。仅就翻拍电视剧的次数,就能看出<a href="https://zh.wikipedia.org/wiki/%E9%87%91%E5%BA%B8">金庸</a>在剧情设置上要比<a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a>略胜一筹。</p>
<p>中国武侠三大家,<a href="https://zh.wikipedia.org/wiki/%E9%87%91%E5%BA%B8">金庸</a>和<a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a>我都有涉猎,还剩一个<a href="https://zh.wikipedia.org/wiki/%E6%A2%81%E7%BE%BD%E7%94%9F">梁羽生</a>我还没怎么看过,有空再看看梁羽生的风格。</p>
<hr/>
<h1>知乎周刊: 读书这件小事</h1>
<p>这本小册子是<a href="http://www.zhihu.com/">知乎</a>搜集了一些关于读书这个主题的优秀问答集合而成的合本。</p>
<p>其中有些回答很值得借鉴,主要记录如下:</p>
<ol>
<li>读书需要顺藤摸瓜地读,从一个作家推崇的其它作品中,一路向上追述,不断扩展自己的阅读疆界。</li>
<li>世上大师太多,此生已不可能全部读完。每每想到这一点,总是感到很遗憾。</li>
<li>学到的知识,很大一部分会被忘却,而被忘却的知识的影子却保护你避免陷入很多的错觉。</li>
</ol>2015年度总结2016-02-16T00:00:00-07:002016-02-16T00:00:00-07:00Flyawaytag:zhouyichu.com,2016-02-16:/words/Summary-2015/<p>再见了2015</p><h1>写在开始</h1>
<p>我想这是最晚最晚的总结了吧,从1月份直接拖到了现在,现在连春节都快结束了。一开始是想要在1月份就总结2015的,但是当时忙于申请最后一批学校,就想把总结的事情安排到春节。结果整个春节期间都在惴惴不安的等待offer的消息,一直把年度总结的事情给忘了,直到今天打算开始重构博客的时候,才想到。Anyway,迟到总比不到来的好,现在来好好总结一下过去的2015。</p>
<h1>考试</h1>
<p>今年是忙碌的一年,上半年1月到9月,一直在在和英语战斗,先是在5月份干掉了GRE,然后在9月份干掉了TOEFL。关于GRE的准备我已经在另外一篇博文:<a href="http://zhouyichu.com/words/GRE/">告别GRE</a>有所记录,这里不再展开。</p>
<p>关于TOEFL,我也是二战才通过的……第一次本来想要乘着GRE的余威一鼓作气干掉TOEFL的,结果却败在了口语上面,其他方面倒还是不错的,说明经过GRE的洗礼之后,英语水平还是有长进的。无奈之下,只能重整旗鼓,重新来过。接下去的两个月都是在练习口语和听力。对于考试来说,其实说到底不需要什么技巧,只要做到像「卖油翁」中所说: 「无他,但手熟尔」.</p>
<p>于是乎……不怎么手熟的我再次踏上了考场,结果倒是有点出乎预料,听力满分,口语勉强上了20。这个结果已经可以接受了,终于,在2015年9月份彻底摆脱了英语考试!</p>
<h1>科研</h1>
<p>论文方面,今年中了一篇国内的会议,十月份去南昌玩了一次。</p>
<p>其他方面似乎也没有什么值得记录的事情,只是继续在默默的做实验,写论文。</p>
<p>利用<a href="http://tensorflow.org/">TensorFlow</a>,实现了几种我需要的网络结构,目前还在做实验的过程中。开学回校之后需要好好整理实验数据。</p>
<h1>健身</h1>
<p>按照去年元旦的计划,是要做到全年都坚持健身的,但是有几个月GRE的压力很大,健身就被荒废了。后来,考完TOEFL之后,又重新抓起了健身,重新整理健身规划了,采用囚徒健身的方式进行健身.</p>
<p>目前的体脂率保持在15%-16%之间,而我的目标是要降低到10%,2016继续努力吧!</p>
<h1>读书</h1>
<p>今年也是读了不少书的,现记录如下:</p>
<ol>
<li>尼罗河上的惨案</li>
<li>思维导图使用手册</li>
<li>银河帝国1:基地</li>
<li>一个陌生女人的来信</li>
<li>尽管去做-无压工作的艺术</li>
<li>穷爸爸 富爸爸</li>
<li>写给大家看的设计书</li>
<li>SEO攻略:搜索引擎优化策略与实战案例详解</li>
<li>双城记</li>
<li>牛奶可乐经济学</li>
<li>怒江之战</li>
<li>闯关东</li>
<li>Powerful Sleep</li>
<li>习惯的力量</li>
<li>断舍离:正能量翻倍的生活整理术</li>
<li>Song of Ice and Fire: A Game of Thrones</li>
<li>银河帝国1-7</li>
<li>失乐园</li>
<li>悟空传</li>
<li>山海经密码</li>
<li>Crafting Your Research Future</li>
<li>藏地密码</li>
<li>The PH.D Grind</li>
<li>五大贼王</li>
<li>囚徒健身</li>
<li>东北往事</li>
<li>古董局中局1-3</li>
<li>多情剑客无情剑1-3</li>
<li>风起陇西</li>
<li>三国机密</li>
<li>The Old man and the sea</li>
<li>深度学习的艺术</li>
<li>小强升职记</li>
<li>诛仙</li>
<li>股东局中局4</li>
<li>激荡三十年</li>
<li>文学回忆录</li>
</ol>
<p>从这个列表中可以看到,今年看的书还是以小说为主,真正具有思辨性的数据其实看的不多。这是确实是需要改进的地方,不过今年被论文和英语搞得死去活来,需要更多的闲书来放松心情。新的2016会更加注重书的质量。</p>
<p>和去年相比,书籍的数量有所上涨,2014看了27本,2015看了37本,希望在2016能看更多的书,进行更多的思考。</p>
<h1>写作</h1>
<p>今年的写作是完败的一年,基本没有什么高质量的文章产出,真是不看不知道,一看吓一跳。当然,我依然可以用考GRE,准备留学申请来安慰自己,但其实这并不是一个好借口。没有写作就是没有写作,没有写作其实就是说明了没有思考。No excuse !</p>
<h1>成就</h1>
<p>今年的主旋律是留学申请,所以主要精力还是放在英语考试和申请上面。主要完成了如下几件事情:</p>
<ol>
<li>干掉了GRE,总分326: 161+165+3.0</li>
<li>干掉了TOEFL,总分102: R:29 L:30 S:20 W:23</li>
<li>中了一篇会议论文.</li>
<li>利用<a href="http://tensorflow.org/">TensorFlow</a>构建了自己设计的神经网络</li>
<li>完成了留学申请的所有工作,一共申请了21所学校,目前正在焦虑地等待offer中....</li>
</ol>
<h1>未完成</h1>
<p>突然发现今年的未完成项目和去年的基本一致……说明今年真的是除了留学和论文,真的啥都没做...</p>
<p>出于完整性,还是要记录一下,想要完成的项目:</p>
<ol>
<li>完成几个开源项目</li>
<li>学习JS</li>
</ol>
<h1>总结</h1>
<p>2015确实是痛苦的一年,经历了GRE、TOEFL、论文的反复摧残,好在这些痛苦的事情终于过去了,现在要专注未来,丰富自己。</p>Reading List for October 20152015-10-15T00:00:00-06:002015-10-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-10-15:/reading-list/Reading-List-2015-October/<p>Reading List for October 2015</p><h1>The old man and the sea</h1>
<p>Author: <a href="https://en.wikipedia.org/wiki/Ernest_Hemingway">Ernest Miller Hemingway</a></p>
<p>This is my third time to read this novel, which still impressed me a lot.
The sentence "A man can be destroyed but not defeated" has been accompanying me since the first time I read it, which should be traced back to primary schools.</p>
<p>This time, it only took me 2 to 3 days to finish reading.
During this time period, I enjoyed the most famous fishing fight again.</p>
<p>Among the lots of different explanations about this story, I think I prefer the fighting spirit explanation.
Although Santiago got nothing for his battle with a large marlin, he shows us what a real man should be and what a real battle is.</p>
<p>This story is simply but meaningful.</p>
<p>Maybe one day I will it for the forth time.</p>
<hr/>
<h1>深度学习的艺术</h1>
<p>Author: 采铜</p>
<p>This book talks about how to learn knowledge.</p>
<p>In this book, the author split the learning process into 4 parts:</p>
<ol>
<li>Questioning</li>
<li>Decoding</li>
<li>Practising</li>
<li>Fusion</li>
</ol>
<p>Basically, I agree with this categorization.
But, in this way, I have to think about a lot of things while I am reading some materials.
I may need more practise to get used to this categorization.</p>
<p>Another idea that this book attracts me is that, we need to get the knowledge actively instead of receiving knowledge passively.
In most cases, we think we are learning knowledge, but actually we are receiving knowledge passively.
More specifically, when we set up a target: "I will finish reading this chapter today", it is only about reading through the materials, not learning.</p>
<hr/>
<h1>小强升职记</h1>
<p>Author: <a href="http://www.zhihu.com/people/zouxin">邹鑫</a></p>
<p>A lot of time management methods are talked about in this book.</p>
<p>As a matter of fact, I have heard about this book for a long time, but never read it carefully until now.
It provides a lot useful advice to improve your work efficiency.
All of these advice is dependent on the GTD, which is a working method that is designed for business man to work more efficiently.</p>Reading List for September 20152015-09-24T00:00:00-06:002015-09-24T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-09-24:/reading-list/Reading-List-2015-September/<p>Reading List for September 2015</p><h1>古董局中局 1-3</h1>
<p>Author: <a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%BC%AF%E5%BA%B8">马伯庸</a></p>
<p>This a tortuous story, but just a story.</p>
<p>Like the most network novels, this story can no not impress me. </p>
<p>This is also one of the one-time-reading books.</p>
<hr/>
<h1>多情剑客无情剑 1-3</h1>
<p>Author: <a href="https://zh.wikipedia.org/wiki/%E5%8F%A4%E9%BE%99">古龙</a></p>
<p>Instead of being a martial arts novel, I think GuLong's novel is more prose than novels.</p>
<p>In this novel, the author talks a lot about humanity, different people have different endings.</p>
<p>However, what described in this novel is distant from the common life, which makes me feel that all these characters are living in another world.</p>
<p>Although I was attracted by the protagonist, I still can not feel what the protagonist feel, I can not understand the world of this novel.</p>
<hr/>
<h1>风起陇西</h1>
<p>Author: <a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%BC%AF%E5%BA%B8">马伯庸</a></p>
<p>This is anther novel of 马伯庸.</p>
<p>This is a story based on the Romance of the Three Kingdoms.</p>
<p>The author pictured a world of spy, which happened almost 1800 years ago.</p>
<p>The structure and the imagination of this story is outstanding.
I followed the path leaved by the author, I track this details to try to find out the real spy.
I think this is a enjoyable experience.</p>
<hr/>
<h1>三国机密</h1>
<p>Author: <a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%BC%AF%E5%BA%B8">马伯庸</a></p>
<p>This is the third book of 马伯庸 I have read this month.</p>
<p>Like the 「风起陇西」, this story is also based on the Romance of the Three Kingdoms, but in a different style.</p>
<p>In this story, the author decode the Romance of the Three Kingdoms in different way, which brings me new perceptive of this famous historical story.</p>Reading List for August 20152015-08-13T00:00:00-06:002015-08-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-08-13:/reading-list/Reading-List-2015-August/<p>Reading List for August 2015</p><h1>The PH.D. Grind</h1>
<p>Author: Philip J. Guo</p>
<p>This is a book about the experience for pursuing a Ph.D in the USA.
As I am going to pursue a Ph.D in the near future, I am glad to read this book.
There are lots of vivid stories in this book which shows me the real picture of a Ph.D student's life.
What I learned from this book is that a Ph.D student's life is lonely and dark at most time, and has only a few moments for the real fun and fulfillment.
But, actually, it is these moments that really count for our lives and push us forward.
As the author said, "Fun is often frivolous, ephemeral, and easy to obtain, but true fulfillment comes only after overcoming significant and meaningful challenges."</p>
<p>As a matter of fact, pursuing a Ph.D is just an process for me.
I want to improve myself to be far beyond my mental limits and at the same time, I can contribute to the world.
No matter what research results I am going to obtain during my Ph.D lives and no matter how important these results will be, these results will be part of the knowledge of humankind.
This thinking makes me happy and excited enough to support me to spend next 5-6 years to pursue a Ph.D degree.</p>
<hr/>
<h1>五大贼王</h1>
<p>Author: 张海帆</p>
<p>This a network novel which are combined with traditional Chinese martial arts.
To be honest, I did not like this novel at first, what it says can not attract me.
After reading it for several days, its plot twists and turns, which is the conventional technique of the network novels.
Although I know what the author is playing, I can not help continuing reading it.</p>
<p>However, after finishing the reading, this novel actually did not leave any memorable impression.
All of the characters are not prominent enough, just like puppet of the author.
The only thing that can attract me is the sequence of mystery.
This kind book is categorized into one-time-reading book by myself. </p>
<hr/>
<h1>囚徒健身</h1>
<p>Author: 保罗·威德</p>
<p>I spent 3 days reading this book.
These views the author proposed in this book may not be right, but they are reasonable enough I think.
The reason this book attracts me is that I can work out without any exercise equipments, which is very suitable for me.</p>
<hr/>
<h1>东北往事</h1>
<p>Author: 孔二狗</p>
<p>This is another network novel I read in this month.
Just like the title suggests, this book talks about the gangland of Northeast China.
There are 5 books of this story, the first 4 is just fine, but the last one, I even think the last one is written by some else.</p>
<p>The characters in this novel is described much better than "五大贼王", each one has his/her own personality.</p>
<p>I am expecting sixth book.</p>2015年7月书单2015-07-15T00:00:00-06:002015-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-07-15:/reading-list/Reading-List-2015-July/<p>2015年7月阅读书单</p><h1>悟空传</h1>
<p>作者: <a href="http://baike.baidu.com/view/191381.htm">今何在</a></p>
<p>这是一位高中同学推荐的书,不过看下来觉得不怎么样,有些言过其实了。</p>
<p>通篇反应出了虚无主义的思想,剧情比较混乱,没有什么逻辑,感觉就像是荒诞剧一样。</p>
<hr/>
<h1>山海经密码</h1>
<p>作者: <a href="http://baike.baidu.com/view/4883273.htm">阿菩</a></p>
<p>玄幻小说,其实本质上和山海经应该关系不大,而且通篇看下来,感觉就是RPG游戏的剧情,一个主角及其小伙伴一路打怪练级,加上一些国仇家恨,最终一通乱打。整个过程就是典型的RPG游戏过程。</p>
<p>而且,剧情逻辑不是很连贯,尤其从第四部开始,突然像是快进了一样,剧情飞速发展,结局收尾太快,不明所以的情况下就结束了。</p>
<p>另外,人物性格比较单一,除了主角以外,其他人的性格不够突出。</p>
<hr/>
<h1>Crafting Your Research Future</h1>
<p>作者: <a href="http://cling.csd.uwo.ca/">Charles Ling</a>, <a href="http://www.cse.ust.hk/~qyang/">Qiang Yang</a></p>
<p>这是一本讲解如何开展博士生涯的书,鉴于我自己打算读博,这本书正符合我的需要。</p>
<p>这本书总结说明了关于成为一个博士所需要知道的各种事情,系统而有条理的逐步说明。下面是整理的一些笔记.</p>
<h2>综述</h2>
<p>做学术研究的两大重心:<strong>Novel</strong> 和 <strong>Significant</strong>. <strong>Novel</strong>是指所做的工作必须具有创新性,是前人未做的。<strong>Significant</strong>是指所做的工作是有意义的,能对社会做出贡献,能解决一个实际的问题。</p>
<p>PhD的两个目标是: <strong>Best</strong> 和 <strong>Independent</strong>. <strong>Best</strong>是指要在所在领域内成为最顶尖的。<strong>Independent</strong>是指能够发现、处理、解决问题的能力。</p>
<p>攻读PhD的三大任务:</p>
<ol>
<li>找到新的研究点</li>
<li>进行扎实的研究工作</li>
<li>发表论文</li>
</ol>
<p>上述这三个过程是滚动进行的,并不是一次性的,在整个攻读过程中,上述三个过程会反复进行。</p>
<p>读博过程中的几个里程碑事件:</p>
<ol>
<li>Complete all course credits(one or two years)</li>
<li>Pass a written or oral Ph.D qualifying exam(~2nd Year)</li>
<li>Pass a written or oral Ph.D proposal defense(~3rd-4th year)</li>
<li>Pass the final Ph.D thesis defense(~4th-5th year))</li>
</ol>
<p>如果能在5年内完成上述这四件事,人生就圆满了...</p>
<h2>研究</h2>
<p>开展科研工作的基础是需要阅读大量前人的论文,关于阅读论文,有以下两点需要谨记:</p>
<ul>
<li>Read less and think more</li>
<li>Critical Thinking, Creatively Thinking</li>
</ul>
<p>在选取研究课题时,可以从以下几个方面来考量一个课题:</p>
<ul>
<li>have clear benefit</li>
<li>be simple to state</li>
<li>have no obvious solution</li>
<li>have criterion where progress and solutions are testable</li>
<li>it is possible to break the larger problem down into smaller steps</li>
</ul>
<p>开展研究时,可以采用一种矩阵的方式来描述你的研究过程,如下图所示:</p>
<p><img alt="Matrix" src="http://zhouyichu.com/images/matrix.png"/></p>
<h2>论文写作</h2>
<p>在论文的写作过程,你的角色需要完成:</p>
<ul>
<li>Work with your supervisor closely for the first 1-2 papers, and learn to write papers well quickly.</li>
<li>Become independent quickly, and be able to write the whole paper well by yourself.</li>
</ul>
<p>在写作过程中,你主要两个目标:</p>
<ul>
<li>make a argument, as storng as you can.</li>
<li>represent your arguments and results as clearly and as simply as you can.</li>
</ul>
<p>论文写作的基本框架如下:</p>
<ol>
<li>The problem is important in advancing knowledge</li>
<li>Previous works A, B,… have been done, but they have</li>
<li>We propose a new theory, method, design Z</li>
<li>We prove that Z is better compared to A,B and others</li>
<li>Discuss Z’s strengths and weakness</li>
</ol>
<p>10/30 TEST:
10分钟内让读者明白你的问题是什么和你贡献是什么
30分钟内让审稿人理解你的论文并且做出推荐的决定</p>
<p>在写作一篇论文的时候,你需要讲你的研究故事讲4遍:</p>
<ol>
<li>10 words for titile</li>
<li>200 words for abstract</li>
<li>1000 words for Introduction</li>
<li>5000 words for main body</li>
</ol>
<hr/>
<h1>藏地密码</h1>
<p>作者: <a href="http://baike.baidu.com/subview/1776813/10744461.htm">何马</a></p>
<p>整部小说一共10本,也是一本非常冗长的小说,小说一旦冗长难免会显得虎头蛇尾,「藏地密码」难逃这样的命运。</p>
<p>从小说中部开始,就觉得小说变得拖沓了,越是写到后面,越是觉得作者已经江郎才尽了,后续的剧情的展开已经缺少了开局时的吸引力,人物性格已经不再那么的突出。</p>
<p>最后的悬疑设置得毫无意义,个人感觉完全不需要牵扯出所谓的「十三圆桌骑士」,把这个组织渲染得如此神话,已经失去了吸引力了,显得太过做作。</p>2015年6月书单2015-06-29T00:00:00-06:002015-06-29T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-06-29:/reading-list/Reading-List-2015-June/<p>2015年6月阅读书单</p><h1>Song of Ice and Fire: A Game of Thrones</h1>
<hr/>
<p>作者: George Raymond Richard Martin</p>
<p>看了很久,终于把这本看完了,由于是英文版的,所以看得很慢,但是确实对英语很有提高。在阅读过程中,还遇到了很多GRE单词,所以说阅读过程,对我巩固GRE单词还是很有帮助的。</p>
<h1>银河帝国1-7</h1>
<hr/>
<p>作者: Isaac Asimov</p>
<p>这也是一部大部头的书,早就听闻这部小说的大名了,之前看了第一部,感觉一般,这次把全套都看了,确实感觉非常精彩,看来这部作品也是属于慢热型的。</p>
<p>从整个小说的框架上,确实能看到很多经典小说或电影的影子,包括「星球大战」、「阿凡达」、「三体」还有之前看过的「银河系英雄传说」.</p>
<p>被誉为「史上最好看的系列小说」果然名不虚传,确实经典!</p>
<h1>失乐园</h1>
<hr/>
<p>作者: 渡边淳一</p>
<p>这是一部和我价值观无法契合的作品,久木和凛子之间的纠葛,在我看来根本不是所谓的爱情,仅仅是一种肉欲沉沦,一种对各自家庭的不负责任。</p>
<p>作品中,凛子和久木都是因为家庭的冷漠而开始婚外情的,他们总是责怪外部条件,认为家庭已经失去了温暖的感觉,自己去外面寻找新的伴侣是很自然的事情.但,他们忘记了,一个家庭的和谐与否应该是双方面的问题,他们不曾为家庭付出过什么,却总是责怪家庭有负他们, 这样的行为相当的不负责任且极其自私。 </p>
<p>印度诗人<a href="https://zh.wikipedia.org/wiki/%E7%BD%97%E5%AE%BE%E5%BE%B7%E6%8B%89%E7%BA%B3%E7%89%B9%C2%B7%E6%B3%B0%E6%88%88%E5%B0%94#.E8.AF.97.E9.9B.86">泰戈尔</a>在他的「飞鸟集」中有句诗是这样的说的: 「你错看了世界,却责怪世界欺骗了你」,将这句话应用到久木和凛子身上可以说成是:「你错待了家庭,却说家庭辜负了你」.</p>
<p>再说他们所谓的爱情,从整个作品中完全看不到他们两人真正心灵上的交流,相聚在一起时总是沉沦于性爱之中,这不是所谓的爱情,仅仅是一种逃避现实的手段,一种只追求肉体感受的沉沦。</p>2015阶段性总结2015-06-04T00:00:00-06:002015-06-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-06-04:/words/Recently-2015-June/<p>最近几个月来的个人总结</p><p>过去的三个月其实过得是非常酸爽的,主要完成了两件事: </p>
<ol>
<li>完成了<a href="http://zhouyichu.com/words/GRE/">GRE考试</a>,这次彻底摆脱了GRE困扰。</li>
<li>投出了人生第一篇正式论文。 </li>
</ol>
<p>经过这两件事的洗礼,我也发现自己有着一些比较好的优点,但同时也暴露出了更多的不足之处,需要不断改进提高。</p>
<h1>Advantages</h1>
<p>首先,在这三个月中,我还是在自己身上发现了一些比较好的品质的,这么说虽然有些自恋,但是我还是觉得有必要记录一下,防止在以后的生活中,忘记了自己也曾克服过不少的困难.</p>
<ol>
<li>
<p>最主要的是面对压力的承受能力,由于这次是我二战GRE,而且同时又赶上了论文的deadline,两件事情时间上撞在了一起,有段时间白天过了2000多个单词,晚上又要写上个几个小时的代码。 面对高节奏的生活,最终坚持了下来,感觉很好。</p>
</li>
<li>
<p>身体挺不错. 尽管那段时间很紧迫,我放弃了很多原有的计划(包括练字、阅读、健身),但我始终没有放弃每天游泳1500的运动项目。自从游泳之后,我确实觉得身体素质比以前好多了。论文deadline的前一天晚上,我经历了人生第一次通宵工作,但是第二天的状态感觉还可以,并没有想象得那么严重,还照常参与了组内的讨论班。这一切得要归功于每天的有氧运动,每天坚持运动,虽然平时看不出来有什么用,但是关键时刻就能体现出好身体的作用了。</p>
</li>
<li>
<p>自我调节. 我记得在考GRE前一天,我自己的做了一套模拟题,结果只拿了311,比我一站GRE还要低,因为第一次考试的时候也是用模拟预测的,结果预测的非常准,因此这次预测只有311,当时整个人都不好了……后来一直告诫自己,一定要调整好心态<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,不管结果怎么样,我都需要直面面对。 后来,实际在现场考试的时候,我的心态总是处于波澜不惊的状态,我也分辨不出我下半场我到底拿到的是hard还是easy模式的,只是一题一题地往下做。
在通宵赶论文的时候,女票曾经问我,会不会觉得一个人通宵写论文苦逼,我的回答是:「<strong>别人人扭曲的眼光保持健康的激情。</strong>」我一直都很喜欢这句话,也一直按照这句话去做,认定了目标,就不再理会周遭的目光,一路走到底。</p>
</li>
</ol>
<h1>Disadvantages</h1>
<p>通过这两件事,暴露出的缺点是远远大于优点的,说明我还有很大的提高空间.</p>
<ol>
<li>
<p>科研基本功不扎实, 研究方法比较局限,对于需要解决的问题,没能进行充分的调研,导致展开研究工作的时候不能做到游刃有余。 这是基本的科研素质问题,在后续的研究工作中一定要注意这个问题。</p>
</li>
<li>
<p>思考方式依然是学生式的被动方式,总是沿着既定的路线往下走,而不是那种在黑暗中摸索的感觉。作为一个以后将从事科研工作人来说,我必须尽快摆脱这样的思维模式,成为一个会主动探索的科研工作者。</p>
</li>
<li>
<p>英文写作能力太差,尽管刚刚考完GRE,但是毕竟GRE的作文和真实的论文写作还是有很大差别的。我的初稿论文被老板反复的修改,充分暴露出了我的写作基本是非常不扎实的,需要多加练习。</p>
</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>深呼吸是个非常不错的调节方式 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>告别GRE2015-06-03T00:00:00-06:002015-06-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-06-03:/words/GRE/<p>前后一共战了两次,第一次用了五个月,只拿了315;第二次三个月,拿了326.</p><p>本篇文章只是对自己过去几个月GRE复习的总结,没有什么干货,仅仅是一种记录,一个对自己的交代。</p>
<h1>一战</h1>
<p>我的一战是从2014年7月开始的,正式考试是在12月7日考的,结果只考了315,无脸见江东父老啊! 当时就决定一定要二战。</p>
<p>当时7月份的时候,还报了一个GRE的培训班(具体就不说是哪个了,免得有打广告之嫌。),事实上,现在回过头来看,我认为唯一有价值的东西就是学到了很多作文的写作技巧,其他方面似乎并没有什么明显的作用。</p>
<p>第一次上GRE,最大的问题在于单词不过关,当时整本红宝书大概只过了2遍,就自以为基本掌握了,就不再碰单词了,花了大量的时间去做题目,刷完了整本的绿皮填空和陈圣元的填空.</p>
<h1>二战</h1>
<p>二站是从2015年3月开始的,5月的考试。全程大概也就三个月的时间,最终拿了326(161+165)。这次准备的时候是痛定思痛的,首先总结了上一次失败的原因,最大的问题还是单词量的问题,于是这次复习的时候花了大量的时间去准备单词,真正做题的时间就很少了,大概也就考前两周开始做一些题目,其他的时间都是在背单词.</p>
<p>第二次的复习,也不再使用红宝书作为单词本了,我是直接在淘宝上买了单词卡片,分成了25个Group,每个Group大约有250个单词,我每天按照group进行单词复习。</p>
<p>我觉得这样的方式比价适合我,首先卡片的方式能够打乱顺序,将记忆单词时上下其他单词的影响给滤掉。 其次可以方便的将每个Group中的单词分为两组,一组是已经熟记的了,另外一组是需要继续强化记忆的。除了使用单词卡片以外,我是基本按照「杨鹏17天搞定GRE单词」中的思想来安排背单词计划的,这本书确实值得学习,以前一直都不相信类似的书籍,但事实证明,它提出的思想还是有很用的,值得一看.</p>
<p>我记得背单词最痛苦的是一段时间是一天之内过了2000个左右的单词,那感觉真是非常的酸爽……</p>
<p>当然,我觉得我背单词进度还算是比较慢的了,我每天只有半天的时间花在了GRE上面,其他时间需要处理助教和组里的研究工作。有段时间,压力确实挺大的。</p>
<p>一旦掌握单词之后,不管是阅读还是填空就变得十分简单了。我真正的刷题时间也就最后的两周,作文方面基本没有准备,只写了一篇的Issue,两三篇的Argue,虽然最后只拿了3分,但是对于理工科来说应该是足够的了。</p>
<h1>总结</h1>
<p>GRE考试确实是一个体力活,不管考前的复习,还是考试现场。我一战的错误就是太轻视这个考试了,自以为英语水平还不错,就没有做到全力的复习,结果导致第一次的惨败。</p>
<p>其实,考完GRE,最大的收获不是单词量的增长,而是学会了如何在压力下生存,如何沉下心来做一些事情,自从高考之后,就再也没有这种「沉下来」的感觉了.</p>
<p>耐得住寂寞,才自有光华!</p>2015年4月书单2015-05-04T00:00:00-06:002015-05-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-05-04:/reading-list/Reading-List-2015-May/<p>2015年4月阅读书单</p><h1>Song of Ice and Fire: A Game of Thrones</h1>
<hr/>
<p>作者: George Raymond Richard Martin</p>
<p>这个月所有的阅读时间都是在看这本书,由于是英文版,所以看得很慢,到现在为止也只看了85%左右,后面还有5部,这真是路漫漫。。。。</p>Solution Report for LeetCode 32015-03-16T00:00:00-06:002015-03-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-03-16:/leetcode/LeetCode-3/<p>Repeated DNA Sequences, Number of 1 Bits, Reverse Bits</p><p>For future study abord, I decide to practise wiriting in English, starting from technical articles.</p>
<h1>Repeated DNA Sequences</h1>
<blockquote>
<p><strong>Problem</strong>: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". </p>
<p>When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.</p>
<p>Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.)</p>
<p>For example,</p>
<blockquote>
<p>Given <code>s ="AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"</code></p>
<p>Output: <code>["AAAAACCCCC", "CCCCCAAAAA"]</code></p>
</blockquote>
</blockquote>
<p>This problem can recognized as the string matching problem from the first look. The instinctive solution is to try every potional string pairs exhaustivity, but this should be very slow. There are <span class="math">\(N\)</span> length DNA, which means the potional substring is <span class="math">\(N-10\)</span>, as a result, there are going to be need <span class="math">\(10(N-10)^2\)</span> compares. It's <span class="math">\(O(n^2)\)</span> !</p>
<p>Actually, there are some other possbile solutions, which is quicker than the <span class="math">\(O(n^2)\)</span>. </p>
<p>Observing this problem carefully, we can find that there are only 4 different characters that needed to be compared. Why shouldn't we make a map, mapping the character to the binary code, then we can compare numbers instead of characters.</p>
<p>A <span class="math">\(10\)</span> length DNA sequence can be mapped into a integer and we only need to compare the integer.</p>
<p>More specifically, our maps are: <code>A=00</code>,<code>C=01</code>,<code>G=10</code> and <code>T=11</code>, and the substring <code>AAAAACCCCC</code> can be represented as <code>0101010101=341</code>. This will be much more convient for us to compare substrings.</p>
<p><strong>Mappings</strong> is the core idea for this problem and the rest is implementing:</p>
<pre><code>#!cpp
vector<string> findRepeatedDnaSequences(string s)
{
vector<string> reval;
unordered_set<int> tmp;
if(s.size() <= 10)
return reval;
unordered_set<int> container;
int i,j;
int num = init(s);
container.insert(num);
for(i = 1, j = 10; j < s.size(); ++i,++j)
{
num = num << 2;
num = num | map(s[j]);
num = num & 1048575;
if(container.find(num) != container.end() && tmp.find(num) == tmp.end())
{
reval.push_back(s.substr(i,10));
tmp.insert(num);
}
container.insert(num);
}
return reval;
}
int init(string s)
{
int reval = 0;
for(int i = 0;i < 10; ++i)
{
reval = reval << 2;
reval = reval | map(s[i]);
}
return reval;
}
int map(char DNA)
{
if (DNA == 'A')
return 0;
else if(DNA == 'C')
return 1;
else if(DNA == 'G')
return 2;
else if(DNA == 'T')
return 3;
else
return 0;
}
</code></pre>
<h1>Number of 1 Bits</h1>
<blockquote>
<p><strong>Problem</strong>: Write a function that takes an unsigned integer and returns the number of <code>1</code> bits it has (also known as the Hamming weight).</p>
<p>For example, the 32-bit integer <code>11</code> has binary representation <code>00000000000000000000000000001011</code>, so the function should return 3.)</p>
</blockquote>
<p>This should be easy, we only need to ues the shift operation to check out how many <code>1</code> in the given integer. We need 32 shifts at most.</p>
<p>The code is easy and short:</p>
<pre><code>#!cpp
int hammingWeight(uint32_t n) {
uint32_t m = n;
int count = 0;
while(m > 0)
{
count += (m & 1);
m = m >> 1;
}
return count;
}
</code></pre>
<h1>Reverse Bits</h1>
<blockquote>
<p><strong>Problem</strong>: Reverse bits of a given 32 bits unsigned integer.</p>
<p>For example</p>
<blockquote>
<p>Given input <code>43261596</code> (represented in binary as <code>00000010100101000001111010011100</code>), </p>
<p>return <code>964176192</code> (represented in binary as <code>00111001011110000010100101000000</code>).</p>
</blockquote>
</blockquote>
<p>This should be easy too. </p>
<p>Due to the fact that <code>X & 1 = X</code> and <code>X | 0 = X</code>, in which <code>X</code> can be both <code>0</code> and <code>1</code>.</p>
<p>We can use <code>X & 1 = X</code> to get the last bit of the given integer and use <code>X | 0 = X</code> to give the bit to new integer.</p>
<p>We use two different ways beacuse when we 'cut off'(using <code>X & 1 = X</code>) the last bit of given integer, we should make sure that other bits become <code>0</code>(<code>using X & 0 = 0</code>), and when we 'attach'(using <code>X | 0 = X</code>) the bit to the new integer, we also should make sure the other bits are uneffected(using <code>X | 0 = 0</code>).</p>
<p>The codes are following:</p>
<pre><code>#!cpp
uint32_t reverseBits(uint32_t n) {
uint32_t x = n;
uint32_t y = 0;
uint32_t t;
int i = 0;
while(true)
{
t = x & 1;
y = y | t;
i += 1;
if(i >= 32)
{
break;
}
x = x >> 1;
y = y << 1;
}
return y;
}
}
</code></pre>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>游泳时我在想什么2015-03-12T00:00:00-06:002015-03-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-03-12:/words/When-Swimming-What-Am-I-Thinking/<p>身体在游泳,思维的飘扬。</p><p>自从去年10月月办了游泳卡之后,基本上都坚持每天去游泳一个小时(不游的话实在太亏了),当游泳成为习惯的时候,游泳变成了一件非常令人愉悦的事情,既能放松大脑又能锻炼身体。</p>
<p>根据「<a href="http://en.wikipedia.org/wiki/The_Power_of_Habit">习惯的力量</a>」中所说,当我把游泳当成习惯的时候,身体会自动做出反应,因此游泳过程其实并不需要大脑的工作,身体会自动做出反应。在这个过程中,大脑就被解放了,游泳的过程并不需要大脑的参与。这部分活动变成了我的「<a href="http://baike.baidu.com/subview/3147362/11243901.htm">暗时间</a>」。</p>
<p>既然是「<a href="http://baike.baidu.com/subview/3147362/11243901.htm">暗时间</a>」,那就要好好利用,根据「<a href="http://book.douban.com/subject/1319820/">大脑使用说明书</a>」中的说法,运动和坐着敲代码调用的是完全不同的脑区,如果在运动的时候思考一些问题,就能同时调动不同的脑区,也许会从不一样的角度来得到灵感。</p>
<p>本文主要是为了记录一下这段时间我到底在思考哪些方面的内容。</p>
<h1>LeetCode算法题目</h1>
<p>这是在游泳时思考得最多的问题,在游泳的时候想出的解法也不止一种了,原来坐在书桌前怎么都想不出的题目,在游泳的时候,往往会产生不同的思路,这样的感觉很不错。但是,这里也有一些问题,游泳的时候没有任何纸笔,对于一些复杂的算法题,这完全是一种考验脑力的问题!所有的中间变量、算法流程都得靠大脑来记忆,有不小的难度。</p>
<h1>科研项目研究</h1>
<p>这是思考量比较少的方面,主要从不同的角度来思考手头的科研项目。当我端坐书桌前,面对一堆的实验数据,思维难免会进入思维死胡同,浪费大把时间在不会有结果的方向上。而当我在游泳的时候,感觉能从比较全面的角度思考手头的科研工作。</p>
<p>从游泳中找到灵感的体验也不是一次两次了。</p>
<h1>畅想未来</h1>
<p>在比较烦躁的时候,我会想象未来的我将会是什么样的。</p>
<p>想象一年后,我还会不会在南大,还会不会再这个游泳馆游泳?</p>
<p>想象五年后,我会在哪里,会在心仪的大学读博吗?是否已经找到了生命中的另一半?</p>
<p>其实这样的畅想是对未来的一种期盼,期望一个更好的未来。不过,通俗来说,也可以说是白日梦……</p>
<h1>自由飘散</h1>
<p>劳累的时候,我会什么都不想,或者说什么都想,任由思维发散,注意力关注的是游泳本身。</p>
<p>这样做在游完泳之后的感觉往往是最棒的,这等于是给了大脑「休息」的时间。其实,很多时候它不是需要休息本身,而是需要做一些其他的事情,切换不同的脑区,让不同的脑区休息。</p>2015年3月书单2015-03-09T00:00:00-06:002015-03-09T00:00:00-06:00Flyawaytag:zhouyichu.com,2015-03-09:/reading-list/Reading-List-2015-March/<p>2015年3月阅读书单</p><h1>闯关东</h1>
<p>作者: 高满堂,孙建业</p>
<p>我是先看了电视剧,然后再去阅读小说的,电视剧基本照搬了小说的所有情节。</p>
<p>小说充分展示了朱家两代人的闯关东历史,能够吸引人。电视剧中李幼斌扮演的朱开山是我非常喜欢的一个影视形象,可以说,整部小说的精华就在于朱开山的身上。</p>
<hr/>
<h1>Powerful Sleep</h1>
<p>作者: Kacper M. Postawski</p>
<p>这是一本专门讲睡眠的电子书,全书一共才69页,写得通俗易懂,值得一看。</p>
<p>首先,在这本书中提出我们应该关注的是睡眠的质量,而不是睡眠的数量的观点,正应了那句话,生时何需久睡,死后自会长眠。</p>
<p>根据书中所说,睡眠的过程其实是分为5个阶段的,前两个阶段属于浅层睡眠,中间两个阶段属于深度睡眠,最后一个阶段称为眼动阶段,也称为REM.在一次睡眠过程中,上述这五个阶段会循环发生很多次,可以用下图来表示:</p>
<p><img alt="Sleep Cycle" src="http://zhouyichu.com/images/SleepCycle.png"/></p>
<p>另外一个比较重要的概念是说,其实深度睡眠的时间是由身体的生物钟所控制的,而影响睡眠生物钟最大的因素就是体温的变化。人体的体温并不是固定的,是在38摄氏度上下波动的。当你体温略高时,你的状态就比较精神;而当你体温略低时,你就会昏昏欲睡。</p>
<p>书中对于改善睡眠质量优如下几点建议:</p>
<ol>
<li>
<p>多晒阳光。更多的阳光进入眼睛,会降低褪黑激素的分泌,从让你白天更加富有活力。因为褪黑激素是昼夜变化的信号量,它告诉身体应该睡觉了,安眠药中就含有褪黑激素。另外,多晒阳光有利于加大体温变化浮动,白天晚上体温变化的越大,睡眠效果越好。</p>
</li>
<li>
<p>锻炼,运动的过程也能够使得体温升高,同时锻炼心血管。</p>
</li>
<li>
<p>午睡,但是午睡控制在45分钟以内,为的是防止进入深度睡眠状态,如果从深度睡眠状态苏醒,你反而会觉得劳累无比。</p>
</li>
<li>
<p>保持规律的作息,让你的身体处于规律的周期中。</p>
</li>
<li>
<p>多喝水,拒绝咖啡、酒精、尼古丁。</p>
</li>
</ol>
<hr/>
<h1>习惯的力量</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Charles_Duhigg">Charles Duhigg</a></p>
<p>这本书主要讲了三个方面的习惯:个人的习惯,企业的习惯,社会的习惯。不过,其中我只关心的是关于个人习惯的论述,其核心思想就是,「暗示-惯常行为-奖励」 的行为模式。这本书的很大篇幅都是在讲那一两个案例,这让我觉得整本书都是缺乏说服力的,用仅有的几个例子就得出结论,不太能让我信服。</p>
<p>在写读后感的时候,才发现,原来传说中的「习惯的力量」是有两本不同的书的,另外一本「习惯的力量」是Jack D. Hodge所写,有空的时候,也可以找来看一下,也许这本才是我想要看的。</p>
<hr/>
<h1>断舍离:正能量翻倍的生活整理术</h1>
<p>作者: 川畑伸子</p>
<p>这是一本很短的书,一共就100多页,主要就是说明了「断舍离」的重要性。</p>
<p>所谓「断舍离」就是放弃那些累赘的事务,使得自己的生活处于那种很简洁的状态里,不需要背负那些不需要的东西。</p>
<p>正当写下这几句话的时候,我扫视了一下我的书桌,发现我的书桌是「脏乱差」的典型代表,各种论文、书籍、草稿纸,虽然用起来很方便,但不免给人一种很混乱的感觉。</p>
<p>这本书还是有一些指导意义的,「精练」生活,是我从这本书中获得的最大启发。</p>一蓑烟雨任平生2015-02-07T00:00:00-07:002015-02-07T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-02-07:/words/Time-Flowing/<p>莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。</p><blockquote>
<p>莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。</p>
<p>料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。</p>
</blockquote>
<p>今天在「<a href="http://www.jianshu.com/">简书</a>」的一篇文章里看到苏轼的一句词「一蓑烟雨任平生」,相当喜欢,虽然曾经背过、考过,但直到现如今才有一点点的体会。</p>
<p>人生一世,其实也就是在时间的烟雨中的漂泊一段而已,既然注定漂泊,何不好好享受漂泊的乐趣,何必纠结于名利权情,这些东西永远存在,而你却带不走。</p>
<p>并不是名利权情不重要,但是他们不应该是最重要的,方励在「<a href="http://v.youku.com/v_show/id_XNzg2MDQyNzYw.html">感谢你给我机会上场</a>」中也曾提到过,金钱只是一个附属品,不应该成为一个人追逐的目标。</p>
<p>谁都无法阻挡时间,时间的洪流推着你往前走,后人的名声总会有大过你,你的金钱总会变成别人的金钱,你手中的权力总有交出的那一天,你执着的感情总有消逝的那一刻;而你的经历是别人无法超越的,你的回忆是别人无法复制的,你对这个世界的感觉是独一无二的。这些对自己来说独一无二的记忆才是最重要的。</p>
<p>从这个角度说,我可能永远无法理解那些在家中藏有上亿现金的贪官是如何思考问题的,名利权情他们统统拥有,我非常好奇在他们弥留之际,他们会在想什么?仔细算一下一生贪了多少?</p>
<p>当人已老去,那时最大的财富是什么?不是金钱,不是权力,而是回忆,你的回忆可以告诉你,你是否度过了丰富的一生,又或只是在生活的牢笼中苦苦挣扎。</p>
<p>走出身边的牢笼,走出自己的小圈子,去看看那「一蓑烟雨」,将带给你怎样一种不同的体验。</p>
<p><img alt="Time FLowing" src="http://zhouyichu.com/images/time-flowing.jpg"/></p>2015年2月书单2015-02-06T00:00:00-07:002015-02-06T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-02-06:/reading-list/Reading-List-2015-Febuary/<p>2015年2月阅读书单</p><h1>双城记</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Charles_Dickens?oldformat=true">Charles Dickens</a></p>
<p>很早就想看看传说中的「双城记」是什么样的,阅读之后,感觉确实写得很精彩,在我阅读过的西方古典小说中是比较吸引我的一部了。</p>
<p>Dickens的笔触描绘了一副法国大革命的时代背景,我个人尤其喜欢小说的后半段,在革命爆发之后的各种细节描写。从这些细节中,其实也可以看出,Dickens对于自下而上的暴力式革命是持有保留态度的,其实这也是我阅读小说之后思考最多的一点。</p>
<p>后来上网查了一下,在中国2000多年的历史中,真正农民起义并且胜利的,其实也只有朱元璋一人而已,其他的朝代更替只是不同的贵族阶级之间的替换罢了。由此,就需要考虑自下而上推翻一切的革命是否是真有效的?毕竟文化的传承其实还是依靠中产阶级和贵族阶级的,处于社会的底层的人们,他们还在为生计而忙碌,不会思考更多形而上的东西。</p>
<hr/>
<h1>牛奶可乐经济学</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Robert_H._Frank">Robert H.Frank</a></p>
<p>这本书比较生动有趣,用一些实际的例子说明了基本的经济学原理,但是个人认为其实这本书并不适合于当成入门书籍来看,其中有很多经济学原理都是通过例子来说明,并没有经过提炼和抽象,让人觉得只是在看故事,而不是在学经济学。</p>
<p>比较好的方式应该是掌握了一定基础的经济学知识之后,再来看这本书,就能把很多理论上的规律结合到实际例子中,加深对经济学的理解。</p>
<hr/>
<h1>怒江之战</h1>
<p>作者: <a href="http://zh.wikipedia.org/zh-cn/%E5%8D%97%E6%B4%BE%E4%B8%89%E5%8F%94">南派三叔</a></p>
<p>这本小说是冲着三叔的大名才去看的,但是小说质量却令人大失所望,故事显得太过拖沓,转折生硬,全书大概只看了一半左右,就已经失去了继续阅读的兴趣。</p>LeetCode解题报告22015-01-30T00:00:00-07:002015-01-30T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-30:/leetcode/LeetCode-2/<p>本篇报告解决4个问题,分别为Factorial Trailing Zeroes, Majority Element, Maximum Gap和Largest Number</p><h1>Factorial Trailing Zeros</h1>
<blockquote>
<p>题目: Given an integer <span class="math">\(n\)</span>, return the number of trailing zeroes in <span class="math">\(n!\)</span>.</p>
<p>Note: Your solution should be in logarithmic time complexity.</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>题目的要求很简单,就是要求出<span class="math">\(n!\)</span>的末尾有多少个<span class="math">\(0\)</span>,且需要在<span class="math">\(log\)</span>时间内完成。</p>
<p>那么我们首先要分析一下,在什么情况下<span class="math">\(n!\)</span>的末尾会出现<span class="math">\(0\)</span>呢?简单想一下,只要出现<span class="math">\(5\)</span>的倍数的时候,就出现一个<span class="math">\(0\)</span>.(<span class="math">\(5\)</span>乘上任何一个偶数就能得到<span class="math">\(0\)</span>)</p>
<p>所以一个比较直接的想法是,只需要看一下<span class="math">\(1\)</span>到<span class="math">\(n\)</span>的范围内有多少是5的倍数就行。</p>
<p>但是这样真的行了吗?<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<p>有没有考虑过<span class="math">\(25,75,125\)</span>?</p>
<p>实际上,我们需要计数的不是<span class="math">\(5\)</span>的倍数,而是有多少<span class="math">\(5\)</span>这个因子,有很多数含有不止一个<span class="math">\(5\)</span>,比如<span class="math">\(25,75,125\)</span>等.</p>
<p>首先,<span class="math">\(n\div 5\)</span>能告诉我们有多少个<span class="math">\(5\)</span>的倍数,也即有多少个数是含有一个<span class="math">\(5\)</span>因子的.</p>
<p>而<span class="math">\(n\div 25\)</span>能告诉我们有多少个<span class="math">\(25\)</span>的倍数,也即有多少个数是含有两个<span class="math">\(5\)</span>因子的.</p>
<p>依次类推,不断除以<span class="math">\(5^i\)</span>,我们就能知道有多少个数是含有<span class="math">\(i\)</span>个<span class="math">\(5\)</span>因子的。</p>
<p>因此,剩下的工作就需要统计一共有多少个<span class="math">\(5\)</span>因子,这里需要注意的是,<span class="math">\(n\div 5\)</span>的时候,会把<span class="math">\(n\div 25\)</span>也统计进去,因此累加时不需要乘上系数的。</p>
<p>具体C++代码如下<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>:</p>
<pre><code>#!c
int trailingZeroes(int n)
{
int result = 0;
long i = 5;
for(i = 5; n / i > 0; i *= 5)
{
result += (n/i);
}
return result;
}
</code></pre>
<h1>Majority Element</h1>
<blockquote>
<p>题目:Given an array of size n, find the majority element. The majority element is the element that appears more than <span class="math">\(\lfloor n/2 \rfloor\)</span> times.</p>
<p>You may assume that the array is non-empty and the majority element always exist in the array.</p>
</blockquote>
<p>这题也是很简单,要你找到一个数组中的众数,并且保证众数是存在的。</p>
<p>基本思想其实和玩「连连看」很相似,只不过现在是不同的元素会被消掉,而不是相同的元素。由于众数的数目大于<span class="math">\(\lfloor \frac{n}{2} \rfloor\)</span>的,因此所有不同元素都被消掉之后,剩下的就一定是那个「众数」.</p>
<p>具体代码如下:</p>
<pre><code>#!c
int majorityElement(vector<int> &num)
{
int temp = num[0];
int i = 1;
int count = 1;
for(i = 1; i < num.size() - 1;++i)
{
if(temp != num[i])
{
count--;
if(count <= 0)
{
temp = num[i+1];
}
}
else
{
count++;
}
}
return temp;
}
</code></pre>
<h1>Maximum Gap</h1>
<blockquote>
<p>题目: Given an unsorted array, find the maximum difference between the successive elements in its sorted form.</p>
<p>Try to solve it in linear time/space.</p>
<p>Return 0 if the array contains less than 2 elements.</p>
<p>You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.</p>
</blockquote>
<p>这题相对来说会比较难一点,它给你一个乱序的数组,要求你输出这个数组在排好序的情况下,相邻元素之差的最大值,而且要在线性时间内完成。</p>
<p>由于有线性时间的约束,因此不可能先给数组进行排序,然后找出Maximum Gap.<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup></p>
<p>那我们就是要在不排序的情况下,找出最大间隔。</p>
<p>这道题可以借鉴桶排序的算法,如果我们能将各个元素放入到不同的桶中,且能够保证产生最大间隔的那两个元素会被分在不同的桶中,那么我们只需要比较相邻桶中的最大值和最小值就可以了。</p>
<p>关键就在于如何进行对元素进行分组(放入不同的桶中),我考虑到的是,可以把这些元素之间的平均间隔作为桶的大小,如此一来的话,最大间隔一定会大于平均间隔,因此产生最大间隔的两个元素必然会落到相邻的两个不同组中。</p>
<p>那么,如何计算平均间隔呢?这个就比较简单了,只需要找出整个输入数组的最大值和最小值,然后除以元素个数。</p>
<p>假设整个数组元素个数为<span class="math">\(n\)</span>,最大值和最小值为<span class="math">\(A\)</span>和<span class="math">\(B\)</span>,那么桶的大小为<span class="math">\(step = \lceil \frac{A-B}{n-1} \rceil\)</span>.</p>
<p>那么对于任何一个元素<span class="math">\(K\)</span>来说,它就属于第<span class="math">\(\frac{K-B}{step}\)</span>个桶。将所有元素都放入相应的桶之后,只需要计算相邻桶之间的间隔就可以了,具体来说就是前一个桶的最大值和后一个桶的最小值之间的差。</p>
<p>具体代码如下:</p>
<pre><code>#!c
int maximumGap(vector<int> &num)
{
if(num.size() < 2)
{
return 0;
}
int min = getMin(num) ;
int max = getMax(num);
int step = (max - min) / (num.size() - 1 );
if(step == 0)
{
step = 1;
}
vector<vector<int> > temp((max - min) / step + 1);
vector<vector<int> > table;
int i,j,index;
int delta = 0;
for(i = 0; i < num.size(); ++i)
{
index = (num[i] - min) / step;
temp[index].push_back(num[i]);
}
for(i = 0; i < temp.size(); ++i)
{
if(temp[i].size() != 0)
{
table.push_back(temp[i]);
}
}
for(i = 1; i < table.size(); ++i)
{
max = getMax(table[i-1]);
min = getMin(table[i]);
if(delta < (min - max) )
{
delta = min - max ;
}
}
return delta;
}
</code></pre>
<h1>Largest Number</h1>
<blockquote>
<p>题目:Given a list of non negative integers, arrange them such that they form the largest number.</p>
<p>For example, given <code>[3, 30, 34, 5, 9]</code>, the largest formed number is <code>9534330</code>.</p>
<p>Note: The result may be very large, so you need to return a string instead of an integer.]</p>
</blockquote>
<p>这题比较简单,其实就是一个字符串的比较,不需要多说什么,就是有些细节需要注意一下。代码如下:</p>
<pre><code>#!cpp
string largestNumber(vector<int> &num)
{
vector<string> strnum;
int i;
string reval;
for(i = 0; i < num.size(); ++i)
{
strnum.push_back(to_string(num[i]));
}
sort(strnum.begin(), strnum.end(), comp);
if(strnum[strnum.size()-1] == "0")
{
return "0";
}
for(i = strnum.size() - 1; i >= 0; i--)
{
reval += strnum[i];
}
return reval;
}
static bool comp(string &strA, string &strB)
{
if(strA + strB < strB + strA)
{
return true;
}
else
{
return false;
}
}
</code></pre>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>第一次做的时候就犯了这个错误....-_-! <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>原来是用Python,尽管都说语言不重要,算法才重要,但是做算法题还是觉得C++更好一些。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>基于比较的排序算法的最好结果是<span class="math">\(n\log n\)</span> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>生活不止眼前的苟且2015-01-28T00:00:00-07:002015-01-28T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-28:/words/Life-is-More-Than-Daily-Necessaries/<p>生活不止眼前的苟且,还有诗和远方。</p><blockquote>
<p>生活不止眼前的苟且,还有诗和远方.</p>
</blockquote>
<p>最近很喜欢这句话,这句话犹如雾中明灯,告诉我不要陷入琐碎生活的沼泽,永远怀揣希望。</p>
<h1>缘起</h1>
<p>前几天在RSS上看到一篇文章,标题是「爱人,是折中的选择」,有几段话,节录如下:</p>
<blockquote>
<p>我眼里的男人,那应该是上知天文,下知地理,知识渊博,无所不通。我不需要他分得清葱还是蒜,也不需要他知冷知热,沾染尘埃。他就应该十指不沾阳春水,躺在沙发上指点江山,坐而论道都怕他累着。</p>
<p>后来就一直奔着这样的男人而去,一猛子扎进去谁都劝不回。</p>
<p>女人成长起来飞快。</p>
<p>等我世界观人生观形成了,本事学个一星半点了,背一身房债了,儿子落地了,我就开始觉得累了。</p>
<p>剖腹产伤口没好就要出去挣钱,腰弯不下去还要喂奶换尿布,没人伸手的时候,多能论道都不仰慕了。</p>
<p>生活就这样把个小仙女变世俗了。还房贷,抱儿子,做晚饭,你随便挑一样!一屋不扫就滚蛋。</p>
</blockquote>
<p>作者最终的结论就是,暖男才是最好的选择。</p>
<p>这段话,让我思考了很久。</p>
<p>生活到最后真的只是柴米油盐吗?</p>
<p>一翻思考之后,我认为答案是否定的。</p>
<h1>暖男</h1>
<p>我一直不理解为何「暖男」一词会变得如此流行,但是从自身来说,我绝不愿做一个暖男。</p>
<p>首先,暖男能做的,那些有「才华」的人也能做,而且我相信真正优秀的男人,是「暖男」的一个超集。外能治国平天下,内能修身齐家。</p>
<p>很多人都梦想自己的另一半是白马王子/白雪公主,但是现实却往往让他们最终选择了「暖男/暖女」,为什么?我想主要的原因是<strong>因为你自己并不是白马王子/白雪公主!</strong></p>
<p>自己没有到达相应的高度,却祈求对方要「才子佳人」,必然是悲剧收场。</p>
<p>足够坚强的人,需要的是能够同等对话的人,而不是一个贴身照顾你的仆人。13年的法国片「阿黛尔的生活」中,阿黛尔全心全意的照顾艾玛,结果艾玛最后还是放弃了阿黛尔,为什么?因为阿黛尔无法理解艾玛,走不进她的世界,只能在她的世界之外,遥遥观望。</p>
<p>所以,想要自己的另一半是「优秀」,这段感情是长久的,首先把你自己的变得「优秀」,保持独立自主,两人之间是一种平等的关系。只有两个处于同一个level,前进方向相同的人,才有可能携手往前走。</p>
<p>就像之前我在<a href="http://zhouyichu.com/words/Balance/">内与外的平衡</a> 中所说的一样,只有提高了自己的「水平线」,成功自然就随之而来了,不管是事业还是爱情.</p>
<p>我的爱情观是,两个人相互扶持沿着同一方向往前走,亲密关系绝不是一个为另一个付出全部!(当然两人也需要相互磨合)</p>
<h1>柴米油盐</h1>
<p>还是那个话题,「生活的本质是否真的就是柴米油盐?」</p>
<p>很多年龄稍长的人都告诉我,好好学习,找个稳定的工作,成个家,立个业,剩下的就是柴米油盐了。</p>
<p>真的是这样吗?I don't think so.</p>
<p>「穷爸爸,富爸爸」一书中其实早就批判过这种思想了,这是一种完全被动的想法,是在被生活往前推着,而不是主动掌控生活。你努力工作,仅仅是为了那些付不完的账单,还不完的房贷.</p>
<p>生活中确实有多琐碎的事情,但,应该不止于「柴米油盐」,还有诗和远方.</p>
<p>琐碎的事情,做过就好,做完就忘记它,何必把精力浪费在琐碎的事情上呢?陷于柴米油盐只能让这些事情蒙蔽了你的双眼,让你觉得生活中似乎只剩下这些东西了。</p>
<p>生活中还有很多美好的事物,带着发现美的眼睛去生活,你就能发现「诗」;带着对未来的憧憬,你就能发现「远方」.</p>
<h1>远方</h1>
<p>「飞屋环游记」中的Carl年少时遇到了他的真爱Ellie,两人最终走到了一起,度过幸福的一生之后,年老的Carl突然发现,在剥去层层回忆之后,留存心底的竟然只是儿时的梦想(此时Ellie已经去世)。</p>
<p>尽管最后年老的Carl仍然放胆去实现自己年少时的梦想,但这毕竟只是一部电影,现实生活中有多少人在岁月蹉跎之后,只剩下对梦想的叹息与后悔?</p>
<p>之前看到过一个社会学家做的统计,结论是,其实大多数人在临终之前,最后悔的不是做错了什么,而是后悔那些没有去做的事情。</p>
<p>为什么会忘记最初的梦想呢?很大一个原因应该就是落入了「柴米油盐」这个黑洞,它不断吸走了你金钱、你的精力和你的时间。</p>
<p>尽管没有人能逃过「柴米油盐」,但可以选择你绕它而转,也可以选择忽视它。</p>
<p>我的生存之道:活在当下,心在远方。</p>
<h1>后记</h1>
<p>其实,我也只是坐而论道罢了,没有经历过撞南墙的过程,我并没有什么发言权。</p>
<p>但是一直以来,我一直按照自己的方式去生活,去感悟,去憧憬,这样没什么不好。</p>
<p>现在所说的,也只是我当下的想法,不过,我希望这样的想法能够一直保持下去。</p>
<p>当我临终的时候,我希望我可以告诉我的儿孙们,我一生不曾偏离自己最初的梦想,我度过了充实的一生。</p>
<p>我想,这将会是我最骄傲的事情。</p>「如何阅读一本书」笔记2015-01-25T00:00:00-07:002015-01-25T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-25:/reading-list/How-to-Read-A-Book/<p>「如何阅读一本书」的读书笔记</p><p>这本是应该很早就该完成的笔记,但是由于「如何阅读一本书」内容很多,需要慢慢整理,因此为这本书单独写一篇笔记来进行记录。</p>
<h1>写在最开始</h1>
<p>之前在「<a href="http://www.jianshu.com/">简书</a>」上看到一篇文章,狠狠地抨击「如何阅读一本书」这本书,中心思想就是我阅读一本书是出于自己的兴趣爱好,我喜欢读这本书,那自然会认真读,并不需要按照「如何阅读一本书」中 指导的方式进行阅读。另外,文中还有个观点是,书籍仅仅是一种信息的承载工具,同样的信息可以以其他的方式进行存储和传递。</p>
<p>上述的这些观点我不敢苟同。</p>
<p>首先,你喜欢一件事,不代表你就能完全掌握一件事,你仍然需要很多前人的知识经验来指导你。你喜欢的任何事是不可能无师自通的,还不是要通过向前人学习,向书本学习?另外,原书的作者也说了,他的这些方法并不适用于任何一本书,对于阅读不同的书籍,应该采用不通的方法。通俗小说有小说的阅读方法,专业书籍有专业书籍的阅读方法,何必一拍子拍死呢?</p>
<p>其次,书籍确实是一种信息的承载工具,但是它和其他承载方式的不同点在于,它的具体形式是文字,而不是图像、声音、视频,通过阅读文字,我们能够在脑海中自己构建出作者想要表达的意象,而这个构建过程又必然会引用我自己过去的经历、回忆,同时构建过程又会引起自身的思考。简单点来说,阅读的过程是一种「主动」的过程,你在阅读的同时也会思考;而其他形式,如果音频、视频等都是使你被动的接受,你只是跟随数据源呈现给你的东西,而不是在独立思考。</p>
<p>闲话完毕,下面开始笔记正文.</p>
<h1>阅读的层次</h1>
<p>首先,该书作者将阅读过程分为了4个层次,分别是</p>
<ul>
<li>基础阅读</li>
<li>检视阅读</li>
<li>分析阅读</li>
<li>主题阅读</li>
</ul>
<p>这四个不同的层次的阅读是相互嵌套的,阅读一本普通的书,只需要做到「基础阅读」和「检视阅读」就可以了,而「分析阅读」是用来进行深入理解的,比如阅读某一本你非常感兴趣的专业书籍,「主题阅读」是一个更大的范围,它的对象不是某一本书,而是某一个问题,针对这个问题,阅读不同书的不同章节,从而彻底掌握这个问题。</p>
<p>不同层次的阅读对应不通的阅读需求。</p>
<p>基础阅读的含义是最基本的阅读能力,也即你识字,只要能无障碍地阅读文字,就已经满足第一层次了,重点是剩下的三个层次。</p>
<h1>检视阅读</h1>
<p>第一步,在深入阅读一本书之前,其实有很多技巧可以用来理清一本书的基本信息,从而决定是否值得深入阅读,这些技巧包括:</p>
<ol>
<li>看书名页、序</li>
<li>研究目录</li>
<li>查阅索引</li>
<li>阅读出版者介绍</li>
<li>挑选感兴趣的章节或结尾阅读</li>
<li>随机阅读某几页(随机采样?)</li>
</ol>
<p>完成这些技巧的过程,作者称为是「略读」的过程,大略读一下这本书,看看这本书是否适合自己。</p>
<p>第二步,可以简单的从头到尾读完这本书,碰到不懂的地方不要停下来查询或思索,只是简单的阅读下去。在这个过程,你就可以知道这本书对你自己是否真的有所帮助。这个过程称为「粗读」.</p>
<p>在论述这个层次的阅读时,作者提出了一个概念,就是「有自我要求的读者」,他把阅读的过程看成是和书籍作者的一次交流,我们既要聆听,也要提出质疑,在阅读过程中不断提出问题,并试图解决。</p>
<p>阅读一本书,要提出的四个基本问题:</p>
<ol>
<li>这本书谈了什么</li>
<li>作者细部说了什么,怎么说的?找出主要的想法、声明和论点。</li>
<li>这本书说的有道理吗?全部有道理还是部分有道理?</li>
<li>这本书和我有什么关系?</li>
</ol>
<p>尤其最后一点,我觉得这是最重要的,我们不是为了读书而读书,我们是要获取某种我们不知道的信息,不曾想到的想法而去阅读,必须把阅读到的东西内聚为自己的东西,才能算是真正完成了阅读的过程。否则,你仅仅是记录下来了作者的「文字」,而不是其「思想」。</p>
<h1>分析阅读</h1>
<p>俗话说,不仅要「知其然」,更要「知其所以然」。「检视阅读」基本上就是「知其然」的境界,而「分析阅读」就是「知其所以然」的过程了。</p>
<p>在这个层次上,作者说明了非常多的各种技巧和方法,此处我不想逐一记录,这些东西都是可以RTFM的,不需要浪费时间在这个上面。下面只是谈谈我自己的看法。</p>
<p>首先,其实阅读的方式应该从整体到局部,作者在书中经常使用一个比喻,其实理解整本书的架构,就要比是理解了这本书的骨架,精读每一章节的细部,就像是在掌握骨架的基础上,为其增加血肉,使得这本书更加丰满,更加立体。</p>
<p>一种比较好的检验你是否真正理解书中内容的方式是,用你自己的话来表述作者想要表达的内容,只有能用自己语言表达出来的东西,才算是被你真正吸收消化了的。个人觉得最好的方式就是写博客了,尽管这几年已经没有多少人还在坚持写博客了,但我觉得这是记录自己的最好方式。这里的想法,和我的一位本科老师的想法很相近,他说:</p>
<blockquote>
<p>什么叫理解?理解就是你能把同一个事情用自己的语言表达出来,并且能让别人听得懂。</p>
</blockquote>
<h1>主题阅读</h1>
<p>这部分内容其实我们并没有仔细阅读,因为我认为这部分内容对我来说暂时还不够实用,我还有没有对某个问题进行大规模研究的需求,因此也没有太深入阅读这部分内容。</p>
<p>主题阅读的基本思想就是,综合多本书的观点来对某个问题进行分析,从而得到一个客观的、全面的结论。在这个过程中,我们不再是以书本为导向了,而是以问题为导向,阅读的单位也不是书本了,而是不同书籍的不同章节。</p>内与外的平衡2015-01-22T00:00:00-07:002015-01-22T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-22:/words/Balance/<p>面对失败,我们需要强大内心来支撑我们;而面对成功,其实我们也需要强大的内心来接受成功。</p><p>常常有人说,只有拥有强大的内心,才能在一次又一次失败的基础之上走向成功。这句话很对,但如果,没有强大的内心而直接获得成功了,那会怎么样呢?</p>
<p>这样的事情在过去也许并不常见,但是在这个信息化的时代,一切观念,一切基本规律都在发生颠覆,也许仅仅一瞬间,巨大的成功就砸到你头上了。然而,这样的成功并不是所有人都能消受地起的.</p>
<p>多大的成功就需要多强的内心来进行化解。</p>
<h1>内与外的平衡</h1>
<p>在你还没有足够强大的内心的时候,成功突然而至,未必是一件好事。</p>
<p>就像「天龙八部」中,扫地僧所说,少林72绝技每一绝技都必须要用相应的佛法进行化解,类比一下,任何一种成功都需要相应的内心境界与之相适配。</p>
<p>典型的例子就是娱乐圈中各种吸毒事件,其中最具代表性的就是<a href="http://baike.baidu.com/view/6390.htm">宁财神</a>了,通过一部「武林外传」迅速蹿红网络,被戴上了「中国第一代网络写手的领军人物」帽子。</p>
<p>然而,他的成功和他的内在是完全不匹配的,在「武林外传」之后,再也没有任何值得称赞的作品了。也没有面对现实的能力,面对压力,他最终走向了毒品。</p>
<p>事实上,我个人觉得宁财神的成功仅仅是一种巧合,或是一次幸运。就像王羲之醉酒后写出「兰亭集序」一样,这样的佳作是可遇不可求的,而很多人把这样的巧合当成自己的本身的才华所致。其实,一次成功,也许并不是你的才华所致,仅仅是一次比较好的运气而已<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<p>对于娱乐圈那群动不动吸个毒的人来说,主要问题就是来钱太快(不否认他们也曾经很努力),而工作之余没有任何比较好的娱乐项目,钱多而不知道怎么花,于是怎么堕落怎么来。其实这只需要四个字就能总结:「人傻钱多」</p>
<p>真正的大家,在获得一次两次成功之后是不为所动的,内心的强大让他们足以接受任何的失败,和任何的成功。</p>
<p>典型例子我想就是马云了,在阿里巴巴初期获得成功之后,他并没有「忘乎所以」,继续建立了淘宝、支付宝等拳头产品,为其商业帝国打下了基础。</p>
<h1>心如止水</h1>
<p>作为一个平凡的普通人,我想其实最重要的是保持「心如止水」境界。这里的「心如止水」并不是说对什么都无动于衷,而是一种能接受一切的心态。</p>
<p>大家应该都有过游湖的经历,你向湖中投入一块石头,湖面会根据石块的大小和力度产生相应的波纹,然后又逐渐复归平静,我觉得这就是最理想的境界了。<strong>任你外部世界八面玲珑,我内在世界一心安宁。</strong></p>
<p>如果能有如此的心态,还有什么失败你无法承受,还有什么成功你无法消受?</p>
<p>但是,要想达到如此的心态,真的是很难很难,大多数人一生都达不到。对于我来说,这样的状态只出现过一次。</p>
<p>小高考的时候,考试前一天胃溃疡第一次发作,都吐血了,第二天直接参加小高考。当时状态真是一种无法言说的状态,我一点压力都没有,仿佛小高考这四门对我来说就是轻而易举的。当时就一种感觉,我知道我自己能行,一种非常坦荡的心态,真是可以用「心如止水」的形容。可惜,这样的状态在之后所有的经历中再也没有出现过。</p>
<h1>拉高水平线</h1>
<p>成功就像是悬挂在空中的钩子,而内心的世界的境界就是你站立的水平面,水平面高的人,不需要奋力跳跃,就能轻易抓到钩子;而水平面低的人,在一次奋力一跃的时候,终于抓住了一个钩子,可是再难抓到下一个,当他摔下时,他的水平面又决定了他将会摔得多重。</p>
<p>要想获得成功的最好办法是,拉高自己的水平线,直至成功「轻而易举」。就像「三傻大闹宝莱坞」中所说的,「追求卓越,成功就会在不经意间追上你」.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>这里背后的思想是: 这个世界其实是由随机因素掌控的。相关观点详见「黑天鹅」一书。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>道法术器2015-01-15T00:00:00-07:002015-01-15T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-15:/words/Tao-Fa-Shu-Qi/<p>与世界交互的四种境界</p><p>写在开头:我其实是不了解国学的,这里的「道法术器」是结合我自己的生活体验得到的感悟,和中国传统文化中的「道法术器」未必是一致,请不要对号入座。</p>
<h1>道</h1>
<p>「道德经」中有一句流传最广的话,「道可道,非常道」(实际上应该是「道可道,非恒道」,详见<a href="http://zh.wikipedia.org/wiki/%E9%81%93#.E3.80.8A.E9.81.93.E5.BE.B7.E7.B6.93.E3.80.8B.E4.B8.AD.E7.9A.84.E3.80.8C.E9.81.93.E3.80.8D">Wiki</a> ),一直以来都无法理解这是什么意思,随着年岁的增长,从琐碎的生活渐渐摸索出了一些轨迹,我循迹而寻,渐渐体会到什么才是「道」.</p>
<p>本科时代,有一次寒假回家的时候,和高中时期的小伙伴一起聚餐,闲聊中发现一位原本高中很要强的同学竟然说在大学里挂科了,而且说得那么的轻松自如,一点都看不出焦虑感。当时,我就觉得十分感慨,当年的那股上进心去哪了?这是我第一次感到与小伙伴们产生了差异。</p>
<p>我记得刚入大学的时候,就有学长学姐说过,大学就是「必修课选逃,选修课必逃」,同时也有「只需要高中时代50%或更少的努力就能取得成功」的说法,然而,从我现在四年本科、1年半研究生的学习过程来看,学长学姐如此的告诫就是一种慢性下毒。大学的「努力」方式和高中时代的「努力」完全是两回事,不能够直接比较<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。他们之所以这样说,我想是因为他们依然把高中时代的习惯带入到了大学时代,并且一直保持到了他们毕业。然而,这种看待事物的方式往往是致命的。</p>
<p>读研的时候,一高中同学突然打电话我说,他回老家并且已经生女儿了。而我当时还是研一,还在为一些难缠的数学课绞尽脑汁,而他已经人父,人夫了。当时的我,感到特别震惊,我觉得自己的人生还没有充分展开,而有的小伙伴都已经成家立业了。</p>
<p>元旦回家,又是高中小伙伴的聚餐,只不过这次回家的只有我一个,他们都已经在家乡工作了。晚饭过后,我本想找个小咖啡馆坐坐,聊聊近来的生活状态,可是结果是我被他们带到了网吧,然后在网吧看他们玩了3个小时的游戏,其中有段时间我还睡着了!</p>
<p>这些不同的生活习惯和思维模式,让我好好思考了一下这其中的原因。一同上的高中,同样读的大学(本科学校其实都是差不多的水平),为什么毕业才一年多,差异就如此明显了。</p>
<p>其中最本质的原因,我想就是那个我曾经无法寻觅的「道」。按我现在的理解,所谓的「道」,就是你人生的终结目标,你对世界的看待方式,通俗一点说就是你的三观。你想要什么样的人生,就决定了你的「道」是什么。</p>
<p>用一个简单直接的例子来说明:</p>
<blockquote>
<p>亚历山大大帝增经拜访过<a href="http://zh.wikipedia.org/zh-cn/%E7%8A%AC%E5%84%92%E4%B8%BB%E7%BE%A9">犬儒主义</a>者<a href="http://zh.wikipedia.org/wiki/%E9%94%A1%E8%AF%BA%E6%99%AE%E7%9A%84%E7%AC%AC%E6%AC%A7%E6%A0%B9%E5%B0%BC">狄奥根尼</a>,问他想要什么恩赐;他回答说:“只要你别挡住我的太阳光”。据说亚历山大之后对随从说:“如果我不是亚历山大,我愿意做狄奥根尼。”</p>
</blockquote>
<p>这就是狄奥根尼的「道」!</p>
<p>绝大多数人在本科毕业之后就直接选择了工作,从他们的角度来说,这就是该工作的时候了,读书已经读了十几年了,不想再继续了。我这里毫无批判的意思,只是想说明他们的「道」和我的「道」有着很大的不同,所谓「道不同不相为谋」,正是如此!</p>
<p>尽管是这样,我们依然会是好朋友,但我想,我们交流的内容不会再涉及到更加抽象的精神领域,因为「道」的不同,已然没有共同谈论的基础。</p>
<p>而我的「道」已经在我另外的<a href="http://zhouyichu.com/words/why-PhD/">文章</a>和「<a href="http://zhouyichu.com/words/Models-for-Life/">为人生建模</a>」有所论述,不想再重复了。</p>
<p>需要说明的是,我这里没有任何鄙夷或不屑的色彩,只想说明一个人的人生轨迹、生活习惯完全是由其「道」所决定的。不同「道」的人可以相识,相熟,却无法相知。</p>
<h1>法</h1>
<p>法,其实就比较好理解了,就是普遍所说的「方法论」。</p>
<p>如果把人生看成一次渡河,我在此岸,而此生的目的就是到达彼岸<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,那么所谓的「法」就是过河方式的选择了,你可以选择直接游过去、找一座桥走过去、想办法绕过去等等各种方式。每一种方式都是一种不同的「法」,尽管路径不同(「法」),然目的相同(「道」)。</p>
<p>「法」的精髓在于,它是一种「模板」,是可以用来广泛传递和学习的,比如常见的<a href="http://zh.wikipedia.org/wiki/%E7%95%AA%E8%8C%84%E5%B7%A5%E4%BD%9C%E6%B3%95">番茄工作法</a>、<a href="http://zh.wikipedia.org/wiki/GTD">GTD工作法</a>等。</p>
<p>从柏拉图的学说的来看,其实「法」某种程度上类似于他所谓的「理型论」,存在着这样一套「完美」的方法,能够帮助你高效地解决你面对的问题。</p>
<h1>术</h1>
<p>而「术」其实就是「法」的具体实现了,比如传统的<a href="http://zh.wikipedia.org/wiki/%E7%95%AA%E8%8C%84%E5%B7%A5%E4%BD%9C%E6%B3%95">番茄工作法</a>中,一个定义的工作时间是25分钟,一个休息时间是5分钟,但是这种具体的规定并不适合每一个人,智者在具体运用这些「法」的时候,总会根据自己的实际情况,进行适当的修正,以符合自己的特殊情况。</p>
<p>从我们编程中面向对象的角度来说,「法」就是解决问题的<strong>类定义</strong>,而「术」就是具体的类的实例,真正发生作用的是<strong>类的实例</strong>,而不是<strong>类定义</strong>本身。</p>
<p>包括我们日常学习到的各种事物,在他们真正被你灵活运用之前,他们只是属于「理型世界」中的「法」,而不是你可以随时使用的「术」.</p>
<p>智者往往学习的是「法」,而实用的时候是结合自己实际情况的「术」.</p>
<p>倚天屠龙记中,张无忌临时抱佛脚学太极的时候,是越学越忘的,实际上他就是在学「法」,而不是学张三丰具体的「术」.一句话,就是「学其神,而不是学其形」</p>
<p>「术」和「法」是紧密相连的,往往在很多情况下,「法」必须通过「术」来进行表达,因此在实际情况中很难分清二者的界限在哪里,上面的举的例子都是非常简单,然,大千世界是如此的复杂,真正的界限该如何界定,着实不易.</p>
<h1>器</h1>
<p>「器」,其实也不需要多说了,就是具体实践时所使用的工具。俗话说,磨刀不误砍柴工,一个好的工具,不能完成你的目标,但能帮助你更快的实现目标。</p>
<p>比如在GTD的实践过程中,最原始的GTD中要求你使用多个文件夹来分类存放你的各种任务,然而这种实践方式既笨重又费时,于是相应的电子化工具应运而生,比如我常用的<a href="http://doit.im/cn/">Doit.im</a>,只需要使用这样一个工具就能完全避免维护各种各样的文件夹、备忘录,同时能够真正实践GTD的工作流程。</p>
<p>但是,需要切记的是,「器」只是一种工具而已,它只能锦上添花,而不能雪中送炭。如果太过依赖于工具,而忘记了最初的「道法术」的话,往往会陷入泥沼而不可自拔。</p>
<p>如果用航海过程来比喻的话,我觉得明确的目的地就是「道」,朝着目的地航行的过程就是「法」,具体航行路径就是「术」,而最终使用的船只类型就是「器」。</p>
<p>如果没有了「道法术」的指引,仅仅拥有前行的船只,那你也只能漫无目标地随波逐流,漂泊在广阔无垠的大海上,被大海吞没是迟早的事情。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>我想大家其实都能体会到其中的不同之处,这里就不再赘述了。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这种对世界、对生命的诠释方式其实就是一个人的「道」 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>专业素养2015-01-05T00:00:00-07:002015-01-05T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-05:/words/Professionalism/<p>即使专业技能稍逊,也要保持专业素养。</p><p>最近遇到了几件小事,让我好好地思考了一下,什么才是<strong>专业素养</strong>,它与你的<strong>专业技能</strong>无关,你的<strong>专业技能</strong>也许稍逊,但是一定要保持良好的<strong>专业素养</strong>.</p>
<p>最早引起我思考这件事的契机是在图书馆,当时我正在自习,旁边有一位图书馆的管理员正在整理书架上的书籍,这是管理员的本职工作,但由于书架都是金属制的,管理员在整理过程中不是很注意书籍摆放的轻重,总是发出很多噪声,当时我就觉得,先不管Ta整理的图书是否整齐,就看Ta整理的过程,我认为就是一种没有专业素养的体现。图书馆都是需要安静的,尽管你是图书馆的工作人员,你正在工作,但也需要轻拿轻放,不论你的专业技能如何,在专业素养上,我觉得Ta已经完败了。</p>
<p>另外一个例子是发生在我身上的,作为一个程序员,最痛苦的莫过于要维护别人的代码,且别人的代码是没有注释的。如此不幸的问题就被我遇到了,同组的同学也有好几个有如此的经历。一博士师兄写了一个比较非传统的程序,但是却没有写任何的注释和说明,导致组内其他同学都无法使用他写的工具,这着实让人蛋疼。其实这也是一种专业素养的体现,尽管他写的程序很牛逼,很高效,但是一段时间之后,由于没有文档,几乎没有人能够用这个工具(包括他自己),这和专业技能也是无关的,关键在于他的专业素养。</p>
<p>另外还有一个正例,之前一段时间我一直在咨询留学中介的相关信息,在我第二次打电话向某公司的顾问老师咨询的时候,我还没说明自己是谁,对方已经叫出了我的名字,而我打的是Ta的私人电话,这说明Ta已经将我录入了Ta的通讯录,这个细节其实让我很震惊,事实上这个中介公司我只去过一次,而这位顾问老师已经保存了我的号码,不管Ta的顾问资历怎么样,但至少Ta的专业素养已经打动了我。我记得当时刚好是圣诞节的晚上,打电话过程中明显能听到很吵的背景音乐,我想应该是在KTV里,挂了电话之后,Ta还给我发了短信,详细说明了一些细节问题。在这一点上,我觉得也体现了Ta的专业素养。换做是我,在下班时间玩的正High的时候,才不管你客户不客户的.</p>
<p>或许,有人会说,Ta是为了赚你的钱,当然要做到面面具到,但实际上这段时间我也接触了很多不同公司的顾问老师,一上来就能叫出我名字只遇到了这一次,专业素养可见一斑。</p>
<p>很多时候都是一些小事决定了别人对你的看法,人们常常说「细节决定成败」不是没有道理的,不管你在专业技能上有多么牛逼,缺乏基本的专业素养,在别人眼中你总是处于下风。</p>2015年1月书单2015-01-05T00:00:00-07:002015-01-05T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-05:/reading-list/Reading-List-2015-January/<p>2015年1月阅读书单</p><h1>尼罗河上的惨案</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Agatha_Christie">Agatha Christie</a></p>
<p>这又是一部阿加莎的短篇小说,一如既往的干练有力,很喜欢这样的文风。</p>
<hr/>
<h1>思维导图使用手册</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Tony_Buzan">Tony Buzan</a></p>
<p>这也是一本手册似的书,文本不长,但是很有启发。其中吸引我的主要有:</p>
<ol>
<li>大脑的潜力是巨大的,只是普通人不知道如何运用</li>
<li>记忆能力是可以锻炼的,根据记忆曲线图,书中给出具体的复习方式。</li>
<li>思维导图是模拟大脑的运作过程,大脑的思维不是呈线性的,而是一种发散性的结构,由一个中心点开始向四周发散。通过利用图像模拟大脑的过程,加强记忆力,提高创造力。</li>
<li>联想力=建立联系的能力</li>
</ol>
<p>书中强调,短期记忆变为长期记忆的关键在于复习,适当的复习计划,能够巩固对知识的记忆,将短期记转化为长期记忆。</p>
<p>短期记忆要变为长期记忆,需要经过5次复习过程,主要过程如下:</p>
<ol>
<li>学习结束之后立即复习一次</li>
<li>1天之后复习一次</li>
<li>1周之后复习一次</li>
<li>1个月之后复习一次</li>
<li>3-6个月复习一次</li>
</ol>
<p>上述的这些建议不是作者随意想出来的,而是经过实验证明的,比较有力的一个证据是记忆曲线图,如下图所示:</p>
<p><img alt="记忆曲线图" src="http://zhouyichu.com/images/memory_curve.png"/></p>
<p>虽然书中似乎把提高记忆力、增强创造力说得那么容易,实际上要想不断提高自己的「脑力」还是很有难度的,需要不断反复的练习。</p>
<hr/>
<h1>银河帝国1:基地</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a></p>
<p>这是一本久负盛名的小说,没花多少时间就阅读完了。Isaac Asimov架构出了一个很大的科幻框架,而实际上小说的主要内容和科幻没有什么关系<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,更多是讨论的社会的演变过程。</p>
<p>从开创「心理史学」开始,哈里·谢顿预测出了社会变迁的走势,预言了社会的大动乱,为了使得这段动荡的时期能从1万年缩短到1千年,为此他建立了「基地」计划,保存人类的文化和科技,希望在1千年之后人类恢复和平的发展。</p>
<p>如此宏观了的故事背景,决定了不可能对某个人物进行细致的描写,而实际上作者也是这样处理的.全书中是没有主角的,同时每一个人物的描写并不是很多,只是在关键的几个地方进行描述,更多是对整个历史走向的描写。</p>
<p>作者描绘的「心里史学」有两个重要的基本假设:</p>
<ol>
<li>作为研究对象的人类,总数必须达到足以用统计的方法来加以处理;</li>
<li>研究对象中必须没有人知晓本身已是心理史学的分析样本。即须保证研究对象的随机性和自发性</li>
</ol>
<p>但是,实际上,在作者的小说中,历史的走向却只是靠几个人处于关键位置的人来推动的。比如是塞佛·哈定提出并实践了将科技和宗教结合的方式来对四大王国进行控制,而70年后,又是由侯伯·马洛提出并实践了用经济手段对四大王国进行控制。似乎每一个关键的时间点,总会出现一个睿智的人,带领「基地」走向新的历史阶段。</p>
<p>面对历史的洪流,尽管个人是无法阻挡的,因此很多人认为个人的力量是微乎其微的,但其实不然,处于关键位置上的人其实对历史走向起了很重要的作用。比如中国近代史那动乱起伏的100多年间,如果当时的每一个决策者都能从大局出发,而不是自己的阶级、自己的利益出发来思考问题,中国也不会贫弱了那么多年。</p>
<p>尽管个人的随机因素不足以抵抗大潮流,但足以推迟,延缓其发生。随机因素对整个系统的影响力并不是通常想象得那么弱<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,但也不是强大到能阻挡潮流。</p>
<hr/>
<h1>一个陌生女人的来信</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Stefan_Zweig">Stefan Zweig</a></p>
<p>这其实是一本短篇小说集,这个集子中收录如下几篇Stefan Zweig的小说:</p>
<ul>
<li>一个陌生女人的来信</li>
<li>象棋的故事</li>
<li>马来狂人</li>
<li>女人和大地</li>
<li>夜色朦胧</li>
</ul>
<p>Stefan Zweig的风格是非常突出的,他非常擅于捕捉人物的心理,他每一篇故事都是非常简短的,但是却对人物的心理进行了非常细致的描写,阅读他的小说,就像是阅读一件做工非常精细的艺术品。</p>
<p>Stefan Zweig高超的写作手法非常令人钦佩的,似乎他能抓住任何一个转瞬即逝的心理状态,如此的写作风格我从未遇见过,让人惊叹,让人叹服。</p>
<p>但是, 如此的精细程度,反而让我觉得Stefan Zweig是一个「能工巧匠」,而不是一个从全局把握的作家。这就像一个专门进行算法实现的工程师未必就是一个很好的软件架构师,对于细节的精雕细琢地深入,必然导致缺失全局的眼光。</p>
<hr/>
<h1>尽管去做-无压工作的艺术</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/David_Allen_(author)">David Allen</a></p>
<p>虽然很早就知道并实践了「Get Things Done」的方法论,但是却一直没有读一读「Get Things Done」的原本出处,这次花了两周的时间,好好阅读了一些这一方法论的原版说明。</p>
<p>「Get Things Done」的基本思想就是解放你的大脑,将所有需要处理的事务放入一个逻辑系统中,利用这个逻辑系统来管理你的工作,而你的大脑只需要负责执行就行了。</p>
<p>这个过程,如果要类比的话,其实可以将大脑看成CPU和内存的结合体,它既需要处理「运算」又需要处理「记录」。而「Get Things Done」的原则就是将所有需要的记忆的东西都「写下来」,从大脑中除去这一步骤,使得大脑只剩下「运算」这一唯一的功能,释放出大量的「内存空间」进行计算,提高工作效率,减轻压力。</p>
<p>这其实是个非常好的方法论,就像操作系统中的虚拟内存技术<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>一样,用外部的工具来帮助我存储需要完成的任务。</p>
<p>在这本书中,David Allen提到了一个我认为非常好状态:「<strong>心静如水</strong>」的状态。</p>
<p>「<strong>心静如水</strong>」是一种理想的工作状态,在平静的水面中丢入一个物体,水面会根据丢入物体的大小和质量产生相应的波动,然后又复归于平静。其实,我们每个人的内心都需要这样的状态。某种程度上,这和国学中的「宠辱不惊」有异曲同工之妙。<strong>任你外部世界八面玲珑,我内心世界一心安宁。</strong></p>
<p>具体到实践中,David将这整个系统归结为5个步骤:</p>
<ol>
<li>搜集: 搜集一切引起我们注意力的事情</li>
<li>处理: 加工处理之后,确定它们的实质以及解决方案</li>
<li>组织: 组织整理得出结论</li>
<li>检查: 把它们列为我们行动的选择方案</li>
<li>行动: 具体实践每一条任务</li>
</ol>
<p>事实上,这里的五个步骤,每一步骤都可以进行展开,每一个步骤内还有很多多的原则和方法,但是我觉得这些并不是最重要的,重要的是GTD的核心思想和具体的流程。其实具体的流程,用如下的图就可以解释清楚:</p>
<p><img alt="Get Things Done" src="http://zhouyichu.com/images/GTD.png"/></p>
<hr/>
<h1>穷爸爸 富爸爸</h1>
<p>作者: <a href="http://en.wikipedia.org/wiki/Robert_Kiyosaki">Robert Kiyosaki</a></p>
<p>这是一本教你如何致富的书,书中的很多观点都是富有建设性的,总体来说还是一本值得一读的书。</p>
<p>自己读书过程中做的脑图:</p>
<p><img alt="穷爸爸富爸爸读书脑图" src="http://zhouyichu.com/images/rich_poor.png"/></p>
<p>全书一共用了六节课来说明作者金钱观:</p>
<h2>第一课</h2>
<p>书中一上来就提出了一个鲜明的观点: <strong>不要为金钱而工作</strong>.</p>
<p>书中多次反对「努力学习 -> 专业人才 -> 高薪工作」这样的模式,因为在这个过程中,你的很大一部分工作成果是被公司、政府所拿走,你只是一个比较高级的「工人」而已。</p>
<p>我们不应该「为金钱而工作,而是应该让金钱为我们工作」.</p>
<h2>第二课</h2>
<p>有两个概念是比较重要的:</p>
<ol>
<li>资产: 资产就是能够把钱放进你口袋的东西</li>
<li>负债: 负债就是把钱从你口袋里取走的东西</li>
</ol>
<p>这两个简洁的定义真是很精妙,很多人贷款买车、买房,他们以为他们获得了「资产」,实际上他们只是获得了「负债」,而「负债」会不断消耗他们的金钱!</p>
<p>书中对财富也有一个比较另类的定义: </p>
<blockquote>
<p>财富就是支持一个人生存多长时间的能力,或者说如果我今天停止工作,我还能活多久?</p>
</blockquote>
<p>这也是一个很有启发性的定义,如果你有很多的房贷、车贷,那么你只是一个处于金钱流中的一个中转站,你获得的金钱会一刻不停的奔流进银行,而你其实并没有获得多少。</p>
<h2>第三课</h2>
<p>真正懂得如何利用金钱的人,他们关注的是自己的资产,而不是自己的收入。</p>
<p>在阅读本书之前,我一直觉得我学习得到的专业知识、职业技能都是我的「资产」,然而,作者又对这一定义加以了限定:</p>
<p>真正有用的资产是<strong>不需要我到场就可以正常运作的业务,我拥有它们,但由别人经营和管理。如果我必须在那儿工作,那它就不是我的事业而是我的职业</strong></p>
<p>看了这个定义,有一种豁然开朗的感觉,原来这才是「钱生钱」的意义!</p>
<p>作者列举了几项真正的资产:</p>
<ol>
<li>不需要我到场就可以正常运作的业务,我拥有它们,但由别人经营和管理。如果我必须在那儿工作,那它就不是我的事业而是我的职业</li>
<li>股票</li>
<li>债券</li>
<li>共同基金</li>
<li>产生收入的房地产</li>
<li>票据(借据)</li>
<li>专利权</li>
<li>任何其他有价值、可产生收入或可能增值并且有很好的流通市场的东西)</li>
</ol>
<h2>第四课</h2>
<p>第四课详细说明财商的各个细节,也说明了税收和政府的机制。总结来说,财商需要四个方面的内容:</p>
<ol>
<li>会计</li>
<li>投资</li>
<li>了解市场</li>
<li>法律</li>
</ol>
<h2>第五课</h2>
<p>主要说明如何进行投资</p>
<h2>第六课</h2>
<p>回归强调最开始的观点,<strong>不要为金钱工作!</strong>看到机会就应该要大胆的去投资.书中还有一句话,我也觉得特别好: <strong>胜利意味着不害怕失败</strong></p>
<hr/>
<h1>写给大家看的设计书</h1>
<p>作者: Robin Williams </p>
<p>其实本来对这本书是很期待的,但是读过之后,虽然也有一些收获,但比想象中的还是差一些。不过,能把设计原则写成这样通俗易懂已经很不错了。</p>
<p>书中强调了设计过程中的4个基本原则:</p>
<ol>
<li>对比: 如果两个项不完全相同,就应当使之不同,而且应该是截然不同。</li>
<li>重复: 设计的某些方面需要在整个作品中重复。</li>
<li>对齐: 任何元素都不能在页面上随意安放,每一项都应该与页面上的某个内容存在某种视觉联系。</li>
<li>亲密性: 将相关的项组织在一起,移动这些项,使他们的物理位置相互靠近,这样一来,相关的项将被看作凝聚为一体的一个组,而不再是一堆彼此无关的片段。</li>
</ol>
<p>这应该是设计中最简单的四种原则了吧。</p>
<hr/>
<h1>SEO攻略:搜索引擎优化策略与实战案例详解</h1>
<p>作者: 杨帆</p>
<p>花了大概三天的时间,看了这本书,越往后看,越是觉得这本书没有任何有价值的信息,纯粹是水货的堆积,几乎没有什么干货。大概只看了二分之一,就决定不看了,不需要在这本书上浪费时间。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>至少我是这么认为的,书中描述的重点不是科技内容。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>具体相关的论述在「黑天鹅」一书中有说阐述。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>我发现我能把所有见到的、看到的都扯到CS上面来..... <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>2014年度总结2015-01-01T00:00:00-07:002015-01-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2015-01-01:/words/Summary-2014/<p>走过2014,留下了一些足迹,寻迹而索,总结一下。</p><h1>完成的课程</h1>
<p>由于研究生的学分还没有修完,因此2014的上半年还有很多课程需要去修,下面是上半年选修的一些课程,有些水水的,有些是值得一上的好课。</p>
<ol>
<li>
<p>数据库新技术</p>
<p>这完全是一门水课,老师的PPT又臭又长,最后复习的时候,几天之内看完了几百页的PPT,重点是我觉得丝毫没有学到任何新的东西。</p>
</li>
<li>
<p>形式语言与自动机</p>
<p>形式语言与自动机这门课还是很有意思的,虽然部分内容和「编译原理」中的内容是有重叠的,但是还是能学到很多不一样的东西。我就把其中的状态转移的思想用到了自己的研究工作中,效果还是不错的.</p>
</li>
<li>
<p>模式识别</p>
<p>这门课基本和「数据挖掘」着门课很类似,也是学习了一些具体的统计学习的模型,不过这门可以似乎更偏重于数学上的证明,总体来说很不错,能学到一些不一样的东西。</p>
</li>
<li>
<p>计算理论导引</p>
<p>只能说这门课以我的智商是无法继续的,一直觉得很奇怪,如此考验智商的课程竟然是专业必修课。</p>
</li>
<li>
<p>随机算法</p>
<p>整个一学期,我觉得这门课是最有意思的,虽然最终的考试我放弃了,我相信以我的智商,去了只能拉低我自己的平均成绩,所以我没有参加最后的考试。不过其他所有的课时我都有参加,确实学到了很多不同的东西,不同的数学方法,不同的思维方式,很多上课的内容,我已经写成博文放在博客上了,不过还有好几章的内容没能整理出来,智商不够用……</p>
</li>
</ol>
<h1>读书</h1>
<p>可以说,读书是我整个2014完整坚持下来的事情,每个月都有做好阅读记录,具体的书目:</p>
<ol>
<li>明朝那些事</li>
<li>上帝掷骰子吗?量子物理史话</li>
<li>野火集</li>
<li>黑天鹅</li>
<li>万历十五年</li>
<li>平凡的世界</li>
<li>重说中国近代史</li>
<li>达芬奇密码</li>
<li>墓笔记</li>
<li>神雕侠侣</li>
<li>倚天屠龙记</li>
<li>鬼吹灯</li>
<li>Harry Potter and the Philosohpher's Stone</li>
<li>此生未完成</li>
<li>三体三部曲</li>
<li>银河系英雄传说</li>
<li>麦田里的守望者</li>
<li>狼图腾</li>
<li>时间之墟</li>
<li>为奴十二年</li>
<li>极简欧洲史</li>
<li>黄金时代</li>
<li>大漠苍狼</li>
<li>ABC谋杀案</li>
<li>包法利夫人</li>
<li>东方列车谋杀案</li>
<li>大脑使用说明书</li>
</ol>
<p>总体上2014年看的书是比较杂的,有小说,有杂文,也有历史。</p>
<h1>写作</h1>
<p>虽然我觉得我自己其实没有什么写作才能,但是我却从没有放弃写作这件事,虽然没多少人看,但我依然在坚持,很多事情是没有原因的,仅仅是想做就做了。</p>
<p>关于技术类的博文,今年也是写了不少,包括各种数学模型、随机算法、矩阵论等,同时也写了十几篇非技术类的博文,尽管放在<a href="http://www.jianshu.com/">简书</a>上基本也是没人看的,但我依然选择继续,写作不是为了别人,而是为了我自己。</p>
<h1>成就</h1>
<p>一年忙碌下来,似乎也没有做成几件可以真正拿出手的东西,查看了一遍<a href="http://doit.im/cn/">Doit.im</a>上的任务记录,似乎真正完成的只有以下几件事:</p>
<ol>
<li>完成了所有研究生的课程,修满了学分</li>
<li>完成了一个树和图结构的可视化工具,具体的介绍在<a href="/work.html">这里</a></li>
<li>完成了GRE考试,虽然考试结果并不理想,但至少坚持了几个月,积攒了一些经验。</li>
<li>年初的时候从window转移到了Linux,暑假回家的时候又从Linux转到了Mac,基本完全放弃了windows了。</li>
</ol>
<h1>未完成</h1>
<ol>
<li>一直想写几个开源的项目,但是一直没能正式开始做,很多idea也被浪费了,被其他人捷足先登做出来了。</li>
<li>上半年的时候,一直在翻译<a href="http://kramdown.gettalong.org/syntax.html">Kramdown</a>的文法文档,但是这个文档非常长也非常细致,翻译了没多少,就坚持不下去了,一直扔在一边,没能继续下去。</li>
<li>JavaScript的学习一直处于「吊儿郎当」的状态,今天看看,后天看看,总是不能系统地学习。</li>
</ol>
<h1>总结</h1>
<p>之所以这一年总觉得「一无所成」,我觉得最重要的原因在于没能「聚焦」,从<a href="http://doit.im/cn/">Doit.im</a>上的历史存档中,可以清楚的看到这一年来,我的整个学习体系是非常混乱的,一会儿看看矩阵论、一会儿研究研究<a href="http://bottlepy.org/docs/dev/">bottle</a>,一会儿又去看看<a href="https://github.com/fxsjy/jieba">结巴</a>,虽然看得多,但是总是不够深入,不能坚持做到底。</p>
<p>但是,好的方面在于,在2014年年末的时候,我已经意识到了这个问题,开始有计划的规划我自己的学习生活,期待在新的2015能有所建树。</p>
<h1>展望</h1>
<p>新的一年需要新的气象,在2015年里,我决定开始有意识地进行<strong>个人系统管理</strong>,这里的<strong>个人系统管理</strong>其实包含了很多含义,最简单的理解,就是<strong>有系统有规划地进行生活</strong>,结束过去那种浑浑噩噩只能往前看一步的生活。主要体现在三个方面:</p>
<ul>
<li>个人目标管理</li>
<li>个人行动管理</li>
<li>个人知识管理</li>
</ul>
<p>这三个方面展开的话,每一个都是一个值得深入学习的领域,这里只是简单的做一下规划,具体的执行我还需要在实践中慢慢摸索。</p>算法导论学习笔记8-第十一章 散列表(0)2014-12-25T00:00:00-07:002014-12-25T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-12-25:/clrs/CLRS-8/<p>散列表的定义、机制和分析。</p><p>在很多应用场景中,我们都是需要一种动态的数据存储结构,用来存储数据,并且这样的数据结构能够采用字典的方式来访问,也即<strong>可以通过关键字访问其中的元素</strong>.而<strong>散列表(Hash)</strong>就是用来实现这样的字典操作的常用方式。一个字典结构,至少需要具有如下三个操作:</p>
<ul>
<li><code>INSERT</code>: 插入</li>
<li><code>SEARCH</code>: 查找</li>
<li><code>DELETE</code>: 删除</li>
</ul>
<p>最理想的情况下,上述三种操作都应该在常数时间内完成。</p>
<h1>直接寻址表</h1>
<p><strong>直接寻址表</strong>是最简单的一种的字典操作的实现方式,其实从我的理解上来看,它本质上就是一个数组,只不过字典的关键字恰好就是整型的数字,把关键字直接作为下标来使用。具体的过程可以用下图来表示:</p>
<p><img alt="Direct" src="http://zhouyichu.com/images/direct.png"/></p>
<p>其中,<span class="math">\(U\)</span>是关键字的全域,<span class="math">\(T\)</span>是一个数组,数组中存储的元素是一个指针,指向了卫星数据.这种实现方式非常的简单,而且<strong>插入</strong>,<strong>查找</strong>,<strong>删除</strong>这三种操作都是<span class="math">\(O(1)\)</span>的。</p>
<p>然而,从图中就可以看到,这样的实现方式有一个最大的问题,那就是会导致大量的<strong>空间被浪费</strong> :如果关键字的全域非常大,但真正被使用的关键字又非常少,而同时<span class="math">\(T\)</span>的大小又是由<span class="math">\(\vert U \vert\)</span>决定的,因此大量的空间没有被使用,造成了浪费。</p>
<h1>散列表</h1>
<p><a href="http://en.wikipedia.org/wiki/Hash_table">散列表</a>的基本思想就是使得<span class="math">\(T\)</span>的大小要远小于关键字全域<span class="math">\(U\)</span>,也即需要满足<span class="math">\(\vert T\vert \ll \vert U \vert\)</span>. 具体做法就是利用一个称为<a href="http://en.wikipedia.org/wiki/Hash_function">散列函数</a>的函数<span class="math">\(h\)</span>,将关键字<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup><span class="math">\(k\)</span>从全域<span class="math">\(U\)</span>映射到<a href="http://en.wikipedia.org/wiki/Hash_table">散列表</a>中,用符号来表示就是:</p>
<div class="math">$$
h: U \rightarrow \{0,1,\cdots,m-1\}
$$</div>
<p>其中,全域<span class="math">\(U\)</span>的大小为<span class="math">\(n\)</span>,而散列表<span class="math">\(T\)</span>的大小为<span class="math">\(m\)</span>,且<span class="math">\(m \ll n\)</span>.</p>
<p>如此的做法就可以极大的减少了需要存储的空间,从原来的<span class="math">\(n\)</span>降低到了<span class="math">\(m\)</span>,这个过程可以用下图来说明:</p>
<p><img alt="Direct" src="http://zhouyichu.com/images/direct1.png"/></p>
<p>但是,如此的做法会导致另外一个问题: <strong>两个不同的关键字会被映射到同一个位置上</strong>(如上图中红色圈出来的部分。)这种情况被称为是<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>。</p>
<p>根据<a href="http://en.wikipedia.org/wiki/Pigeonhole_principle">鸽巢原理</a>,这样的<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>是不可避免,必然会发生的。因此,对于这种情况,我们需要设计一种<strong>策略</strong>来处理这种发生<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>的情况。</p>
<p>处理<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>的情况一般有两个方面:</p>
<ol>
<li>设计巧妙的<a href="http://en.wikipedia.org/wiki/Hash_function">散列函数</a>,最大程度上减少发生<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>的次数。</li>
<li>当<a href="http://en.wikipedia.org/wiki/Collision">冲突</a>确实发生时,确定一种处理策略,专门用来处理冲突的情况。</li>
</ol>
<h1>总结</h1>
<p>根据上面的说明,其实我们就可以确定<strong>散列表</strong>的两大要素:</p>
<ol>
<li>一个好的<strong>散列函数</strong></li>
<li>一个<strong>冲突的解决方案</strong></li>
</ol>
<p>常见的散列函数有<strong>除法散列</strong>、<strong>乘法散列</strong>和<a href="http://en.wikipedia.org/wiki/Universal_hashing">全域散列</a>,常用的冲突解决方案是<a href="http://en.wikipedia.org/wiki/Hash_table#Separate_chaining">链接法</a>和<a href="http://en.wikipedia.org/wiki/Hash_table#Open_addressing">开放寻趾法</a>。</p>
<p>具体的散列函数和冲突解决方案会在后续的笔记中的陆续说明。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>需要注意的是,这里的关键字可以是任意类型的,不一定是整型的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>算法导论学习笔记7-第十章 基本数据结构2014-12-19T00:00:00-07:002014-12-19T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-12-19:/clrs/CLRS-7/<p>程序员基础之中的基础,就像九九乘法表</p><p>本章的内容非常简单,数据结构是程序员基础中的基础,虽然简单但一定要好好掌握。鉴于我已经在编程世界中摸爬滚打多年,此处的笔记不会做得太详细,只是讲之前自己遗漏的内容进行一下补全,详细的内容可以参看专门的数据结构书籍。</p>
<h1>栈</h1>
<p><strong>先进后出</strong>的结构,是最常用的一种数据结构,递归过程、函数调用等操作,全都依赖于这种栈结构。一个最简单的栈结构应该有如下四个操作:</p>
<ul>
<li><code>isEmpty()</code>: 判断当前栈中是否有元素</li>
<li><code>pop()</code>: 返回栈顶元素,并且弹出(删除)栈顶元素。</li>
<li><code>top()</code>: 返回栈顶元素,但是不弹出。</li>
<li><code>push(item)</code>: 栈中压入一个新元素item。</li>
</ul>
<p>通常来说,一个栈至少应该有两种异常情况:</p>
<ul>
<li><strong>上溢</strong>: 对空栈执行了<code>pop()</code>或<code>top()</code>操作.</li>
<li><strong>下溢</strong>: 对已经达到容量上限的栈继续执行<code>push(item)</code>操作。</li>
</ul>
<p>Python代码的简单实现如下:</p>
<pre><code>#!python
class Stack:
def __init__(self):
self.stack = []
def isEmpty(self):
return len(self.stack) <= 0:
def top(self):
if self.isEmpty() == True:
raise Exception('StackIsEmpty')
else:
x = self.stack[-1]
return x
def push(self,data):
self.stack.append(data)
def pop(self):
if self.isEmpty() == True:
raise Exception('StackIsEmpty')
else:
x = self.stack[-1]
self.stack = self.stack[:-1]
return x
def show(self):
'''
打印出栈中的数据
'''
print(self.stack)
def clear(self):
self.stack=[]
def __len__(self):
return len(self.stack)
</code></pre>
<h1>队列</h1>
<p>和<strong>栈</strong>结构对应的另外一种数据结构就是<strong>队列</strong>,它是一种<strong>先进先出</strong>的结构,这也是一种在实际编程过程中非常常用的数据结构。
它主要有三个操作:</p>
<ul>
<li><code>isEmpty()</code>: 判断当前队列中是否有元素.</li>
<li><code>enqueue(item)</code>: 将元素item推入队列.</li>
<li><code>dequeue()</code>: 返回队首元素,并且删除队首元素.</li>
</ul>
<p>同样的,一个队列至少应该有两种异常情况:</p>
<ul>
<li><strong>上溢</strong>: 对已经达到容量上限的队列继续执行<code>push(item)</code>操作。</li>
<li><strong>下溢</strong>: 对一个空队列执行<code>dequeue()</code>操作。</li>
</ul>
<p>Python代码的简单实现:</p>
<pre><code>#!python
class Queue:
def __init__(self):
self.queue = []
def __len__(self):
return len(self.queue)
def isEmpty(self):
if len(self.queue) <= 0:
return True
else:
return False
def enqueue(self,data):
self.queue.append(data)
def dequeue(self):
if self.isEmpty() == True:
raise Exception('QueueIsEmpty')
else:
x = self.queue[0]
self.queue = self.queue[1:]
return x
def show(self):
'''
打印出队列中的信息
'''
print(self.queue)
def clear(self):
self.queue=[]
</code></pre>
<h1>链表</h1>
<p>链表其实和数组是比较相似的,都是将元素进行顺序存储,唯一的不同点在于链表是不能随机访问的,要想访问某个元素,必须从链表头开始向后扫描,直到找到需要的元素。</p>
<p>它的优点在于<code>删除</code>和<code>插入</code>操作是可以在常数时间内完成的,而对于数组来说,它的<code>删除</code>和<code>插入</code>操作在最坏情况下是<span class="math">\(O(n)\)</span>代价的。</p>
<p>另外,需要注意的是,程序员面试过程中经常会问关于链表的题目,常见的问题有如下三个:</p>
<ol>
<li>如何判断一个链表中是否存在环</li>
<li>计算链表中环的长度</li>
<li>找到环的起始位置</li>
</ol>
<p>这三个问题连续的,其具体的分析和解答已经在我另外一篇<a href="http://zhouyichu.com/algorithm/Linked-List-Cycle/">博文</a>中有所论述,此处就不再多言了。</p>
<h1>树</h1>
<p><strong>树</strong>也是一种非常基本的数据结构,在整个计算机领域中有着广泛的应用,而且它的变种有很多,可以变得的非常复杂同时拥有非常好的性能,Linux系统的文件系统就是基于B+树这种数据结构的。</p>
<p>树结构其实可以讲的内容非常多,但是这里只是一个简单的笔记,我就不再深入了,相信随着阅读的深入,CLRS后面会有专门的讲解一些典型的树结构。</p>
<h1>后记</h1>
<p>曾今看到过一些牛人写的代码,他们把一些很复杂的算法寓于数据结构之中,一个复杂的算法被分解成一个又一个小对象,非常的优雅,可惜我的功力还不够,不能做到如此的游刃有余,只能继续默默努力了。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>关于读书2014-12-18T00:00:00-07:002014-12-18T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-12-18:/words/About-Readings/<p>最近连续看了几篇关于读书的文章,很有启发,谈谈自己对读书的理解。</p><p>最近在收藏的RSS上读到了好几篇关于读书的文章,觉得很有共鸣,同时我也想写写自己关于读书的的看法。</p>
<p>首先给出很有感触的关于读书的三篇文章:</p>
<ul>
<li>龙应台写给儿子的信:<a href="http://note.youdao.com/share/?id=fe00a762b38850f68a8d36b336834e23&type=note">为什么我要求你读书用功</a></li>
<li>左岸阅读:<a href="http://www.zreading.cn/archives/4670.html">写给仍然迷茫的小伙伴们</a></li>
<li>BeMyCEO:<a href="http://bemyceo.com/201412/1533.html">读书无用,但为什么还要读</a></li>
</ul>
<h1>读书是认识世界的一个窗口</h1>
<p>读书并不能带给你任何的现时的利益,它不能变成手中的金币、不能变成银行中的存款、不能变成餐盘中的面包也不能变成杯中的美酒,它是一种无形的积累,是一种能够潜移默化改变你的东西。</p>
<p>人认识世界主要有两个途径,一是「读书」,二是「实践」。这两者都是缺一不可的,缺失任何一方,都不足以在这个世界中的生存。</p>
<p>「实践」回报周期短、收益高,因此绝大多数人偏向于选择了「实践」,而「读书」因为回报周期长而被很多人忽视了,甚至导致了读书无用论甚嚣尘上,似乎每一个喜爱读书的人都是孔乙己。实际上,孔乙己是属于那些只「读书」而不「实践」的人,不能把他和真正喜爱读书并乐于实践的人混作一谈。</p>
<p>「读书」可以用窗口来进行比喻,比如一个不太读书的人,他只能站在一楼的窗口向外眺望,他看到的事物就是触手可及的事物,而平时经常读书的人,至少处于二楼以上的窗口,读书越多,思考越多,楼层就越高。大家应该都有那种从高处俯瞰一切的体验吧,登泰山而小天下,这就是读书的作用。它不能改变的环境、你的收入、你的「实践」,但它能让你以更加宏观的角度看待你周围的世界,让你的环境朝向更好的方向改变,让你的「实践」更有效率.</p>
<p>简单来说,读书能改变你的<strong>眼光</strong>,让你高屋建瓴的看待社会,抓住机遇。</p>
<h1>读书是跟上时代的关键</h1>
<p>现今的世界是一个信息爆炸的时代,这也暗示着,你在学校所学的技能,不用几年就能可能被淘汰。就我自己来说,我现在常用的编程语言、系统工具、操作系统都不是我在本科课程中可以学到的.</p>
<ul>
<li>我现在用Python为主要语言,而本科专业课上只会教授C\C++,Java等非常「基础」的语言;</li>
<li>我现在用Vim写代码,而本科的课程是却不会涉及到Vim的,甚至我相信很多大学教师都不一定了解如何使用Vim</li>
<li>我现在常用Linux,并且已经放弃windows很久了,而我记得我大一的《计算机导论》的课程上老师还在教授如何使用PPT、word.</li>
</ul>
<p>如此大的差距,我们该何去何从呢?最理想的方案就是不断学习,并且把新知识运用到实践中去.而我相信学习的主要途径就是「读书」.</p>算法导论学习笔记6-第九章 中位数和顺序统计量2014-12-17T00:00:00-07:002014-12-17T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-12-17:/clrs/CLRS-6/<p>算法导论第九章学习总结——中位数和顺序统计量</p><p>本章的核心问题是给定一个长度为<span class="math">\(n\)</span>的乱序序列,从中找出第<span class="math">\(k\)</span>小的元素.如果把这个问题特例化,令<span class="math">\(k=\lceil n/2 \rceil\)</span>那就是寻找中位数。其实,最基本的想法就是先对序列进行<strong>排序</strong>,然后在排好序的结果中取出第<span class="math">\(k\)</span>个元素。这不失为一种比较好的方法,但是需要知道的是,排序算法的下界是<span class="math">\(O(n\log n)\)</span>,而在很多情况下,我们希望能够得到更好的算法,本章就是讨论怎样在线性时间内解决这个问题的。</p>
<h1>随机化算法</h1>
<p>CLRS上的这一部分内容个人觉得写得并不好,不容易被人理解,虽然我原来就了解了这个算法的整个过程和证明,但是看CLRS还是觉得无法理解清楚。之前我写过另外一篇博文,专门用来说明如何使用随机算法来寻找中位数,整个过程其实是比较复杂,具体可以参看这篇<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithms-3/">文章</a> 中的<strong>问题举例</strong>一节。</p>
<h1>确定性算法</h1>
<p>个人觉得确定性算法的证明部分CLRS论述的不是很好,感觉有点由结果推原因,因此我重新整理了一下思路<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,重新说明一下。</p>
<p>首先来说明算法步骤:</p>
<hr/>
<p>Select算法:</p>
<p><strong>input</strong>: 一个包含了<span class="math">\(n\)</span>个数的集合<span class="math">\(A\)</span>和一个整数<span class="math">\(k\)</span>, <span class="math">\(1\le k \le n\)</span></p>
<p><strong>outpout</strong>: 元素<span class="math">\(x\in A\)</span>,且<span class="math">\(A\)</span>中恰好有<span class="math">\(k-1\)</span>个其他元素小于<span class="math">\(x\)</span></p>
<ol>
<li>将输入数组的<span class="math">\(n\)</span>个元素划分为<span class="math">\(\lceil \frac{n}{5} \rceil\)</span>组,每组有5个元素(最后一组除外,最后一组应该小于等于5个元素). <span class="math">\(O(n)\)</span></li>
<li>寻找这<span class="math">\(\lceil \frac{n}{5} \rceil\)</span>组中每一组的中位数,对每组中的5个元素进行排序,然后取出中位数。<span class="math">\(O(n)\)</span></li>
<li>对于第2步中找到的<span class="math">\(\lceil \frac{n}{5} \rceil\)</span>个中位数,递归调用Select算法以找到其中位数x. </li>
<li>将原来的数组<span class="math">\(A\)</span>重新按照中位数的中位数<span class="math">\(x\)</span>进行划分,所有小于等于<span class="math">\(x\)</span>的元素都放在<span class="math">\(x\)</span>的左侧,所有大于<span class="math">\(x\)</span>的元素都放在<span class="math">\(x\)</span>的右侧。令<span class="math">\(i\)</span>表示此时<span class="math">\(x\)</span>所处在下标位置。<span class="math">\(O(n)\)</span></li>
<li>如果<span class="math">\(i==k\)</span>,则返回<span class="math">\(x\)</span>.如果<span class="math">\(i < k\)</span>,则在<span class="math">\(x\)</span>右侧的高区递归查找第<span class="math">\(k-i\)</span>小的元素;如果<span class="math">\( i > k $,则在\)</span>x<span class="math">\(左侧的低区递归查找第\)</span>k$小的元素。</li>
</ol>
<hr/>
<p>每一个步骤需要花费的代价,我都在每一个步骤的最后标出来了,其中3、5步骤由于涉及到递归过程,需要额外分析。</p>
<p>首先,令<span class="math">\(T(n)\)</span>表示Select算法的最坏运行时间,那么第3步中花费的代价就是<span class="math">\(T(\lceil \frac{n}{5} \rceil)\)</span>,需要进一步分析的是第5步,我们需要分析,在第五步中最坏情况下有多少元素会被砍掉。</p>
<p>这可以从下图中看出:</p>
<p><img alt="Middle" src="http://zhouyichu.com/images/middle.png"/></p>
<p>阴影部分就是可以确定大于<span class="math">\(x\)</span>的元素,可以看到,除了<span class="math">\(x\)</span>自己所在的组和最后一个不满5个元素的那组外,至少有一半的分组中有3个元素大于<span class="math">\(x\)</span>,因此大于<span class="math">\(x\)</span>的元素个数<span class="math">\(N_{>x}\)</span>至少是:</p>
<div class="math">$$
N_{>x} \ge 3\big( \big\lceil \frac{1}{2} \lceil \frac{n}{5} \rceil \big\rceil - 2 \big) \ge \frac{3n}{10} - 6
$$</div>
<p>同理,小于<span class="math">\(x\)</span>的元素至少为<span class="math">\(N_{<x}\ge\frac{3n}{10} - 6\)</span>.</p>
<p>因此,每一次做第5步的时候,我们都会砍掉<span class="math">\(\frac{3n}{10} - 6\)</span>个元素,也即最多会有<span class="math">\(\frac{7n}{10} + 6\)</span>个元素会进入下一轮的递归,所以第5步的代价是<span class="math">\(T(\frac{7n}{10} + 6)\)</span></p>
<p>因此,我们可以列出递归式:</p>
<div class="math">$$
T(n) = T(\lceil \frac{n}{5} \rceil) + T(\frac{7n}{10} + 6) + O(n)
$$</div>
<p>现在我们就需要证明这个<span class="math">\(T(n)\)</span>是线性的, 即证明,存在正常数<span class="math">\(c\)</span>和<span class="math">\(n_0\)</span>,使得<span class="math">\(n\ge 0\)</span>,有<span class="math">\(T(n)\le cn\)</span>,这可以通过替换法来完成。</p>
<p>假设<span class="math">\(T(n)\)</span>是线性的,则当<span class="math">\(n\ge n_0\)</span>时,<span class="math">\(T(n)\le cn\)</span>,同时,每一轮算法中还需要花费<span class="math">\(O(n)\)</span>,因此我们还需要引入一个常量<span class="math">\(a\)</span>,用<span class="math">\(an\)</span>来表示<span class="math">\(O(n)\)</span>的上界。代入到递归式的右边,我们可以得到:</p>
<div class="math">$$
\begin{aligned}
T(n) &\le c\lceil \frac{n}{5} \rceil + c(\frac{7n}{10} + 6) + an \\
&\le c\frac{n}{5} + c + \frac{7}{10}nc + 6c + an \\
&= \frac{9}{10}nc + 7c + an \\
&= cn + (-\frac{1}{10}nc + 7c + an)
\end{aligned}
$$</div>
<p>如果<span class="math">\(T(n)\)</span>确实是线性的,那么:</p>
<div class="math">$$
\begin{aligned}
&-\frac{1}{10}nc + 7c + an \le 0 \\
\Rightarrow & (7-\frac{1}{10}n)c \le -an \\
\Rightarrow &
\begin{cases}
c \le \frac{-10an}{70-n} \quad n \le 70 \\
c \ge \frac{-10an}{70-n} \quad n > 70 \\
\end{cases}
\end{aligned}
$$</div>
<p>因此,我们可以取<span class="math">\(n_0 > 70 $,此时\)</span>c \ge \frac{-10an}{70-n} > 0<span class="math">\(,因此当\)</span>n>n_0=70<span class="math">\(时,存在正常数\)</span>c<span class="math">\(使得\)</span>T(n)<cn<span class="math">\(,因此,\)</span>T(n)$是线性的。</p>
<h1>代码实现</h1>
<pre><code>#!python
# !/usr/bin/env python3
# -*- coding:utf-8 -*-
#
# Author: Flyaway - flyaway1217@gmail.com
# Blog: zhouyichu.com
#
# Python release: 3.4.1
#
# Date: 2014-12-16 10:46:11
# Last modified: 2014-12-17 11:27:15
"""
The implement of the Select algorithm which find the kth small item from an unsorted array.
"""
def partition(arg_array,x):
array = arg_array[:]
index = array.index(x)
array[-1],array[index] = array[index],array[-1]
i = -1
for j in range(len(array)-1):
if array[j] < x:
i += 1
array[i],array[j] = array[j],array[i]
array[-1],array[i+1] = array[i+1],array[-1]
return array
def Select(arg_array,k):
array = arg_array[:]
# boundary condition
if len(array) == 1:
return array[0]
# 1. Split the groups
i = 0
groups = []
while i+5 < len(array):
groups.append(array[i:i+5])
i += 5
groups.append(array[i:])
#2. Sort each group
newarray= []
for group in groups:
newarray.append(sorted(group)[len(group)//2])
#3. find the middle of the middle number
x = Select(newarray,len(newarray)//2)
#4. Partition
array = partition(array,x)
index = array.index(x)
#print(array,end="\t")
#print("k=" + str(k),end="\t")
#print("x=" + str(x), end ="\t")
#print("index=" + str(index))
# 5.Recursion
if index == k:
return x
elif index > k:
return Select(array[:index],k)
else:
return Select(array[index+1:],k - index - 1)
if __name__ == "__main__":
#array = [4,5,6,-1,10,1,2,3]
array = [5,6,102,10,8,9,-109,4,10,5,6,-3,10,7,2,-5,3,1,0]
#print(partition(array,5))
for i in range(len(array)):
x = Select(array,i)
print(x == sorted(array)[i])
#print(Select(array,5))
#print(sorted(array)[5])
</code></pre>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实基本思路和CLRS差别不大。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年12月阅读书单2014-12-13T00:00:00-07:002014-12-13T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-12-13:/reading-list/Reading-List-2014-December/<p>2014年12月阅读书单</p><h1>ABC谋杀案</h1>
<p>作者: Agatha Christie </p>
<p>这是侦探小说女王的作品,第一次了解到阿加莎·克里斯蒂(Agatha Christie)是在看话剧「无人生还」的时候,当时被剧情所吸引,不免查了一下作者的信息。一查一下,才知道她是一个如此高产的作家,并且开创了现代侦探小说的「乡间别墅」流派。在多看上买了好几本她的侦探小说,打算好好看看。</p>
<p>「ABC谋杀案」其实并不复杂,但是情节比较紧凑连贯,一点都不拖沓,这一点我觉得要比「福尔摩斯系列」要更具可读性。在剧情安排上也比较严谨,我一向认为,一个好的侦探小说应该是一开始就将所有线索摆在读者眼前,从这些线索中就能推断出凶手是谁,而不是主角在最后从其他渠道获得一些前文没有说明的线索形成证据,如此的做法可以说是「耍赖」.而「ABC谋杀案」在这一点上处理的比较好,线索总是从已经陈述过的事实中推断出来。</p>
<hr/>
<h1>包法利夫人</h1>
<p>作者: Gustave Flaubert</p>
<p>看完这部小说的第一感觉就是:「它终于结束了!」</p>
<p>这种类型的小说真不符合我的口味,剧情上一点都没有能打动我的地方,夏尔的软弱让我厌恶,艾玛的愚昧无知让我讨厌,整部小说其实就是法国版的潘金莲与武大郎,只不过夏尔没有一个武松这样的弟弟。</p>
<p>但是,就是这样简单无趣的剧情却能引起了我情绪上的厌恶,这不得不多是福楼拜高超写作技艺的体现,果然不愧为大师!每一处细节都描写的那么到位,人物心理的描写也很细致,整部小说就像是雕像家手下的作品,每一处细节都发挥到了极致.</p>
<hr/>
<h1>东方列车谋杀案</h1>
<p>作者: Agatha Christie </p>
<p>再一次阅读克里斯蒂的作品,她的文字一如既往的干练,整部销售非常短,但是非常精致,每一处环节环环相扣,却没有现代网络小说那种局促;细节描写清晰到位,却没有古典小说那种拖沓冗余。阅读这本「东方列车谋杀案」就像是在阅读一段完美的代码,简单干练,情节又出人预料,实在是不可多得的佳作。</p>
<hr/>
<h1>大脑使用说明书</h1>
<p>作者: Tony Buzan</p>
<p>这本书非常短小,仅仅63页,其实书名起的很对,只是一本手册而已。</p>
<p>看完全书之后,我的理解是思维导图的基本思想就是把思维过程用图形来模拟,并且把它「实例化」,也即画下来!</p>
<hr/>
<p>思维导图最大的一个作用就是将所有和主题相关的想法全部集合在一个图结构中(其实是树结构),这样的好处非常明显,等于是扩展了大脑的「内存」空间。比如说,人们从事物A会联想到B,然后B又会联想到C,C又联想到D。但是,如果这个过程单纯发生在大脑中的话,除非是经过特别训练的人,我想正常人最多只能联想到C,为什么?因为人脑的「内存空间」是非常小的,当脑中存在三个概念(A,B,C)的时候,内存就不够用了,很难进行第三层的联想了。而思维导图的方式就是在最大程度上模拟联想链的前提下,将整个思维过程记下来,释放大脑的内存空间,然后继续联想。这个过程我个人觉得和操作系统中的虚拟内存机制非常相似。将内存中的数据(A,B,C)置换到硬盘(纸)上,然后提供新的空间给新的程序(由C到D的联想)使用。</p>
<h1>如何阅读一本书</h1>
<hr/>
<p>作者: Mortimer J.Adler/Charles Van Doren </p>
<p>本是一指导性的书籍,出版已经70余年了,但依然发挥着其巨大的影响力。书中的信息量可以说是非常大的,其中给出了很多关于阅读的指导性建议,个人觉得这是一本非常好的书,读一遍未必能完全掌握这本书的精髓,每隔一段时间都需要再读一遍这本书。</p>
<p>虽然在阅读过程中有做笔记,但是笔记的记录也是比较混乱的,需要另外抽时间进行整理,这里就不再给出详细的阅读笔记了,等之后抽时间整理之后,我会单独写成一片博文的。</p>2014年11月阅读书单2014-11-30T00:00:00-07:002014-11-30T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-11-30:/reading-list/Reading-List-2014-November/<p>2014年11月阅读书单</p><h1>黄金时代</h1>
<p>作者: 王小波</p>
<p>老实说,王小波的书,一大半我是没看懂的,没有足够的人生阅历,我想是很难读懂他的书的。</p>
<p>他给我的感觉就像是在写一部荒诞剧,并且其中的时间线比较跳跃,但是一点都不混乱,从来没有读不下去的感觉,这就是大师的功力。尽管我无法触及核心,但是依然能感受到他的功力,就像我的一位老师所说的,能够体会到作者的「内功」.</p>
<p>文中有几句话,我比较喜欢,摘录如下:</p>
<blockquote>
<p>寂寞就是可以做一切的自由,这是因为你做什么都没人知道,或者知道了也不理会。</p>
<p>寂寞纯如黑夜,甜蜜如糖,醇如酒。</p>
<p>人活着总要有个主题,使你魂梦系之。</p>
<p>人活在世上,就是为了忍受摧残。</p>
<p>放声大哭从一个梦境进入另一个梦境,这是每个人都有的奢望。</p>
<p>真实就是无法醒来。</p>
<p>死的气氛逼人,就如无穷的黑暗要把人吞噬。我恨渺小,无论做了什么,都是同样的渺小。</p>
<p>事实上,做个正经人,无非是挣死后塞入直肠的那块棉花。</p>
</blockquote>
<hr/>
<h1>大漠苍狼</h1>
<p>作者: 南派三叔</p>
<p>本来打算继续看王小波的书,已经买了他的全集电子书,一共十册。但是,最近正在准备GRE考试,马上就要考试了,再去阅读王小波那种很有深度的书,脑力已经不够用了,我需要的是比较轻松的,探险类的销售,于是三叔的「大漠苍狼」就成了首选。</p>
<p>这部小说比较短,几天就看完了,还是延续三叔一贯的风格,很多坑都需要读者自己去添。</p>
<p>渐渐发现了,三叔的风格其实也是很固定的,给人的感觉就是,首先有一个故事原本,然后他在这个故事原本之上盖上一层遮布,在这个遮布之上挖几个洞,把挖出的洞上漏出的东西写成文字,成为发表的小说。而真正故事的原本是什么样的,只能根据这些孔洞中漏出的信息进行复原,只能进行猜测,而永远不知道真正的原本是什么。从这个角度看来,三叔似乎真是开创了一种新的写作方式。</p>
<hr/>在路上2014-11-13T00:00:00-07:002014-11-13T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-11-13:/words/On-The-Way/<p>什么才是真正的在路上?身体or心灵?</p><p><strong>在路上</strong>,这个词被无数文艺青年引用了无数遍,然而,什么才是真正的在路上?这其实并不是一个那么确定的问题。</p>
<p>很多的文青只要是在旅行,就称自己是在<strong>在路上</strong>,在我看来<strong>在路上</strong>的意义远不止于此。<strong>在路上</strong>应该有一个重要的前提,那就是心中有一个明确的目标,这个目标不必是某个具体的东西,也许仅仅是一种状态,一种心灵的宁静。「在路上」的正确理解应该有两个方面,一是<strong>身体的在路上</strong>,二是<strong>心灵的在路上</strong>。</p>
<p>最近在看大冰的《他们最幸福》,书中的每一个人物都是在路上的,其中的大多数人都是为了追求一种心灵的宁静,离开世俗的喧嚣而选择了游走天涯,且吟且歌唱。他们是「在路上」的真正践行者,不管身体还是心灵,都是在路上。我很佩服他们,很羡慕他们,但是我知道我不会成为他们,大多数人都无法成为他们。</p>
<p>但是,这并不是说我们就不能像他们一样且吟且歌唱,有梦为马。</p>
<p>只要心中怀揣着目标,不管身在何处,是处于城市的喧嚣、乡间的恬静还是西藏的圣洁,这些其实都无所谓,重要的是你知道自己在路上,有一个「地方」你必须要到达。</p>
<p>大冰们用身体的旅行来践行心灵的「在路上」,但是我想这不是唯一的方式,实际上,我们也可以用内心的进步来诠释心灵的「在路上」。同样是在路上,区别仅仅在于表现的形式不同而已。当然,最好的组合就是身体和心灵同时在路上,就像大冰他们一样。</p>
<p>古人常说,读万卷书,行万里路,我想就是这个道理。</p>
<p>方式不同,面临的阻力也不尽相同。身体在路上不用多说,风餐露宿,形单影只,独行天下。而内心的进步就更容易受到世俗的侵蚀,世俗的诱惑太多了,金钱、权利、名利,一旦迷失其中就很难走出来。大冰们无疑是因为不想被淹没在世俗中,而毅然决然的选择了「在路上」。</p>
<p>真正做到大隐隐于市是何其的困难,因此更多的人选择了小隐隐于野,这就是为什么「在路上」会被大部分人认为是「身体在路上」,而忽略了「心灵在路上」这个重要的前提。</p>
<p>所以,那些自称全年有多少多少时间是在在路上的,其实他们连一步都没有向前迈出去;而那些端坐书房,全年无休的人也许早就神游天外,超脱于你我了。</p>
<p>如果不能让身体在路上,那就让心灵在在路上吧,每天进步一点点,在这个纷乱的世界中保持遗世独立的心态,寻找到自己的目标,让自己在「在路上」.</p>
<p><img alt="On The Way" src="http://zhouyichu.com/images/on-the-way.jpeg"/></p>火影完结之后2014-11-09T00:00:00-07:002014-11-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-11-09:/words/The-Complete-of-Naruto/<p>火影完结之后....</p><p>火影完结了。</p>
<p>我不是一个那么容易感伤的人,一个长达十五年的漫画终于完结了,对于现在的我来说,似乎没能引起太多的感伤。</p>
<p>想想过去是那么地沉醉于火影,似乎每周唯一的期待就是火影的更新。在高中时代,玩趣比较稀缺,仅有的一点期待就是每周的火影更新了。当时就和同学玩笑道,按照火影这更新速度,到我们大学毕业都不会完结。谁知现在大学刚毕业一年多,火影就这么完结了。</p>
<p>大学时的心境已经完全不同了,虽然依然每周去看一下火影的更新,但是已经没有了当年的那种激情了,仅仅是一种习惯,才会每周去看一下那十几页的黑白漫画。</p>
<p>激情过后,其实也就那样而已。</p>
<p>现在它完结了,看完最后一话的全彩,我google了一下,和我预想的一样,已经有人做好了全套的漫画打包了,我没有犹豫,直接就点了下载。虽然当年的激情已经不在了,但是它依旧留下了很多回忆,我依然会好好收藏它,就像其他大多数已经失去了激情,但是仍保有回忆的其他漫画一样,它会静静地躺在硬盘的某个角落,等待我某一天我再度去回味青春。</p>
<p>很多事就是这样,激情过后,其实剩不下什么,剩下的或许就是习惯和依赖,以及多年之后回首往事的回忆。</p>第100篇博文2014-11-07T00:00:00-07:002014-11-07T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-11-07:/words/The-Hundredth-Post/<p>不知不觉博客已经建立快2年了,这是第100篇博文,值得好好记录一下。</p><h1>玩博客的过程</h1>
<p>从2012年11月到现在,刚好2周年,断断续续写博客已经2年了,这是我第一次坚持这么长时间写博客。</p>
<p>但是要说起来,其实我很早就开始玩博客了,最早可以追溯到初中时代,当时刚好是博客流行的黄金时间,我也随大流玩起了博客。最早玩的是<a href="http://blog.sina.com.cn">新浪博客</a>,当时也就是赶个潮流,没坚持多久,博客就荒废了,现在我连用户名都记不得了。</p>
<p>后来,高中时代,玩过一阵Windows Live Spaces,写了一些影评和书评。可惜,后来也荒废了,2010年的时候微软直接关闭了Space服务,我也懒得做迁移,因此这个博客也就不了了之了,估计数据都找不回来了。</p>
<p>大二的时候,学着人家买了空间、买了域名架起了<a href="http://wordpress.org">wordpress</a>,这基本算是我的第一个技术型博客,运行了1年多吧,后来总觉得<a href="http://wordpress.org">wordpress</a>用的不爽,太臃肿了,各种主题、插件、版本兼容弄得我很不爽,一直想寻找一些轻量级的工具来代替<a href="http://wordpress.org">wordpress</a>。当年,维护这个博客的时候,同步把一些技术型博文发布到了CSDN的博客平台上。</p>
<p>再后来,大四的时候,发现了<a href="http://jekyllrb.com">Jekyll</a>,觉得这货非常迎合我的需要,于是坚决而果断的换到了<a href="http://jekyllrb.com">Jekyll</a>上,这就是现在的这个博客。</p>
<h1>当前的博客</h1>
<p>已经整整两年了,两年才写了100篇博文,算一下平均才一周写一篇,效率还真是低啊~</p>
<p>最早是打算把这个博客建成单纯的技术博客的,但是后来在<a href="http://www.jianshu.com">简书</a>上面看到了很多人都推崇千字文计划,感觉挺好,不仅可以锻炼写作能力,还能加深思想深度,写作的过程也是深入思考的过程。因此,我也开始写一些和技术无关的文章,这类文章我全部放在了<strong>words</strong>类别下面。千字文计划的核心是<strong>每天</strong>写1000字,但是对于我来说,我感觉做不到这样的速度,这倒不是因为我缺乏写作的灵感,主要是时间上难以安排,现在的日程已经排得很满了,很难每天挤出一两个小时来专心写作。于是,我决定变通一下,一周至少写两篇与技术无关的文章,这点强度,我应该还是能做到的。</p>
<p>其实,我觉得我自己一直以来都不欠缺写作的灵感,缺少的是写作的能力,写作的毅力。每当想写下些什么的时候,总是发现不知道该如何表达,不知道如何证明自己的论点,只能用非常直白的语言描述出来(比如这段文字)。出现这样的问题,我觉得主要是因为书看得太少,总是限定在自己的世界中,杨绛先生一句很著名的话就是:「你的问题在于书看太少,而想太多」。很是赞同这句话,看书太少的确会限制一个人的眼界.</p>
<p>为此,我也为自己建立了每月的读书计划,将每月看的书列举出来,做一些简要的记录。</p>
<p>在为<a href="http://zhouyichu.com/words/Models-for-Life/">人生建个模型</a>这篇博文中,我就说过,我追求的是不同领域的体验,因此从纯粹的技术领域转到写作领域,算是一次新的尝试吧。</p>为人生建个模型2014-11-03T00:00:00-07:002014-11-03T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-11-03:/words/Models-for-Life/<p>漫漫人生路,如果不知道该如何走下去,不如先给人生建个模吧。</p><p>作为一个混迹于学术和网络之间的理工科生,数学模型对我来说再熟悉不过了,以前就常常在想,我们是不是也可以对整个人生建模呢?这个问题在我脑海中徘徊了很久了,但依然没有什么结论性的模型,只有两个自我感觉挺符合自己品味的模型,记录下来,算是我现在对人生的态度。</p>
<p>首先,我想说的是,不同的人生阶段,对于人生应该有不同的期许与态度,下面的两个模型只代表此时此刻我对未来的人生期许与态度。</p>
<h1>球状模型</h1>
<p>这是我想到的第一个模型,我希望我的人生是饱满的,是立体的,从一个中心开始向四周无极发展,在立体空间中,这就变成了一个球。古希腊的毕达哥拉斯学派认为在立体图形中,球形是最美的,它体现了一种高度对称的美感。我也希望我的人生是像球形一样的,我不求在哪个具体的领域做出非凡的成就,只求能在有限的生命中,尝试不同的新领域,让自己的人生变得丰满,变得饱满,变得立体,变成一个球。</p>
<p>当然,这也不是说,所有的领域都是浅尝则止的,空间中的任何一个球,都是有其球心的,而我认为这个球心就可以看成是人生的主要追求方向,一个值得你为之奋斗终身的事业。这个事业并不一定是你的工作,而是一种单纯的喜欢,一种纯粹的追求,一种宁静的心态,从这个事业中你能获得极大的满足感与喜悦感,而毫不在乎这件事本身能否给你带来经济利益。</p>
<p>就像《三体》中的魏成一样,在寺庙中他找到了自己的“空”,他用这个"空"填满了他的整个人生,而这个“空”就是我的球状模型中的那个球心。</p>
<p>这个世界时如此的精彩,我想要体验不同的生活,因此,我必须从这个中心点出发,向四周扩展我的生活、向四周辐射我的生命力、向四周探索未知的领域。</p>
<p>最终,形成了我的第一个模型——球状模型。</p>
<h1>树状模型</h1>
<p>但是,上述这个球形模型感觉还是太粗糙,有着很多不完善的地方,主要有</p>
<ol>
<li>向四周发展这个概念太宽泛了,球在空间中的发散方向有无数个,而人生毕竟是有限,不可能真的做到体验所有领域。</li>
<li>人是生活在社会群体中的,需要和这个社会保持联系,而这个球状模型完全是从个人角度出发,完全忽略了和外界的交互。</li>
</ol>
<p>因此,继球状模型之后,我又想到了第二个模型——树状模型。</p>
<p>首先,需要明确一下,树有哪几个要素,我现在想到的有:</p>
<ol>
<li>树干,树的最重要的组成部分,是整棵树的“脊柱”。</li>
<li>分叉,各种各样分叉小树枝。</li>
<li>根部,远远不断地给树提供养料。</li>
</ol>
<p>这棵树的树干,其实就是球状模型中的那个球心,就是那个“空”,那个足以支撑你走过一生的事业。其次在主枝干以外,树会有很多的树枝树杈,这些树枝树枝就可以看成是你对其他不同领域的各种尝试与体验。每一个新的枝叉都代表着一次新领域的尝试,尝试越多、体验越多,树枝就越多,而整棵就越茂盛。而整个树的根部,就可以看成是你的家人、朋友,你从他们身上获取养分,逐渐成长。当然,在别人的模型中,你也是他们的根部。</p>
<p>而我渴望的人生就是能够长成一棵参天大树,一棵郁郁葱葱的参天大树,一棵枝繁叶茂郁郁葱葱的参天大树。</p>从游泳中学会的事2014-11-02T00:00:00-06:002014-11-02T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-11-02:/words/Learning-from-Swimming/<p>暑假学游泳,游着游着游出了一些感悟,写下来,以做记录。</p><h1>正确的方法</h1>
<p>其实这不是我第一次学游泳,当年高考毕业之后的暑假,也曾信誓旦旦地要学会游泳,结果除了玩了一个暑假的水,什么都没有学会。至今4、5年过去了,依然是个旱鸭子.于是乎今天夏天下定决心,一定要学会,为此请了一个教练,一对一的指导,不信学不会!</p>
<p>实际学习的过程却出乎预料的顺利,我大概第三次的时候就能够自己游起来了,这确实印证了一个基本道理:<strong>方法很重要!</strong> 当年,我基本是在玩水,虽然也很努力地模仿别人的动作,但总是不得要领;而现在教练现场将动作一个一个拆解出来,一个一个地练,然后再组合起来,一下子就能自己游起来了。</p>
<p>常常说,条条大路通罗马,话是不错,但是并不是每一条大路都是直的,有的路像盘山公路,九曲十八弯,有的路就像高速公路,专线转达。</p>
<p>要完成一件事,正确的方法能极大地提高效率!</p>
<h1>基础很重要</h1>
<p>之前说到过,今年学游泳的过程异常轻松简单,第一天学蹬腿,第二天学手臂动作和换气,第三天直接游起来了!为什么会这样呢?我想主要是因为教练把动作分解出来了,一个一个单独练习,然后再组合起来。类似<a href="http://zhouyichu.com/clrs/CLRS-2/">分治算法</a> ,把一个大问题分解成小问题,然后逐个解决,最终组合起来,得到原问题的解。</p>
<p>这个过程中,基础是很重要的,只有基础扎实了,做起其他事情来才能游刃有余。比如我在练蹬腿的时候,其实我的动作一直都不是很标准的,当时还不以为意。后来在学校游泳馆游泳的时候,发现其他动作标准的人游起来特别轻松,一下子就能游个来回,虽然我也能游个来回,但是速度明显慢很多,还特累。这主要是因为我腿部的动作不是很标准,因此游起来特别费力。这就是我之前练基本功的时候没有练到位的结果。</p>
<p>俗话说的不错,磨刀不误砍柴工,基础扎实了,才能做好事情。</p>
<h1>把握节奏</h1>
<p>在游泳过程中,其实很重要的一点就是要把握好自己的节奏,不能慌乱,要用身体去感觉,这里面的感觉只可意会不可言传。其实,做任何事情都是有节奏的,甚至于平时的走路都是有节奏的,只是我们通常意识不到而已。</p>
<p>在追逐目标的过程之中,节奏是很重要的,当年小高考的时候,我完全是按照自己的节奏来进行复习的,而不是跟随老师的步伐,当年的高考政策一变再变,学校都有点措手不及,我们班不停的换老师,没办法,我只能自己制定复习计划。不管学校老师的计划是如何,我都坚定不移地按照自己的节奏来复习,结果考出来的效果非常好。当时,我就得出结论,每一个人的节奏是不一样的,只要找准了自己的节奏,就要坚定的坚持下去。</p>
<p>记得《倚天屠龙记》中的《九阳神功》中有这样一句话:"他强由他强,清风拂山冈。他横任他横,明月照大江。"某种程度上,我想金庸就是在讲把握自己节奏的重要性,而不管其它人怎么样.</p>2014年10月阅读书单2014-11-01T00:00:00-06:002014-11-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-11-01:/reading-list/Reading-List-2014-October/<p>2014年10月阅读书单</p><h1>狼图腾</h1>
<p>作者: 姜戎</p>
<p>这本书的大部分内容都是动车上看完的,在十一川西之行的路上连带看完了,其中关于狼性精神的分析,确实让我感触良多。</p>
<p>第一次读到作者对于中国农耕社会历史的分析的时候,确实觉得十分有道理,但是之后仔细琢磨之后,并不能完全同意作者的观点。任何一段历史,必然是各种因素相互纠缠在一起而最终导致的,而不是仅仅因为一个原因就决定了历史的走向。中华文明的历史走向,绝不仅仅是所谓的"狼性血液的输送"过程,而是各种历史因素相互纠缠的结果。</p>
<p>整篇小说读下来,可以深深感到作者对于草原是抱着极大的憧憬,甚至可以说是一种信仰。作者在小说中就曾经提到过:</p>
<blockquote>
<p>草原和自然是大命,而剩下的都是小命</p>
</blockquote>
<p>其实,我觉得在人生路上,也需要像狼一样,具有狼性精神,不能满足于现状。在一个地方、一个位置呆久了,人就会变得渐渐麻木了,失去“野性”的感觉。以前觉得年轻人是不能安于现状的,但是现在觉得即使是上了年纪,也能不断尝试新事物,不断开拓进取,寻找新的快乐。</p>
<p>狼性精神对于人生来说,并不是说一定要虐待自己的身体,走遍山川,越是困难的事情越要去完成。所谓的人生的狼性,我认为是要不断尝试新事物,汲取新的思想,和新的人讨论,让人生变得立体。</p>
<p>撇开对于狼性精神的讨论,作者对于草原、蒙古的细腻刻画也是令人赞叹的,很大程度上我就被作者所谓描绘的蒙古风情所吸引。</p>
<hr/>
<h1>时间之墟</h1>
<p>作者: 宝树</p>
<p>之前看过宝树的另一本小说,<三体X>,是对大刘的<三体>系列的一个续写。读完这两本小说之后,很明显地可以感到这两部小说之间内在的联系,都提到了"意识流"的概念,以一种超越感官的方式进行信息的交流。</p>
<p>总体来说,宝树的作品给我的感觉还是不够扎实,按照科幻迷的角度来说,就是"不够硬"。感觉这样的科幻作品的基础是软的,是随时可以崩坏的。相对而言,<三体>系列就给人非常坚实的感觉,是一部非常"硬"的科幻小说。</p>
<hr/>
<h1>为奴十二年</h1>
<p>作者: 所罗门·诺瑟普</p>
<p>我不知道这本书能否被称为是小说,更贴切的,应该是被称为是自传吧。这本书描写的是19世纪美国北方的一个自由黑人被人绑架拐卖到南方成为一个黑奴,在经历12年的努力生涯之后最终回到北方的故事。这本书在1853就出版了,但并不是很有名。这本书在去年被拍成了同名电影,并且获得了第86届奥斯卡最佳影片奖,而小说也因此而再度流行起来了。</p>
<p>我是先看了电影,再看小说的,总的来说,电影比较真实地还原了小说描写的故事。</p>
<p>也许是因为中国近代以来并没有出现过奴隶制度,我本身对于奴隶制度的认知并没有那么深刻,因此这本书对我的触动不是很大,但是这本书确实非常真实地刻画了那一段黑暗的黑奴制度,让我这样个一个后来者得以比较客观地看到那一段历史。</p>
<hr/>
<h1>极简欧洲史</h1>
<p>作者: (澳)约翰·赫斯特</p>
<p>这本书确实是真正的极简的,从头到尾都没有涉及到任务具体的历史事件,而是从宏观的角度回顾了欧洲的发展,并且是从各个不同的角度回顾的,来来回回过了好几遍。</p>
<p>作者从各个角度分析了欧洲的发展过程,欧洲的理性来源于希腊文化,神性则来自罗马。欧洲的发展过程和宗教的发展紧密联系的,整个中世纪就是国王与教皇争夺权力的斗争史。</p>
<p>作者同时也分析了,为什么欧洲从没形成过像中国一样的统一国家,最重要的原因在于在欧洲,土地从来都是私有化的,即使你是国王,你也无权侵占他人的土地,欧洲的私有化概念源远流长,而相对于中国来说,皇帝拥有一切,普天之下,莫非王土;率土之滨,莫非王臣。民从来没有真正拥有过土地,中国的集权程度远远高于欧洲。我想这就是东西方文化最重要的一个区别.</p>
<hr/>算法导论学习笔记5-第八章 线性时间排序2014-10-22T00:00:00-06:002014-10-22T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-10-22:/clrs/CLRS-5/<p>算法导论第八章学习总结——线性时间排序</p><h1>决策树模型</h1>
<p>之前提到过的<a href="http://zhouyichu.com/clrs/CLRS-2/">归并排序</a>,<a href="http://zhouyichu.com/clrs/CLRS-3/">堆排序</a>,<a href="http://zhouyichu.com/clrs/CLRS-4/">快速排序</a> 都是基于比较的排序,也就是说排序的基本操作就是两两比较两个元素的大小,从而确定元素的大小。这样的排序方法其实可以用一种称为<strong>决策树</strong> 的模型来分析。注意,这里的<strong>决策树模型</strong> 和机器学习中的<a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/">决策树模型</a> 并不是同一个概念。</p>
<p>假设给定一个待排序的序列<span class="math">\(R=<a_1,a_2,\cdots,a_n >\)</span>,那么对于每一个这样的序列,我们总能给出其相应的决策树模型.这里的决策树模型,是一颗完全二叉树,树上的任何一个非叶结点都表示元素之间中的一次比较,叶结点表示一个这个序列可能的一种排序。对于<span class="math">\(R=<1,2,3>\)</span>这个序列来说,它的决策树模型如下图所示:</p>
<p><img alt="决策树" src="http://zhouyichu.com/images/decision-tree.png"/></p>
<p>每一个结点中的数字<span class="math">\(i:j\)</span>表示当前比较的元素是<span class="math">\(R[i]\)</span>和<span class="math">\(R[j]\)</span>,如果比较结果是小于,则下一步走向左子树;如果是大于,则走向右子树。这样不断比较下去,最终达到叶结点,形成一种可能的排列。</p>
<p>对于一个长度为<span class="math">\(n\)</span>的序列来说,它可能的所有排列的情况有<span class="math">\(n!\)</span>,因此它的叶结点数就是<span class="math">\(n!\)</span>,在上述这个例子中就是<span class="math">\(3!=6\)</span>个叶结点。</p>
<p>很自然,基于<strong>比较</strong>的排序算法就是从根结点开始找到到达目标叶结点的一条路径。</p>
<p>由于一棵决策树是一个完全二叉树,那么我们假设这棵树的高度是<span class="math">\(h\)</span>,叶结点树是<span class="math">\(l\)</span>,它对应的待排序序列的长度是<span class="math">\(n\)</span>,那么根据完全二叉树的性质,我们有如下的不等式:</p>
<div class="math">$$
n! \le l \le 2^h
$$</div>
<p>对上式两边取对数,我们就能够得到:</p>
<div class="math">$$
\begin{aligned}
h &\ge \lg(n!) \\
&= \Omega(n\lg n)
\end{aligned}
$$</div>
<p>由此,我们可以看到,<strong>在最坏情况下,任何比较排序算法都需要做<span class="math">\(\Omega(n\lg n)\)</span>次比较。</strong></p>
<h1>计数排序</h1>
<p><strong>计数排序</strong>并不是一种基于比较的排序,在它整个运行过程中,并不需要进行元素之间的比较,因此它不会受到上述<span class="math">\(\Omega(n\lg n)\)</span>的限制.计数排序的基本思想是,对于每一个元素<span class="math">\(x\)</span>,确定小于等于<span class="math">\(x\)</span>的元素个数,从而就能确定<span class="math">\(x\)</span>在输出结果上的位置。举例来说,如果小于等于<span class="math">\(x\)</span>的元素有17个,那么<span class="math">\(x\)</span>在输出数组上的位置就是18.</p>
<p>细节的算法过程在《算法导论》上都有,这里就不再细说了,具体的代码实现如下所示:</p>
<pre><code>#!python
"""
The implement of the Counting Sort
The time consume of Counting Sort is O(n), and this algorithm is stable.
The drawbacks of the this algorithm is that it can only sort the numbers from 0 to k. If there is a negative number in the A, this algorithm can not work.
If the given data is very sparse, it will waster a lot space.
"""
def CountingSort(A):
k = max(A)
C = [0] * (k+1)
B = [None] * len(A)
for item in A:
C[item] += 1
# now C[i] contains the number of elements equal to i.
for i in range(1,len(C)):
C[i] = C[i-1] + C[i]
# now C[i] contains the number of elements less than or equal to i.
for i in range(len(A)-1,-1,-1): # why from len(A) to 0 not from 0 to len(A) ? Becuse it must be stable!
# only from len(A) to 0 can guarntee stable.
B[C[A[i]]-1] = A[i] # not the B[C[A[i]]] = A[i], because A and C starts with 0, not 1.
C[A[i]] -= 1
return B
</code></pre>
<p>计数排序的缺点也很明显,首先它要求所有的元素必须是非负的,并且元素的分布不能太过分散,如果太过分散,在利用数组计数的时候很容易造成空间的浪费。</p>
<h1>基数排序</h1>
<p>基数排序的基本思想也很简单的,就是把每一个元素按位排序,先按照个位排序,然后按照十位排序,依次类推。这里很重要的一点就是,在对每一位排序的时候,所采用的排序算法都必须是<strong>稳定的(stable)</strong>.在这里我们刚好可以是上面稳定的计数排序,具体代码如下:</p>
<pre><code>#!python
"""
The implement of Radix Sort.
Radix Sort is using the property of the stable sorting algorithm.
"""
def counting_sort(A,index):
k = max([item[index] for item in A])
n = len(A)
B = [0] * (k+1)
C = [None] * n
for item in A:
B[item[index]] += 1
for i in range(1,len(B)):
B[i] += B[i-1]
for i in range(len(A)-1,-1,-1):
C[ B[ A[i][index] ] - 1 ] = A[i]
B[A[i][index]] -= 1
return C
def radix_sort(A):
d = len(A[0])
B = A[:]
for i in range(d-1,-1,-1):
B = counting_sort(B,i)
return B
if __name__ == "__main__":
A = [
[3,2,9],
[4,5,7],
[6,5,7],
[8,3,9],
[4,3,6],
[7,2,0],
[3,5,5],
]
print(A)
B = radix_sort(A)
print(B)
</code></pre>
<p>基数排序的动画演示:<a href="http://blogimg.chinaunix.net/blog/upfile/070912120349.swf">http://blogimg.chinaunix.net/blog/upfile/070912120349.swf</a></p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年9月阅读书单2014-10-08T00:00:00-06:002014-10-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-10-08:/reading-list/Reading-List-2014-September/<p>2014年9月阅读书单</p><h1>银河系英雄传说</h1>
<p>作者: 田中芳树</p>
<p>一套十本的书的内容,终于完全看完了,看了足足有两个月的时间吧。十本主体的内容之外,还有几本外传,不过这些外传已经不再想看了,过于冗长拖沓了。</p>
<p>看完正本主体之后,留下的印象其实很一般,整体描写手法就像漫画一样,充满了日本漫画的“味道”(后来确实被拍成了动画片)。</p>
<p>小说对政治体制的讨论,并没有给出最终的结论,宇宙的绝大多数地区都处于<strong>廉洁高效</strong>的专制主义的控制之下,只有一个自治军事要塞保留下了<strong>民主主义</strong>的火种。</p>
<p>但是,我想这就是作者田中芳树先生的结论吧,专制主义尽管会扼杀自由的思想,但是如果当政者懂得合理运用权力,整个国际机器高效运转,而没有拖沓的官僚作风,其实反而能给绝大多数民众带来和平的生活。而一旦专制主义随着时间,一步一步腐化堕落(中国几千年的历史,已经证明了其历史的必然性),那么保留下来的民主主义火种就能通过变革的方式取而代之。而历史进一步发展的时候,民主主义又会陷入拖沓繁冗,腐败低效的统治机器,此时就需要以全新的专制主义来代替民主主义。二者相互交替,不断修正历史的走向。</p>
<hr/>
<h1>麦田里的守望者</h1>
<p>作者: Jerome David Salinger</p>
<p>其实过去在高中时代已经读过这本书了,但是当时其实并没有引起我太多的共鸣。但是现在再读的时候,回想青春期的种种事端,发现《守望者》确实抓住了青少年内心的那种波动。尽管表现方式没有小说的主人公那么激烈,但是青春期的叛逆确实让我深有同感。</p>
<hr/>为什么读博2014-09-22T00:00:00-06:002014-09-22T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-22:/words/why-PhD/<p>为什么读博? 因为它就在那儿!</p><blockquote>
<p>为什么要读博?因为它就在那儿</p>
</blockquote>
<p>这是几个月前一初中同学问我的问题,当时没能答出来,而上述这个答案,也是在几个月后我才想到的。</p>
<p>到底为了什么而读博呢?这还真是一个比较难以回答的问题。我只能说,我从没想过不读博的我,将来会是什么情况。</p>
<p>其实网上有很多的关于读博的讨论贴,我看过一些,后来就不看了,专业不同,没什么可比性的。一个文学博士和一个计算机博士将来的工作机遇完全是不一样的。而且读博毕竟是自己的事情,别人的建议参考太多,反而容易迷失了自己。</p>
<p>撇开一切外人的评价,我仔细思考了一下自己到底为什么要读博。</p>
<p>首先来看一下,常规的原因:</p>
<ol>
<li>
<p>为了经济利益,但是投入的时间成本也太大了,而且博士不代表能赚到很多钱。尤其现在的国情是通常都是博士给非博士打工。之前在豆瓣上看到一篇文章说,有个博士毕业留校5年之后,月工资也才7000多,其他同龄人都已经功成名就了,而他只能和老婆窝在出租房中。文章的最终结论就是
,读博其实是一件性价比非常低的事情.虽然这个例子比较极端,我也不知道这是哪一年的事情了,但是不可否认博士确实要花去很多的时间,并且和带来的经济利益不成正比。虽然计算机专业的博士不会像文章中的那么惨,但是时间成本还是很大的。显然,这不会是我读博的主要原因。</p>
</li>
<li>
<p>为了专业研究,这或许是一个比较好的答案,但是抱有这样目的的人似乎通常都不怎么接地气,身上有着读书人的清高。但是,我可不想变成这样的人,一辈子蹲在实验室里,这样的人的生活是没有张力的。并且,我也不认为自己的智商是那种一辈子搞学术的人,我还是喜欢象牙塔外面的广阔天地。</p>
</li>
<li>
<p>为了名声,为了“博士”这个称号,那么我想比“博士”这个称号更高达上的称号有的是,何必花费那么多年的青春和时间放在实验室里呢。同样的时间,在职场好好混,说不定也能混到个经理什么的。</p>
</li>
</ol>
<p>比较私人的原因:</p>
<ol>
<li>
<p>自我成就感: 有一种登高山而小天下的感觉,尽管天下的博士多如牛毛,但是能读到博士,毕竟是不容易的,博士毕业的时候,必然是充满了成就感的。另外,不管研究成果怎么样,至少你已经为人类的文化遗产做出了贡献。</p>
</li>
<li>
<p>过了这个村就没这个店了。工作什么时候都可以干,但是博士错过了这个时间就没机会了,虽然博士是没有年龄限制的,但是人的一生中思维能力最活跃的时候也就是我现在这个年纪,一旦错过了,就不可挽回了。</p>
</li>
<li>
<p>当你读到博士的时候,你一定能认识很多同样是博士的人,这批人将来多半会处于社会各个领域的前沿位置上,遇到什么困难,你能得到的帮助是大不一样的。简单来说,你的社交圈将会是很多的社会精英,能够动用的关系和资源是不一样的。</p>
</li>
</ol>
<p>分析了读博的原因之后,我也简单考虑了一下读博的收益问题,列出了如下几项,这些主要都是个人观点,每个人的关注点都是不太一样的。</p>
<p>读博的成本:</p>
<ol>
<li>
<p>时间成本,人生最具有活力的一段时间大部分都会被花费在书本与论文之间。</p>
</li>
<li>
<p>婚姻问题,由于总是在学校,并且经济上也只能解决自己的温饱问题,因此能找到共度一生的好妹子是比较困难的。(当然女博士不在讨论范围内)</p>
</li>
<li>
<p>经济问题,由于总是在学校做研究,虽然也会有相应的补助,但是和那些正式的工作仍然是无法相比的。人家一个月的工资,比你一年的补助还多。</p>
</li>
<li>
<p>读博期间常常会感到寂寞,孤独,当年很多的玩伴都已经成家立业,而自己还在为一篇论文而绞尽脑汁。</p>
</li>
</ol>
<p>读博的回报:</p>
<ol>
<li>
<p>不管研究成果怎么样,都已经是人类的文化遗产了,至少在这个世界上留下了一些东西,没有白白来这世界走一遭。</p>
</li>
<li>
<p>比较高级的社交圈,能够在读博期间结识很多未来的社会精英。</p>
</li>
<li>
<p>通常来说能够受到别人更多的尊重。</p>
</li>
<li>
<p>经济利益,这个可能要放在长时间范围内才能看到效果。利用自己专业领域的技能,往往能获得更多的薪酬,上升空间很大。</p>
</li>
<li>
<p>获得自我的满足感——众人皆醉而我独醒。(虽然这并不是事实)</p>
</li>
</ol>
<p>尽管,考虑了很多原因,很多收益问题,但是我依然不知道我为什么要读博,我只是单纯的想要读博,仅此而已。</p>
<p>读博是一种生活方式,一种生活态度,没有那么多为什么,我就是喜欢读博的状态,我就读了,不需要考虑那么多的成本与回报(当然前提是你的家人支持你,这很重要!)。</p>
<p>人生在世,很多选择是没有为什么的,就是这么选了,就是这么做了。 </p>
<p>比起“为什么”来,我想还是“怎么做”比较重要,毕竟博士也不是你想读就能读的。</p>
<p>最后,我还是要好好感谢我的家人,没有他们的全力支持,我是无法这么“随性”地选择的。 </p>
<p>归根结底,还是那句话:</p>
<blockquote>
<p>为什么要读博?因为它就在那儿</p>
</blockquote>
<p><img alt="登山者" src="http://zhouyichu.com/images/climber.jpg"/></p>算法导论学习笔记4-第七章 快速排序2014-09-21T00:00:00-06:002014-09-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-21:/clrs/CLRS-4/<p>算法导论第七章学习总结——快速排序</p><h1>快速排序</h1>
<p>《算法导论》在这个整个一章中只讲了这么一个<strong>快速排序</strong>算法,快排其实本身变种很多,但是其基本思想还是一样的。</p>
<p>快排的基本思想主要是,先确定一个pivot,然后将所有比pivot小的元素移动到pivot左边,将比pivot大的元素移动到pivot右边,此时pivot就处于正确的位置上了,然后分别对pivot的左右部分递归地调用快排算法。</p>
<p>其实第一次要理解这个算法,还是挺纠结的,但是一旦理解了,实现起来还是非常简单的,具体代码如下:</p>
<pre><code>#!python
def quick_sort(array,s,e):
pivot_value = array[ (s+e)//2 ]
if s == e:
return
i = s
j = e
while i <= j:
# find the item whose value is great than pivot_value
while i <= e and array[i] < pivot_value:
i+=1
# find the item whose value is less than pivot_value
while j >= s and array[j] > pivot_value:
j-=1
if i <= j:
( array[i],array[j] ) = ( array[j],array[i] )
i += 1
j -= 1
# recursive
if s <= j:
quick_sort(array,s,j)
if e >= i:
quick_sort(array,i,e)
</code></pre>
<p>我的这个实现,并不是书上的实现,但是一样快速排序的算法,仅供参考。</p>
<p>惭愧的是,很久没写快排了,这个算法竟然用了半个小时才完成,真是令人汗颜~</p>Leet Code解题报告12014-09-18T00:00:00-06:002014-09-18T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-18:/leetcode/LeetCode-1/<p>本篇报告解决3个问题,分别为Sort List,Insertion Sort List,LRU Cache</p><h1>Sort List</h1>
<blockquote>
<p>题目: Sort a linked list in <span class="math">\(O(n\log n)\)</span> time using constant space complexity.
</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这一题我做的有点"奸诈",我先是将链表元素映射成数组元素,然后对数组排序,最后再返回成链表。代码如下:</p>
<pre><code>#!python
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# @param head, a ListNode
# @return a ListNode
def sortList(self, head):
p = head
v = []
while p!=None:
v.append(p.val)
p = p.next
v = sorted(v)
if len(v) !=0:
root = ListNode(v[0])
else:
return None
p = root
for i,item in enumerate(v):
if i !=0:
q = ListNode(item)
p.next = q
p=q
if p!= None:
p.next = None
return root
</code></pre>
<h1>Insertion Sort List</h1>
<blockquote>
<p>题目: Sort a linked list using insertion sort.</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>思路很简单,就是简单的插入排序的策略,具体也没啥好说的.但是在具体的实现过程中,总是出现超时的情况,多次修改之后终于通过了,总结了几点需要注意的地方:</p>
<ol>
<li>比较的时候,遇到相同的数值,直接交换,插入到相同的序列的最前部,这样能避免不必要的重复比较</li>
<li>第一层循环的时候,一开始就需要判断当前元素是否是已排好序的序列中的最大值,如果是,则第二层循环就可以不需要了,避免了多余的比较</li>
<li>由于2中提前比较了最大值,所以第二层循环中不必担心从前往后的扫描会扫到当前的自身,这样可以在最内层的循环中减少判断过程,提高效率</li>
</ol>
<p>最后贴上代码:</p>
<pre><code>#!python
#Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# @param head, a ListNode
# @return a ListNode
def insertionSortList(self, head):
if head == None:
return None
tmpHead = ListNode(-1)
tmpHead.next = head
p = tmpHead.next
while( p != None and p.next != None ):
if p.next.val < p.val:
q = tmpHead
while(q.next.val < p.next.val):
q = q.next
t = p.next
p.next = p.next.next
t.next = q.next
q.next = t
else:
p = p.next
return tmpHead.next
</code></pre>
<h1>LRU Cache</h1>
<blockquote>
<p>题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: <code>get</code> and <code>set</code>.</p>
<p><code>get(key)</code> - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.</p>
<p><code>set(key,value)</code> - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这一题相对来说,也很简单,主要是维护一个LRU列表,其中的值就是key,越是常使用的key越是在列表后部,越是不常用的,越是排在前面。</p>
<p>代码如下:</p>
<pre><code>#!python
class LRUCache:
# @param capacity, an integer
def __init__(self, capacity):
self.capacity = capacity
self.values = dict()
self.LRU = []
# @return an integer
def get(self, key):
if key in self.values:
self.LRU.remove(key)
self.LRU.append(key)
return self.values.get(key,-1)
# @param key, an integer
# @param value, an integer
# @return nothing
def set(self, key, value):
if key in self.values:
self.values[key] = value
self.LRU.remove(key)
self.LRU.append(key)
elif len(self.values) < self.capacity:
self.values[key] = value
self.LRU.append(key)
else:
maxKey = self.LRU.pop(0)
self.values.pop(maxKey)
self.values[key] = value
self.LRU.append(key)
</code></pre>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Leet Code解题报告02014-09-16T00:00:00-06:002014-09-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-16:/leetcode/LeetCode-0/<h1>Reverse Words in a String</h1>
<blockquote>
<p>题目: Given an input string, reverse the string word by word.</p>
<p>For example,</p>
<p>Given s = "the sky is blue",</p>
<p>return "blue is sky the".</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这一题其实是非常简单的,只需要将单词切分出来,然后倒序输出就行了。倒序可以直接反向遍历,或者使用一个栈结构都可以。Python中列表数据结构直接封装了倒序的函数,因此代码是非常简单的:</p>
<pre><code>#!python
class Solution:
# @param s, a string
# @return a string
def reverseWords(self …</code></pre><h1>Reverse Words in a String</h1>
<blockquote>
<p>题目: Given an input string, reverse the string word by word.</p>
<p>For example,</p>
<p>Given s = "the sky is blue",</p>
<p>return "blue is sky the".</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这一题其实是非常简单的,只需要将单词切分出来,然后倒序输出就行了。倒序可以直接反向遍历,或者使用一个栈结构都可以。Python中列表数据结构直接封装了倒序的函数,因此代码是非常简单的:</p>
<pre><code>#!python
class Solution:
# @param s, a string
# @return a string
def reverseWords(self, s):
mys = s.strip().split()
mys.reverse()
return ' '.join(mys)
</code></pre>
<h1>Evaluate Reverse Polish Notation</h1>
<blockquote>
<p>题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation.</p>
<p>Valid operators are <span class="math">\(+\)</span>, <span class="math">\(-\)</span>, <span class="math">\( * $, $/\)</span>. Each operand may be an integer or another expression.</p>
<p>Some examples:</p>
<p><span class="math">\(["2", "1", "+", "3", " * "] -> ((2 + 1) * 3) -> 9\)</span>
<span class="math">\(["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6\)</span></p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这一题也是很简单的,就是一个基本的栈结构的应用问题,我想每一本讲到栈结构的算法书都会提到这个问题的。因为所有的操作符(operators)都是二元操作,所以可以从头到尾扫描整个输入串,如果是数字,就直接压入栈中,如果遇到操作符,就从栈中弹出两个操作数,根据当前的操作符进行运算,然后将计算结果压入栈中。最终栈中剩下的就是最终的计算结果.</p>
<p>Python代码如下:</p>
<pre><code>#!python
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
operators = {
"+": lambda a,b: a+b,
"-": lambda a,b: a-b,
"*": lambda a,b: a*b,
"/": lambda a,b: int(float(a)/b),
}
stack = [] # use the list as a stack
for token in tokens:
try:
stack.append(int(token))
except ValueError:
b = stack.pop(-1)
a = stack.pop(-1)
stacck.append(operators[token](a,b))
return stack.pop(-1)
</code></pre>
<h1>Max Points on a Line</h1>
<blockquote>
<p>Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.</p>
</blockquote>
<p><strong>解题思路</strong>:</p>
<p>这题很简单,我采用的是最笨的算法,就是遍历出所有的可能性。基本想法是遍历所有两个点的情况,分别计算形成的直线,两点确定一条直线嘛。直线可以用(k,b)来表示,其中k是斜率,b是截距.</p>
<p>具体代码如下所示:</p>
<pre><code>#!python
class Point:
def __init__(self, a=0, b=0):
self.x = a
self.y = b
class Solution:
# @param points, a list of Points
# @return an integer
def maxPoints(self, points):
slopes = dict()
for i in range(len(points)):
for j in range(len(points)):
if i == j:
continue
p = points[i]
q = points[j]
line = self.slope(p,q)
if line not in slopes:
slopes[line] = set()
slopes[line].add(i)
slopes[line].add(j)
values = [len(item) for item in slopes.values()]
if len(values) == 0:
return len(points)
else:
return max(values)
def slope(self,p,q):
delta_x = p.x - q.x
delta_y = p.y - q.y
if delta_x == 0:
return (None,p.x)
else:
k = float(delta_y) / delta_x
b = p.y - p.x * k
return (k,b)
</code></pre>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>EM算法的理解2014-09-12T00:00:00-06:002014-09-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-12:/machine-learning/EM-Algorithm/<p>EM算法的基本原理剖析,从极大似然、Jensen不等式到EM算法。</p><p>首先需要明确的是,<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法其实是一种算法策略,而不是一种具体的算法,从这个角度可以类比成<a href="http://en.wikipedia.org/wiki/Dynamic_programming">动态规划</a>算法,<a href="http://en.wikipedia.org/wiki/Dynamic_programming">动态规划</a>也只是一种算法设计的策略,对于具体的问题,<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>和<a href="http://en.wikipedia.org/wiki/Dynamic_programming">动态规划</a>都有不同的形式,但是基本思想是不变的。</p>
<p>其次,需要知道的是,什么样的问题是适合用<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法来求解? <a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法是针对包含有隐变量的问题进行求解的方法,对于不包含隐变量的问题,我们根本不需要用<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>这把牛刀。</p>
<p>举例来说,如果现在已知某校的男生的身高是符合正态分布的,并且已经在全校范围内独立抽查了100名男生的身高,现在需要你估计该正态分布的参数(即<span class="math">\(\mu\)</span>和<span class="math">\(\sigma\)</span>)。对于这样的问题来说,我们只需要采用<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然估计</a>的方法,配合上<a href="http://en.wikipedia.org/wiki/Gradient_descent">梯度下降</a>算法,很简单就能解决这个问题。</p>
<p>但是,如果已知学校中男女生的身高都是符合正态分布的,而参数不同,并且在全校范围内独立抽查了200名学生的身高,但是却没有记录其性别,只知道身高的数据。那么,在这种情况,请你分别求解男女生身高正太分布的参数。对于这个问题,单纯使用<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然估计</a>就不能解决问题了,此时就需要<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>这把牛刀了。</p>
<p>这同样也可以用<a href="http://en.wikipedia.org/wiki/Dynamic_programming">动态规划</a>来类比:对于能够使用<a href="http://en.wikipedia.org/wiki/Greedy_algorithm">贪心策略</a>解决的问题就不需要用<a href="http://en.wikipedia.org/wiki/Dynamic_programming">动态规划</a>这把牛刀了。</p>
<h1>极大似然估计</h1>
<p>现在我们首先来看一下,什么才是<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然</a>,这是理解<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法的第一步。</p>
<p>回到上面的第一个例子,我们将其转化为数学化的描述:</p>
<p>令<span class="math">\(\theta=[\mu,\sigma]\)</span>表示正态分布的参数,在全校范围内我们独立同分布的采样了100名男生的身高,由于我们已知男生的身高是符合参数为<span class="math">\(\theta\)</span>的正太分布的,所以每一个被采样的男生的身高都符合概率密度函数:<span class="math">\(p(x\vert \theta)\)</span>,其中<span class="math">\(x\)</span>表示身高。而采样的结果我们用<span class="math">\(X=\{x_1,x_2,\cdots,x_N\}\)</span>来表示,其中<span class="math">\(N\)</span>表示采样的总人数。</p>
<p>由于这100个男生是独立随机地从<span class="math">\(f(x\vert \theta)\)</span>中采样的,因此采样到1号男生的概率应该是<span class="math">\(p(x_1\vert \theta)\)</span>,同理2号男生的概率是<span class="math">\(p(x_2\vert \theta)\)</span>...那么对于这100个男生的来说,他们同时被采样到的概率就是:</p>
<div class="math">$$
L(\theta) = L(x_1,x_2,\cdots,x_N;\theta) = \prod_{i=1}^N p(x_i;\theta)
$$</div>
<p>上述这个公式表明了在给定<span class="math">\(\theta\)</span>这个参数的情况,<span class="math">\(X\)</span>这一组数据被采样到的概率是多少。那么在什么情况下,这一组<span class="math">\(X\)</span>会被采样到呢?当然是这组<span class="math">\(X\)</span>数据出现的概率最大的时候!而上述这个<span class="math">\(L(\theta)\)</span>就是用来衡量<span class="math">\(X\)</span>出现的概率的,由于<span class="math">\(X\)</span>是已知的,所以<span class="math">\(L(\theta)\)</span>是关于<span class="math">\(\theta\)</span>的函数,因此,我们只需要使得这个函数达到最大值,即<span class="math">\(X\)</span>这一组数据被抽取到的概率最大时对应的<span class="math">\(\theta\)</span>就是我们需要的<span class="math">\(\theta\)</span>.</p>
<p>所以,最终我们需要求的<span class="math">\(\theta\)</span>就是:</p>
<div class="math">$$
\hat{\theta} = \arg\max\limits_\theta L(\theta)
$$</div>
<p>连乘是比较麻烦的,我们可以将其改造成连加:</p>
<div class="math">$$
H(\theta) = \ln L(\theta) = \ln \prod_{i=1}^N p(x_i;\theta) = \sum_{i=1}^N\ln p(x_i;\theta)
$$</div>
<p>其中<span class="math">\(L(\theta)\)</span>称为<strong>似然函数</strong>,而<span class="math">\(H(\theta)\)</span>称为<strong>对数似然函数</strong>.</p>
<p>总结一下,其实<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然</a>指的是一种又果到因的参数估计方法,通常我们都是由因到果的,而<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然</a>则是在知道结果的基础上,由结果来倒推原因。具体原理就是在知道结果的情况下,列出可能的所有原因,在这些可选的原因中选取一个,使得已知结果出现的可能性最大。<a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然</a>的核心思想就是:<strong>已知某个参数能使这个样本出现的概率最大,我们当然不会再去选择其他小概率的样本,所以干脆就把这个参数作为估计的真实值。</strong></p>
<p><a href="http://en.wikipedia.org/wiki/Maximum_likelihood">极大似然</a>的一般步骤如下所示:</p>
<ol>
<li>写出似然函数</li>
<li>改写成对数似然函数,整理</li>
<li>求导,令导数为0,得到似然方程</li>
<li>解似然方程,得到参数<span class="math">\(\theta\)</span></li>
</ol>
<h1>Jensen不等式</h1>
<p>在正式说明<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法之前,我们需要了解一个很有用得数学工具,称为<a href="http://en.wikipedia.org/wiki/Jensen%27s_inequality">Jensen不等式</a>,这在优化理论中是一个比较重要的不等式。</p>
<p>设<span class="math">\(f\)</span>是定义域为实数的函数,如果对于所有的实数<span class="math">\(x\)</span>,<span class="math">\(f(x)\)</span>的二阶导数大于等于0,那么<span class="math">\(f\)</span>是凸函数。当<span class="math">\(x\)</span>是向量时,如果其hessian矩阵<span class="math">\(H\)</span>是半正定的,那么<span class="math">\(f\)</span>是凸函数。如果只大于0,不等于0,那么称<span class="math">\(f\)</span>是严格凸函数。</p>
<p>Jensen不等式描述如下:</p>
<p>如果<span class="math">\(f\)</span>是凸函数,<span class="math">\(X\)</span>是随机变量,则<span class="math">\(E[f(x)] \ge f(E[X])\)</span>,当且仅当<span class="math">\(X\)</span>为常量时,等号成立。如下图所示:</p>
<p><img alt="Jensen不等式" src="http://zhouyichu.com/images/jensen.jpg"/></p>
<p>如果<span class="math">\(f\)</span>是一个凹函数,则不等号取反。</p>
<h1>EM算法</h1>
<p>现在我们回到上述的第二个例子中,也就是我们同时男女生的身高数据,同时又不知道具体哪个数据是男生的,哪个是女生的,在这种情况需要你估计男女生正态分布的不同参数。</p>
<p>由于我们此时不知道采样得到的数据到底来自女生还是男生,所以我们无法直接使用上述极大似然估计的方法来求解其参数,此时我们称这样的数据是包含<strong>隐变量</strong>的,这个<strong>隐变量</strong>就是用来指明具体的每一个数据来自哪一个分布(男生的还是女生的).由于这个隐变量是未知的,所以这就造成了我们的困难。</p>
<p>首先,我们可以将采样得到的数据表示成一个二元组:<span class="math">\((x_i,z_i)\)</span>,其中<span class="math">\(x_i\)</span>表示第<span class="math">\(i\)</span>个人的身高,<span class="math">\(z_i\)</span>表示这个被采样的人是男(用1表示)的还是女(用0表示)的.</p>
<p>根据联合分布的概率和,我们有<span class="math">\(p(x_i;\theta) = \sum\limits_{z_i}p(x_i,z_i;\theta)\)</span>.</p>
<p>让我们将这个改写后的数据返回到之前的极大似然估计中,我们可以得到:</p>
<div class="math">$$
\begin{equation}
\begin{aligned}
H(\theta) &= \sum_{i=1}^N\ln p(x_i;\theta) \\
&= \sum_{i=1}^N \ln \sum_{z_i} p(x_i,z_i;\theta)\label{original}
\end{aligned}
\end{equation}
$$</div>
<p>还是和极大似然估计中一样,我们需要使得<span class="math">\(H(\theta)\)</span>达到最大值,最常规的做法就是对<span class="math">\(H(\theta)\)</span>进行求导,令其导数为0.但是这和之前不含隐变量的函数不同,这个函数比较复杂,包含了"<strong>和的对数</strong> ",直接求导是非常困难的,其实这就是隐变量带来的困难之处了。</p>
<p>为了解决这个求导的问题,我们可以对等式<span class="math">\(\ref{original}\)</span>做一些改变,令<span class="math">\(Q_i\)</span>表示变量<span class="math">\(z_i\)</span>的某种分布,且<span class="math">\(Q_i\)</span>满足<span class="math">\(\sum\limits_{z_i}Q_i(z_i)=1,Q_i(z_i) \ge 0\)</span>,利用这个<span class="math">\(Q_i\)</span>,我们可以将等式<span class="math">\(\ref{original}\)</span>改变为:</p>
<div class="math">$$
\begin{equation}
H(\theta) = \sum_{i=1}^N\ln \sum_{z_i}Q_i(z_i) \cdot \frac{p(x_i,z_i;\theta)}{Q_i(z_i)}
\end{equation}
$$</div>
<p>此时,<span class="math">\(\sum_{z_i}Q_i(z_i) \cdot \frac{p(x_i,z_i;\theta)}{Q_i(z_i)}\)</span>其实就是<span class="math">\(\frac{p(x_i,z_i;\theta)}{Q_i(z_i)}\)</span>的期望,同时<span class="math">\(\ln\)</span>又是一个凹函数,因此我们能够直接套用<a href="http://en.wikipedia.org/wiki/Jensen%27s_inequality">Jensen 不等式</a>:</p>
<div class="math">$$
\begin{aligned}
H(\theta) &= \sum_{i=1}^N\ln \sum_{z_i}Q_i(z_i) \cdot \frac{p(x_i,z_i;\theta)}{Q_i(z_i)} \\
&\ge \sum_{i=1}^N \sum_{z_i} Q(z_i) \ln \frac{p(x_i,z_i;\theta)}{Q_i(z_i)}
\end{aligned}
$$</div>
<p>进行了上述变换之后,我们就避免了计算"<strong>和的对数</strong> ",变成了计算"<strong>对数的和</strong> ",这可简单得多了。但是,这里你也许会问,我们明明要求的是<span class="math">\(H(\theta)\)</span>的最大值,可是这里怎么会是一个"大于等于"呢?这只是一个下界!的确,目前我们所得到的确实是一个下界,我们能够通过不断提高这个下界,逐渐逼近<span class="math">\(H(\theta)\)</span>,我们稍后会做说明。</p>
<p>首先我们来看一下,等号成立的条件,在<a href="http://en.wikipedia.org/wiki/Jensen%27s_inequality">Jensen 不等式</a>中,等号成立的条件是随机变量<span class="math">\(X\)</span>为一个常量,因此令<span class="math">\(\frac{p(x_i,z_i;\theta)}{Q_i(z_i)}=c\)</span>,又因为<span class="math">\(\sum\limits_{z_i}Q_i(z_i)=1\)</span>,因此,我们可以得到<span class="math">\(p(x_i;\theta)=c\)</span>.(多个等式分子分母相加不变),将其代回,我们可以得到:</p>
<div class="math">$$
\begin{aligned}
Q_i(z_i) &= \frac{p(x_i,z_i;\theta)}{c}\\
&= \frac{p(x_i,z_i;\theta)}{p(x_i,;\theta)}\\
&= p(z_i\vert x_i;\theta)
\end{aligned}
$$</div>
<p>如此一来,我们就能在给定<span class="math">\(x_i,\theta\)</span>的情况下,计算出<span class="math">\(Q_i(z_i)\)</span>了,而知道了<span class="math">\(Q_i(z_i)\)</span>之后,我们又能重新估计参数<span class="math">\(\theta\)</span>,这似乎有点类似鸡生蛋,蛋生鸡的问题,我们从中打破了其中的一步,可以将<span class="math">\(\theta\)</span>随机赋一个初始值,然后估计<span class="math">\(Q_i(z_i)\)</span>;再利用新的<span class="math">\(Q_i(z_i)\)</span>估计<span class="math">\(\theta\)</span>,如此反复迭代下去,直至收敛。其实这就是<a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a>算法的基本思想了。在我们重新估计新的<span class="math">\(\theta\)</span>的时候,其实就是在不断提高<span class="math">\(H(\theta)\)</span>的下界,以达到最大值。</p>
<p>EM的具体过程如下:</p>
<ol>
<li>
<p>E步: 对于每一个<span class="math">\(i\)</span>,计算<span class="math">\(Q_i(z_i) = p(z_i\vert x_i;\theta)\)</span></p>
</li>
<li>
<p>M步: 计算 </p>
</li>
</ol>
<div class="math">$$
\theta = \arg\max\limits_{\theta}\sum_{i=1}^N\sum_{z_i}Q_i(z_i)\ln \frac{p(x_i,z_i;\theta)}{Q_i(z_i)}
$$</div>
<h1>参考资料</h1>
<ul>
<li><a href="http://blog.csdn.net/zouxy09/article/details/8537620">从最大似然到EM算法浅解</a></li>
<li><a href="http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html">(EM算法)The EM Algorithm</a></li>
<li><a href="http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM</a></li>
<li><a href="http://en.wikipedia.org/wiki/Dynamic_programming">Dynamic Programming</a></li>
<li><a href="http://en.wikipedia.org/wiki/Maximum_likelihood">Maximum Likelihood</a></li>
<li><a href="http://en.wikipedia.org/wiki/Gradient_descent">Gradient Descent</a></li>
<li><a href="http://en.wikipedia.org/wiki/Greedy_algorithm">Greedy Algorithm</a></li>
<li><a href="http://en.wikipedia.org/wiki/Jensen%27s_inequality">Jensen Inequality</a></li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年8月阅读书单2014-09-01T00:00:00-06:002014-09-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-09-01:/reading-list/Reading-List-2014-August/<p>2014年8月阅读书单</p><h1>银河系英雄传说</h1>
<hr/>
<p>作者: 田中芳树</p>
<p>这本(套)书已经看了一个多月了,结果还是没有看完,现在大概看到65%左右吧,一套10本书,实在是太长了。</p>
<p>这套书号称是日本版的三国演义,其实看到现在为止,我觉得它和三国演义完全不是一类的东西。尽管讲的都是战争中的尔虞我诈,你来我往,但是其侧重点完全不一样,《银河》中其实更加侧重描写的是政治体制之间的对立,而对于战争与诡计的描画远远没有三国中那么精致和细腻。</p>
<p>从本质上说,我觉得不应该将其和《三国》来进行对比,本质不同,何需比较?</p>
<p>从书中的很多论述中,可以看到作者对于不同政治体制的深入思考,腐败低效的民主制和廉洁高效的集权制到底孰优孰劣?这是这本书让我思考最多的一个问题,但始终没有答案,也许永远不会有答案。</p>Mac中安装Vim7.42014-08-25T00:00:00-06:002014-08-25T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-25:/vim/Vim-in-Mac/<p>在Mac中安装最新的Vim7.4</p><h1>Mac上的Vim</h1>
<p>Mac本身其实是预装了Vim的,但是目前的系统中都是Vim7.3版本的,而最新的Vim已经是7.4版了,因此为了能够使用最新版的vim,必须要对Mac中的vim要么升级,要么重装。在折腾过程中,遇到了一些问题,这里记录,以鉴后人。</p>
<h1>可选方案</h1>
<p><strong>升级原生的Vim7.3</strong></p>
<p>这种方法貌似是最"干净"的,不会引入其他任何多余的东西,对于有洁癖的人这应该是一种比较好的方案。但是,这个方案也有缺点,那就是它会覆盖原生的Vim,会改变系统的默认设置,并且一旦升级过程中出现了问题,那你就再也没有可用的vim了。另外一个问题是,以后当你系统升级的时候,很有可能你自己的vim又会被新系统的vim给覆盖,这样会比较麻烦。</p>
<p><strong>使用MacVim</strong></p>
<p>这是一种比较好的方案,Vim官网上也是推荐使用这种方案的,MacVim是针对Mac系统特别定制的Vim版本,安装过程也很简单,网上一搜一大把。它功能上和vim完全一致,不会有任何的问题。要说这种方案其实已经算是一个完美的解决方案了,但是它有一点不太方便的地方,那就是不能直接在终端中使用vim,每次使用MacVim的时候都会单独开启一个窗口,有点类似于windows中的gvim。而我个人是比较习惯在终端中写代码的,因此这个方案还是不能满足我的需求。</p>
<p><strong>自己编译</strong></p>
<p>这是一种终极的方案,但是自己编译的时候注意要手动更改默认的安装目录,不然它就会覆盖原生的vim7.3,这样就会变成第一种方案了。将vim7.4安装在其他目录,然后在<code>.bash_profile</code>中添加一个<code>vim</code>命令的别名,将其指向新安装的vim7.4的目录,而不是原生的vim7.3目录。这个方案就能在终端中直接使用vim7.4了,并且不会对原生的vim7.3又任何影响。这个方案唯一的缺点大概就是会在系统中产生两个不同版本的vim了,这也许对一些有洁癖的人是难以接受的。</p>
<p>我自己最终选择了第三套方案,也就是自己编译新版本的vim.</p>
<h1>重新编译</h1>
<p>好了,现在让我们开始折腾吧。</p>
<ul>
<li>
<p>首先上vim的<a href="http://www.vim.org/">官网</a>下载vim7.4的源文件,地址是:http://www.vim.org/sources.php</p>
</li>
<li>
<p>新建目录<code>/opt/loacl</code>,这个目录就是用来存放我们新安装的vim7.4的,你也可以建立其他的目录,这里只是一个示例。</p>
</li>
<li>
<p>进入vim的源文件目录中,在终端中运行命令:</p>
<pre><code>:::bash
./configure --with-features=huge --enable-pythoninterp=yes --enable-cscope --enable-fontset --enable-perlinterp --enable-rubyinterp --with-python-config-dir=/usr/lib/python2.6/config --prefix=/opt/local
</code></pre>
</li>
</ul>
<p>这个命令是完成对vim的一些配置选项,启用了python和ruby的支持特性,这还是比较重要的,因为vim中有些插件会使用python和ruby的,如果没有开启这些特性,有些插件是无法运行的。在这些配置命令中,最后一个<code>--prefix=/opt/local</code>是用来指明安装目录的,你也可以修改成你自己的目录。</p>
<p>在写配置命令的时候,需要注意的是,不能写上<code>--enable-gui</code>,这是开启gui特性的,但是我们是在终端环境下安装的,因此不能开启这个特性,否则会出现编译错误。</p>
<ul>
<li>在终端中执行<code>make</code>命令.在make过程中,会出现一个错误,如下所示:<pre><code>:::bash
:info:build os_unix.c:830:46: warning: declaration of 'struct sigaltstack' will not be visible outside of this function [-Wvisibility]
:info:build extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss));
:info:build ^
:info:build ./os_unix.h:88:21: note: expanded from macro '__ARGS'
:info:build # define __ARGS(x) x
:info:build ^
:info:build os_unix.c:830:13: error: conflicting types for 'sigaltstack'
:info:build extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss));
:info:build ^
:info:build /usr/include/signal.h:89:5: note: previous declaration is here
:info:build int sigaltstack(const stack_t * __restrict, stack_t * __restrict) __DARWIN_ALIAS(sigaltstack);
:info:build ^
:info:build 1 warning and 1 error generated.
:info:build make[1]: *** [objects/os_unix.o] Error 1
:info:build make[1]: *** Waiting for unfinished jobs….)
</code></pre>
</li>
</ul>
<p>解决方案也很简单,只需要在os_unix.h中加上<code>#include <AvailabilityMacros.h></code>就可以了。</p>
<ul>
<li>
<p>执行<code>make install</code>.执行完成之后,vim7.4就安装完成了。</p>
</li>
<li>
<p>添加<code>vim</code>命令的别名,在<code>.bash_profile</code>中添加一行<code>alias vim='/opt/local/bin/vim'</code>,然后在终端中执行<code>source ~/.bash_profile</code></p>
</li>
</ul>
<p>好了,现在你的Mac系统已经安装好了vim7.4了,现在可以开始愉快的工作了。</p>
<h1>参考资料</h1>
<ul>
<li>http://stackoverflow.com/questions/7211820/update-built-in-vim-on-mac-os-x</li>
<li>http://www.jokerlin.us/2014/04/13/Vim74.html</li>
<li>http://trac.macports.org/ticket/41774</li>
</ul>算法导论学习笔记3-第六章 堆排序2014-08-12T00:00:00-06:002014-08-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-12:/clrs/CLRS-3/<p>算法导论第六章学习总结——堆排序</p><h1>写在前面</h1>
<p>这篇笔记是直接跟在第四章的笔记之后,之所以跳过了第五章,主要是因为第五章的内容涉及到了随机算法的内容,而这部分内容我之前有另外一个系列的笔记,是专门记录随机算法学习过程的。其中涉及到的内容要比CLRS中的多很多,因此这一章我就直接跳过了,具体内容看参看我那一个系列的笔记。</p>
<h1>堆</h1>
<p>(二叉)堆是一种基本的数据结构,通常来说是用数组来实现的,它可以看成是一个完全二叉树,树中的每一个节点表示堆中的一个元素。如下图所示:</p>
<p><img alt="完全二叉树" src="http://zhouyichu.com/images/binary-tree.png"/></p>
<p>对于一个最大(最小)堆来说,最重要的性质是:<strong>树中的父节点永远不小(不大)于它的子节点</strong>.</p>
<p>另外,由于堆的实现是用数组来实现的,且又是一个二叉树,如果下标是<strong>从1开始的</strong>,那么它具有如下的性质:<strong>对于任意的节点i(当前节点的下标),它的父节点是<span class="math">\(\lfloor \frac{i}{2}\rfloor\)</span>,而且左右孩子分别为<span class="math">\(i\times 2\)</span>和<span class="math">\(i\times 2+1\)</span></strong>.这个性质对于我们的实现来说,提供了比较大的帮助.</p>
<p>这里将会用最大堆来举例。</p>
<p>对于一个最大堆来说,它一共有如下的几个操作:</p>
<ul>
<li>MAX-HEAPIFY: 维护最大堆的性质</li>
<li>BUILD-MAX-HEAP: 从无序的输入数组中构造一个最大堆</li>
<li>HEAPSORT: 对一个数组进行堆排序</li>
</ul>
<p>关于堆各种操作的伪代码CLRS上面都有,这里就不再重复了,直接给出堆的实现:</p>
<pre><code>#!python
#!/usr/bin/python3
#coding:utf-8
"""
Program: 堆排序的实现
Description:
Author: Flyaway - flyaway1217@gmail.com
Date: 2014-08-06 15:41:27
Last modified: 2014-08-08 15:21:15
Python release: 3.3.1
"""
class MyMaxHeap:
def __init__(self,array):
self._array = [float("-inf")]
self._array[1:] = array
self._heap_size = len(self._array) - 1
self._build_max_heap()
def _left(self,i):
return i<<1
def _right(self,i):
return (i << 1) + 1
def _parent(self,i):
return i>>1
def _max_heap(self,i):
left = self._left(i)
right = self._right(i)
if left > self._heap_size :
left = 0
if right > self._heap_size:
right = 0
# find the largest
largest = max([left,right,i],key=lambda x: self._array[x])
if largest == i:
return
else:
(self._array[largest],self._array[i]) = (self._array[i],self._array[largest])
self._max_heap(largest)
def _build_max_heap(self):
for i in range(self._heap_size//2,0,-1):
self._max_heap(i)
def __str__(self):
s = ' '.join([ str(item) for item in self._array[1:] ])
return s
def __repr__(self):
s = ' '.join([ str(item) for item in self._array[1:] ])
return s
if __name__ == "__main__":
array = [1,4,2,3,9,7,8,10,14,16]
maxheap = MyMaxHeap(array)
print(maxheap)
</code></pre>
<h1>堆排序</h1>
<p>而堆排序是建立在堆这个数据结构之上的,由于堆的结构性质保证了它的第一个元素一定是这个数据序列中最大的元素,因此将它与序列中的最后一个元素交换,则它就处于它排好序之后的位置上了。此时,将堆的size缩小一(将已经放置到末尾的最大元素去除),然后重建堆结构。不断重复上述过程,直至堆结构中只剩下一个元素。在这个过程中,我们利用了<strong>堆的第一个元素一定是当前堆中最大元素</strong>这个性质。具体代码实现如下:</p>
<pre><code>#!python
def heap_sort(self):
for i in range(self._heap_size,0,-1):
(self._array[i],self._array[1]) = (self._array[1],self._array[i])
self._heap_size -= 1
self._max_heap(1)
</code></pre>
<h1>优先队列</h1>
<p>堆这种数据结构还有一种比较重要的用途,那就是用来实现<strong>优先队列</strong>,优先队列在操作系统中有着非常重要的作用。</p>
<p>此处用<strong>最大优先队列</strong>来举例,一个<strong>最大优先队列</strong>有如下的操作:</p>
<ul>
<li>INSERT(S,x): 把元素<span class="math">\(x\)</span>插入到集合<span class="math">\(S\)</span>中。</li>
<li>MAXIMUM(S): 返回<span class="math">\(S\)</span>中具有最大关键字的元素。</li>
<li>EXTRACT-MAX(S): 去掉并返回<span class="math">\(S\)</span>中具有最大关键字的元素。</li>
<li>INCREASE-KEY(S,x,k): 将元素<span class="math">\(x\)</span>的关键字值增加到k。</li>
</ul>
<p>具体代码如下所示:</p>
<pre><code>#!python
#!/usr/bin/python3
#coding:utf-8
"""
Program: 最大优先队列的实现
Description:
Author: Flyaway - flyaway1217@gmail.com
Date: 2014-08-12 15:19:05
Last modified: 2014-08-12 15:53:26
Python release: 3.3.1
"""
class MaxHeap:
def __init__(self,array):
self._array = [float("-inf")]
self._array[1:] = array
self._heap_size = len(self._array) - 1
self._build_max_heap()
def _left(self,i):
return i<<1
def _right(self,i):
return (i << 1) + 1
def _parent(self,i):
return i>>1
def _max_heap(self,i):
"""Ensure the property of max heap
"""
left = self._left(i)
right = self._right(i)
if left > self._heap_size :
left = 0
if right > self._heap_size:
right = 0
# find the largest
largest = max([left,right,i],key=lambda x: self._array[x])
if largest == i:
return
else:
(self._array[largest],self._array[i]) = (self._array[i],self._array[largest])
self._max_heap(largest)
def _build_max_heap(self):
for i in range(self._heap_size//2,0,-1):
self._max_heap(i)
def __str__(self):
s = ' '.join([ str(item) for item in self._array[1:self._heap_size+1] ])
return s
def __repr__(self):
s = ' '.join([ str(item) for item in self._array[1:self._heap_size+1] ])
return s
def maximum(self):
'''Return the max item
'''
return self._array[1]
def extract_max(self):
"""Return and move the max item
"""
if self._heap_size < 1:
raise Exception("Heap underflow")
maximum = self._array[1]
self._array[1] = self._array[-1]
self._heap_size -= 1
self._max_heap(1)
return maximum
def increase_key(self,i,k):
"""Increase the item specified by i to k.
Arguments:
i: the indicator of the item
k: the value the item need to increased to
Returns:
"""
if i <= 0:
raise Exception("the item does not exit!")
if k < self._array[i]:
raise Exception("new key is smaller than current key")
self._array[i] = k
parent = self._parent(i)
while parent >= 1 and self._array[parent] < self._array[i]:
self._array[parent],self._array[i] = self._array[i],self._array[parent]
i = parent
parent = self._parent(i)
def insert(self,x):
self._heap_size += 1
if self._heap_size >= len(self._array):
self._array.append(float("-inf"))
else:
self._array[self._heap_size] = float("-inf")
self.increase_key(self._heap_size,x)
if __name__ == "__main__":
data = [15,13,9,5,12,8,7,4,0,6,2,1]
maxheap = MaxHeap(data)
print("The original max heap:")
print(maxheap)
print("-"*50)
print("After extract_max():")
print(maxheap.extract_max())
print(maxheap)
print("-"*50)
print("After maximum():")
print(maxheap.maximum())
print(maxheap)
print("-"*50)
print("After increase_key(2,20):")
maxheap.increase_key(2,20)
print(maxheap)
print("-"*50)
print("After insert(40):")
maxheap.insert(40)
print(maxheap)
print("-"*50)
print("After insert(12):")
maxheap.insert(12)
print(maxheap)
print("-"*50)
</code></pre>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>深潜2014-08-12T00:00:00-06:002014-08-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-12:/words/Dive-In/<p>对于目标的追求,需要一次又一次的深潜。</p><p>戴尔卡耐基曾经在他经典的著作《人性的弱点》中,曾经有过这样的论断:<strong>一个人能否取得成功,取决于他对目标的渴望程度</strong>。</p>
<p>深以为然。</p>
<p>记得当年小高考的时候,每天脑中所想都是政治、历史、地理和生物这四门科目,每天都生活在巨大的压力下面,不是那种外在的,而是发自内的压力,是自己给自己的。</p>
<p>在这样的压力之下,我对每一门科目都做了详细的计划,细节到每一天应该背下哪一段内容。我的步伐和老师的并不完全一致,我一直坚持自己的方法来复习。</p>
<p>那段时间,我的生活目标仿佛就只有一个——一定要拿到4A。参加过高考的人一定能够理解这段艰辛的时光。</p>
<p>当时,之所以拼命给自己施加压力,因为我坚信卡耐基对于对于成功的论断,每天都在自我催眠,要拿到4A,要拿到4A....</p>
<p>在这样的自我增压的环境下面,任何一点外在的风吹草动,足以让你敏感的神经崩溃。在整个小高考复习期间,和家人爆发了不止一次的冲突,而冲突的原因却是非常非常琐碎的小事。比如电视声音太大,帮母亲在电脑上开个电视剧等。</p>
<p>虽然后来拿到了4A,但是那段时间真是非人的生活。</p>
<p>现在回过头来想想,卡耐基的说法没错,是我用错了方式。</p>
<p>当一个人对一个目标非常渴望的时候,会激发人的主观能动性,会想出各种各样的方式来使得自己不断靠近目标,比如我当时给自己指定了各种各样的复习计划,制定复习策略。我想这就是卡耐基想表达的实质,要发挥人的<strong>主观能动性</strong>,而不是简单的自我催眠,给自己施加无法承受的压力。</p>
<p>在《高效能人士的7个习惯》中,第一个习惯就是要<strong>积极主动</strong>,这和卡耐基想表达的不谋而合,积极主动的方式可以让人无惧任何困难。</p>
<p>后来,在杰克韦尔奇的自传中,又看到了另外一个概念——<strong>深潜</strong>。深潜主要是指在做事的时候要全身心的投入,就像潜水一样,要全身心得投入其中才能有所收获。</p>
<p>我想对这个概念加以延伸,对于目标的追求过程,可以看成一次又一次的深潜过程,每一次深潜都是一次主观能动性的发挥,深入到某一个具体的点上,将事情做到极致。当你完成深潜之后,探出水面,好好休息,释放压力,为下一次的深潜做好准备。</p>
<p>压力的释放过程是非常有必要的,之前的我就是不懂得如何释放自己的压力,一味的潜入到水底而不愿上浮,导致累积的压力越来越多,以非常剧烈的方式爆发出来,使得和家人的关系日趋紧张。</p>
<p>所以当你有一个非常渴望的目标的时候,请积极主动的<strong>深潜</strong>吧,但不要忘记浮上来换口气。</p>总在不经意间,发现生活的美好2014-08-10T00:00:00-06:002014-08-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-10:/words/Happiness-in-Life/<p>生活就像海浪,推我们往前疾行,让我们错过了一个又一个美好,直至撞死在那沙滩上。</p><p>总在不经意间,发现生活的美好。</p>
<p>2014年3月17日,我坐在校医院的座椅上,左手挂着水,右手拿着kindle,我甚至还记得当时是在看张鸣教授的讲课笔记《重说中国近代史》。</p>
<p>那个半天,我都是在校医院度过的,一个人。</p>
<p>抬头看到外面温暖的阳光,虽然感受不到温度,但同样觉得很舒适。</p>
<p>那一瞬间,没有作业,没有任务,没有笔记,没有奔跑的感觉。</p>
<p>时间凝固了。</p>
<p>生活是充满阳光的,我告诉自己。</p>
<hr/>
<p>总在不经意间,发现生活的美好。</p>
<p>两周之前的周六,在上完GRE课程回校的途中,在地铁上看到了一家三口,孩子大概4、5岁,身边坐着他的父母,父母的手紧紧握在一起。我想任何人看到这样的场景都感受到他们的幸福。</p>
<p>两年前,在南师大附近的小区里,我也看到过类似的一家三口,同样洋溢着幸福的因子,在我心中留下了深刻的印象。</p>
<p>我想我曾经也有过机会成为我眼中的他们,朝九晚五上班,周末和家人一起享受生活。但是,这并不是我想要的,于是我选择了另外一条路,另外一条不是那么平坦的路. </p>
<p>或许我的幸福和他们的并不一样,或许我的幸福就在不远的将来,或许我的幸福就是现在正在想着他们的此刻。</p>
<p>生活是充满希望的,我告诉自己。</p>
<hr/>
<p>总在不经意间,发现生活的美好。</p>
<p>昨天同样是在GRE课程完了之后,由于晚上定了舞台剧,于是不打算回学校了,打算在珠江路逛逛,看看电子产品的行情。步入电子城的瞬间,一种强大的压迫感迎面袭来,四周无数张笑脸迎了上来。</p>
<p>"你找什么产品啊?"</p>
<p>"华硕新款机型,请里面看看"</p>
<p>"配电脑请这面来看看!"</p>
<p>平时最讨厌人多的我,见这一阵势,在电子城中匆匆逛了一圈就灰溜溜地出来了,实在无法忍受里面嘈杂的氛围。</p>
<p>于是百无聊赖地走进电子城旁边的一家咖啡馆,点了杯摩卡,坐在一个角落中,看起了kindle.</p>
<p>当我再次注意到时间的时候,已经离舞台剧开场没多少时间了,没想到时间一下子就溜走了。</p>
<p>而在这段时间,没有bug需要调、没有作业需要赶、没有项目需要追、没有单词需要背……一下子从快车道上飞驰的车子变成了人行道上晒太阳的行人,有一种宁静与舒适的感觉。</p>
<p>生活是美好的。我告诉自己。</p>算法导论学习笔记2-第四章 分治策略2014-08-05T00:00:00-06:002014-08-05T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-05:/clrs/CLRS-2/<p>算法导论第四章学习总结——分治策略</p><h1>分治策略</h1>
<p>在<a href="http://zhouyichu.com/clrs/CLRS-1/">上一篇笔记</a>中,我们提到了一种算法设计策略:<strong>归并排序</strong>,当时没有深入展开,而本章会就这个算法策略展开一系列的分析和说明。</p>
<p>所谓<strong>分治策略</strong>,其基本思想就是将原问题<strong>递归地</strong>划分为一系列的<strong>子问题</strong>,不停地减小问题的规模,直到能够轻易解决,然后将各个子问题的解<strong>合并</strong>起来,还原为原来问题的解。简单来说就是<strong>分而治之</strong>!</p>
<p>其具体的递归步骤主要有以下三步:</p>
<ul>
<li><strong>分解(Divide)</strong>: 将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小.</li>
<li><strong>解决(Conquer)</strong>: 递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解.</li>
<li><strong>合并(Combine)</strong>: 将子问题的解组合成原问题的解.</li>
</ul>
<p>但是,需要注意的是并不是所有可以<strong>递归分解</strong>的问题都是可以用<strong>分治策略</strong>来解决的,其中关键的一点是在递归过程中是否存在<strong>overlap</strong>,如果存在的话,那就不应该使用分治策略,在这种情况下,分治的结果会很差,此时我们可以使用另外一种算法策略来解决问题:<strong>动态规划</strong>.关于什么是<strong>overlap</strong>和<strong>动态规划</strong>,书中的后续章节都会有所涉及,这里只是过一个简单的提醒——<strong>分治策略不是万能的</strong>。</p>
<h1>分治算法举例</h1>
<p>书中一共有三个使用了<strong>分治策略</strong>的算法,分别是<strong>归并排序</strong>,<strong>最大子数组</strong>以及<strong>Strassen算法</strong>,其中的Strassen算法比较罗嗦,这里就不举例了,大家可以去看书中的论述。</p>
<h2>归并排序</h2>
<p>这可以说是最基本的一个排序算法了,任何一个学习过编程的人都应该知道这个算法,这里为了完整性,简要说明一下。</p>
<blockquote>
<p>归并算法:</p>
<ol>
<li>
<p>分解待排序的<span class="math">\(n\)</span>个元素的序列成各自具有<span class="math">\(\frac{n}{2}\)</span>个元素的两个子序列。(Divide)</p>
</li>
<li>
<p>使用归并排序递归地排序这两个子序列。(Conquer)</p>
</li>
<li>
<p>合并两个已经排好序的子序列。(Combine)</p>
</li>
</ol>
</blockquote>
<p>Python实现如下:</p>
<pre><code>#!python
def merge_sort(A):
if len(A) == 1:
return A
else:
mid = len(A) // 2
left = merge_sort(A[:mid])
right = merge_sort(A[mid:])
result = merge(left,right)
return result
def merge(left,right):
i = 0
j = 0
result = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
else:
if i < len(left):
result += left[i:]
if j < len(right):
result += right[j:]
return result
if __name__ == "__main__":
#A = [1,3,4,5,1,2,3,20,2,345]
A = [12,100,230,1,3,4,5,1,2,3,20,2,345]
print(A)
B = merge_sort(A)
print(B)
</code></pre>
<h2>最大子数组</h2>
<p>问题描述:给定一个元素值有正有负的数组,从中找出一个子数组,使得其和在所有可能的情况中最大。</p>
<ul>
<li>Input: <span class="math">\([13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]\)</span></li>
<li>Output: <span class="math">\([18,20,-7,12]\)</span></li>
</ul>
<p>因为在所有的子数组中的,<span class="math">\(18+20+(-7)+12=43\)</span>是最大的。</p>
<p>对于这个问题,我们同样可以使用<strong>分治策略</strong>来解决。如果我们将长度为<span class="math">\(n\)</span>数组<span class="math">\(C\)</span>以其中点为分界点,分解成两个长度为<span class="math">\(\frac{n}{2}\)</span>的子数组<span class="math">\(A\)</span>和<span class="math">\(B\)</span>,那么最大子数组<span class="math">\(K\)</span>必然存在于下面三种情况之一:</p>
<ol>
<li><span class="math">\(K\)</span>存在于<span class="math">\(A\)</span>中</li>
<li><span class="math">\(K\)</span>存在于<span class="math">\(B\)</span>中</li>
<li><span class="math">\(K\)</span>包含<span class="math">\(C\)</span>的中点,也即<span class="math">\(K\)</span>横跨<span class="math">\(A\)</span>和<span class="math">\(B\)</span></li>
</ol>
<p>在这三种情况中,前两种很容易处理,只需要不断递归下去,直到终止状态,而对于第三种情况,我们需要在进行合并的时候,从中点开始向两边扩展,寻找可能的<span class="math">\(K\)</span>,并将找到的结果和<span class="math">\(A,B\)</span>中找到的<span class="math">\(K\)</span>作比较,取其最大者。</p>
<p>需要注意的是,这里可以从中间往两边扩展进行寻找,因为在这个问题上加法具有这样的性质:<strong>两个较大的数的和也会是一个比较"大"的数,而这种性质是不适用于乘法的</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.如果是正数和负数相乘,那就只能得到一个更小的数。</p>
<p>终止条件: 不断的向下递归,直到数组中是剩下一个元素,返回该数组。</p>
<p>Python实现如下所示:</p>
<pre><code>#!python
def merge_maxsubsum(array,start=None,end=None):
if start == None:
start = 0
if end == None:
end = len(array) - 1
if end >= len(array):
raise Exception("The end is larger than the length!")
if start == end:
return (start,end,array[start])
else:
mid = (start + end ) // 2
left = merge_maxsubsum(array,start,mid)
right = merge_maxsubsum(array,mid+1,end)
across = merge_across(array,start,mid,end)
return max([left,right,across],key=lambda x:x[-1])
def merge_across(array,start,mid,end):
left_sum = mid
left_max_sum = float("-inf")
for i in range(mid,start-1,-1):
left_sum += array[i]
if left_sum > left_max_sum:
left_max_sum = left_sum
left_start = i
right_sum = mid
right_max_sum = float("-inf")
for i in range(mid+1,end+1):
right_sum += array[i]
if right_sum > right_max_sum:
right_max_sum = right_sum
right_end = i
return (left_start,right_end,left_max_sum + right_max_sum)
</code></pre>
<h1>递归式的分析</h1>
<p>书中一个讲解了三种解决递归式的方法,分别是:<strong>代入法</strong>,<strong>递归树</strong>和<strong>主方法</strong>.接下来会主要介绍这三种不同的方式</p>
<h2>代入法</h2>
<p>这其实是一种"瞎猜"的方式,基本思想就是猜出一个解,然后用数学归纳法验证。其主要步骤如下所示:</p>
<ol>
<li>猜测解的形式</li>
<li>用数学归纳法求出解中的常数,并证明解是正确的。</li>
</ol>
<p><strong>代入法</strong>主要依靠的是人的经验和直觉,如果看到一个递归式能快速地反应出其解的形式,者无疑是最好的,但是这需要大量的练习才能做到。</p>
<h2>递归树</h2>
<p>这种方式就比较简单了,就是按照其递归过程,将原问题画成一棵递归树,从递归树中计算出解的形式.
比如归并排序的递归式<span class="math">\(T(N)=2f(\frac{N}{2})+N\)</span>的递归树就是:</p>
<p><img alt="归并排序\(T(N)=2f(\frac{N}{2})+N\)的递归树" src="http://zhouyichu.com/images/recursion_tree.png"/></p>
<p>其中,每个节点上的下标数字表示的当前节点所处的层数。</p>
<h3>分析工具</h3>
<p>在进行递归树分析的时候,我们需要用到一些数学工具来辅助我们,这里列出几个我们后续计算中需要用到的工具。</p>
<ol>
<li><strong>递归树的深度</strong></li>
</ol>
<p>假设某一棵递归树的递归过程是<span class="math">\( N\rightarrow\frac{N}{c}\rightarrow\frac{N}{c^2}\dots\)</span>,则其深度<span class="math">\(m\)</span>则应该满足:</p>
<div class="math">$$
\frac{N}{c^m} = 1 \Rightarrow m = \log_c N
$$</div>
<ol>
<li><strong>几何级数求和</strong></li>
</ol>
<p>几何级数的求和公式为<span class="math">\(S=1+x+x^2 + x^3 + \cdots + x^k=\frac{x^{k+1}-1}{x-1}\)</span>.</p>
<ul>
<li>当<span class="math">\(x=1\)</span>时, <span class="math">\(S=k+1\)</span></li>
<li>当<span class="math">\(x<1\)</span>时, <span class="math">\(S=O(1)\)</span></li>
<li>当<span class="math">\(x>1\)</span>时, <span class="math">\(S=x^k (1+\frac{1}{x}+\frac{1}{x^2}\cdots) = O(x^k)\)</span></li>
</ul>
<h3>分析举例</h3>
<p>这里依然用归并排序的例子举例,归并排序的递归式是<span class="math">\(T(N)=2T(\frac{N}{2})+N\)</span>,其递归树上面已经给出。现在我们需要根据这个递归树,计算出归并排序的真正时间复杂度。</p>
<p>在计算递归树的时候,我们首先计算两个关键的值:</p>
<ol>
<li>递归树一共有多少层</li>
<li>每一层的计算代价是什么</li>
</ol>
<p>对于第一个问题,很简单,这个递归树的层数是<span class="math">\(\log_2 N\)</span>。</p>
<p>现在考虑第二个问题,很显然,第一层的代价是<span class="math">\(N\)</span>,第二层的代价是<span class="math">\(2 \times \frac{N}{2}=N\)</span>,第三层的代价是<span class="math">\(4\times \frac{N}{4}=N\)</span>, 则第<span class="math">\(k\)</span>层的代价是<span class="math">\(2^{k-1} \times \frac{N}{2^{k-1}} =N\)</span>,因此所有层的代价之和为<span class="math">\(\sum\limits_{i=1}^{\log_2 N} N\)</span>.</p>
<p><strong>注意</strong>,这还不是最后答案,我们还需要考虑递归树的叶子节点,当递归树到达叶节点时,一共有<span class="math">\(2^{\log_2 N} = N\)</span>个<span class="math">\(f(1)\)</span>,因此在基础情况下的代价是<span class="math">\(N \times f(1)\)</span>。而我们认为<span class="math">\(f(1)=O(1)\)</span>,所以叶节点的代价就是<span class="math">\(O(N)\)</span>.</p>
<p>所以整个递归树的代价就是<span class="math">\(O(\sum\limits_{i=1}^{\log_2 N} N) + O(N)=O(N\log_2 N)\)</span>.</p>
<h2>主方法</h2>
<p>这种方式主要是用来解决形如<span class="math">\(T(n)=aT(\frac{n}{b})+f(n)\)</span>的递归式,其中<span class="math">\(a\ge 1,b>1\)</span>是常数,<span class="math">\(f(n)\)</span>是渐进函数。</p>
<p>这个式子可以做如下的理解: 将规模为<span class="math">\(n\)</span>的问题分解为<span class="math">\(a\)</span>个子问题,其中每个子问题的规模为<span class="math">\(\frac{n}{b}\)</span>,而函数<span class="math">\(f(n)\)</span>包含了问题分解和子问题合并的代价。</p>
<p>主方法主要由以下的定理构成:</p>
<blockquote>
<p>主定理:</p>
<p>令<span class="math">\(a\ge 1,b>1\)</span>是常数,<span class="math">\(f(n)\)</span>是一个函数,<span class="math">\(T(n)\)</span>是定义在非负整数上的递归式:</p>
<p>
<div class="math">$$ T(n) = aT(\frac{n}{b}) + f(n) $$</div>
</p>
<p>那么<span class="math">\(T(n)\)</span>有如下的渐进界:</p>
<ol>
<li>
<p>若对某个常数<span class="math">\(\epsilon > 0\)</span>有<span class="math">\(f(n)=O(n^{\log_b^{a-\epsilon}})\)</span>,则<span class="math">\(T(n)=\Theta(n^{\log_b^a})\)</span></p>
</li>
<li>
<p>若<span class="math">\(f(n)=\Theta(n^{\log_b^a})\)</span>,则<span class="math">\(T(n)=\Theta(n^{\log_b^a} \lg n)\)</span></p>
</li>
<li>
<p>若对某个常数<span class="math">\(\epsilon > 0\)</span>,有<span class="math">\(f(n)=\Omega(n^{\log_b^{a+\epsilon}})\)</span>,且对某个常数<span class="math">\(c<1\)</span>和所有足够大的<span class="math">\(n\)</span>有<span class="math">\(af(\frac{n}{b})\le cf(n)\)</span>,则<span class="math">\(T(n)=\Theta(f(n))\)</span></p>
</li>
</ol>
</blockquote>
<h1>参考资料</h1>
<ul>
<li>算法导论第四章</li>
<li>Utah大学<a href="http://www.cs.utah.edu/~bhaskara/">Aditya Bhaskara</a>教授的Advanced Algorithm课程</li>
</ul>
<h1>修改日志</h1>
<ul>
<li>2014年8月5日 首次发布</li>
<li>2016年8月30日 增加递归树分析举例</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>之前遇到过类似的问题,但是基本操作是乘法,而不是加法,在这种情况下,就不能使用分治的策略了。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年7月阅读书单2014-08-01T00:00:00-06:002014-08-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-08-01:/reading-list/Reading-List-2014-July/<p>2014年7月阅读书单</p><h1>Harry Potter and the Philosopher's Stone</h1>
<p>作者: J.K. Rowling</p>
<p>本来是抱着练英语的目的去看哈利波特的英文版的,但是没想到其中的英文是非常简单的,基本没有太大的难度,而且一整本看下来就感觉是写给小孩子的童话故事(它其实就是童话故事),因此瞬间就放弃了阅读后续分册的愿望了。</p>
<hr/>
<h1>此生未完成</h1>
<p>作者: 于娟</p>
<p>这本书其实很早就知道了,但是一直没有去搜过这本书,好友找到了电子版的,于是放在kindle里花了几天的时间看完了。</p>
<p>刚开始看这本书的时候,其实心情是很沉重的,主要是因为我知道这本书复旦博士于娟留给这个世界最后的文字了,这本书是她在得癌期间所写的博客合集,包含了她对这个三十多年生命的反思,对这个世界的无限留恋,对死亡的大智大勇。</p>
<p>说实话,于娟的文字算不上优美,但是从她的字里行间,我却能看到她作为女汉子的彪悍,作为女人的柔软,作为母亲的慈爱,作为女儿的孝顺,作为病人的坚强,作为妻子的温柔。</p>
<hr/>
<h1>三体三部曲</h1>
<p>作者: 刘慈欣</p>
<p>这个系列的小说之前已经看过一遍了,最近又翻出来以最快的速度快速过了一遍,实在是佩服大刘的想象力,将一幅巨大的宇宙图景在读者眼前缓缓的拉开。他对宇宙的思考结果出人意料而又在情理之中,让人欲罢不能,深入其中。这个系列,值得收藏。</p>算法导论学习笔记1-一二三章2014-07-31T00:00:00-06:002014-07-31T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-31:/clrs/CLRS-1/<p>算法导论第一二三章的学习总结。</p><h1>第一章</h1>
<p>这一章主要介绍了算法的基本概念以及其应用范围,对于算法的定义,原文摘录如下:</p>
<blockquote>
<p><strong>算法</strong>:
算法是任何良定义的计算过程,该过程取某个值或值的集合作为<strong>输入</strong>并产生某个值或值的集合作为<strong>输出</strong>.</p>
</blockquote>
<p>需要理解是的,不是世界上所有的问题都是有有效算法的,有一些问题我们无法求得其精确解,只能求得其近似解。</p>
<h1>第二章</h1>
<p>本章一开始就抛出了一个排序问题,给出了<strong>插入排序</strong>的算法,这是最基本的一个排序算法。本书的算法描述都是用为伪代码给出的,通俗易懂。</p>
<p>然后以排序算法为例,说明算法分析的框架,主要是使用了RAM计算模型,算法复杂度可以用算法的<strong>运行时间</strong>来衡量,可以将其看成是一个以算法输入规模为参数的函数。</p>
<p>第三部分介绍归并排序的算法,并且分析了其运行效率,这里引出算法设计的一个策略:<strong>分治策略</strong>.</p>
<p>简单来说,分为分支策略分为三步:</p>
<ol>
<li>分解(Divide)</li>
<li>解决(Conquer)</li>
<li>合并(Combine)</li>
</ol>
<p>后面应该还会有相应的章节介绍分治策略,这里就只是简单说明一下。</p>
<h1>第三章</h1>
<p>本章主要说明了算法的渐进表示法,具体有几个渐进记号需要掌握:</p>
<h2><span class="math">\(\Theta\)</span>记号</h2>
<p>对一个给定的函数<span class="math">\(g(n)\)</span>,用<span class="math">\(\Theta(g(n))\)</span>来表示以下函数的集合:</p>
<blockquote>
<p><span class="math">\(\Theta(g(n)) = \{f(n): 存在正常量c_1,c_2和n_0,使得对所有n\ge n_0,有0\le c_1 g(n)\le f(n) \le c_2 g(n)\}\)</span></p>
</blockquote>
<p>从定义中可以看到,其实<span class="math">\(f(n)\)</span>是被<span class="math">\(g(n)\)</span>"夹住"了,通常称<span class="math">\(g(n)\)</span>为<span class="math">\(f(n)\)</span>的一个<strong>渐进紧确界</strong>.</p>
<h2><span class="math">\(O\)</span>记号</h2>
<p>对一个给定的函数<span class="math">\(g(n)\)</span>,用<span class="math">\(O(g(n))\)</span>来表示以下函数的集合:</p>
<blockquote>
<p><span class="math">\(O(g(n)) = \{f(n): 存在正常量c和n_0,使得对所有n\ge n_0,有0\le f(n) \le c g(n)\}\)</span></p>
</blockquote>
<p>我们通常使用<span class="math">\(O\)</span>记号来给出函数在一个常量因子内的上界,它称为<strong>渐进上界</strong>.一般来说,<span class="math">\(O\)</span>可以用来一个算法的最坏情况,因为它限制了函数的上界。</p>
<h2><span class="math">\(\Omega\)</span>记号</h2>
<p>与<span class="math">\(O\)</span>相对的,<span class="math">\(\Omega\)</span>给出了函数的<strong>渐进下界</strong>.对于给定的函数<span class="math">\(g(n)\)</span>,用<span class="math">\(\Omega\)</span>来表示以下函数的集合:</p>
<blockquote>
<p><span class="math">\(\Omega(g(n)) = \{f(n): 存在正常量c和n_0,使得对所有n\ge n_0,有0\le c g(n)\le f(n)\}\)</span></p>
</blockquote>
<hr/>
<p>上述三种记号是在算法分析中经常会被使用到的,关于这三种记号,还有有一个定理:</p>
<blockquote>
<p><strong>定理</strong>:
对任意两个函数<span class="math">\(f(n)\)</span>和<span class="math">\(g(n)\)</span>,我们有<span class="math">\(f(n)=\Theta(g(n))\)</span>,当且仅当<span class="math">\(f(n)=O(g(n))\)</span>且<span class="math">\(f(n)=\Omega(g(n))\)</span></p>
</blockquote>
<h2>其他的记号</h2>
<p>除了上述三种记号以外,还有两种不太用到的记号,分别是<span class="math">\(o\)</span>和<span class="math">\(\omega\)</span>,其定义分别如下:</p>
<blockquote>
<p><span class="math">\(o(g(n)) = \{f(n): 对任意正常量c>0,存在常量n_0>0,使得对所有n\ge n_0,有0\le f(n) < cg(n) \}\)</span></p>
</blockquote>
<p><span class="math">\(O\)</span>和<span class="math">\(o\)</span>的定义很类似,主要区别是在<span class="math">\(f(n)=O(g(n))\)</span>中,界<span class="math">\(0\le f(n)\le cg(n)\)</span>对<strong>某个</strong>常量<span class="math">\(c>0\)</span>成立,但在<span class="math">\(f(n)=o(g(n))\)</span>中,界<span class="math">\(0\le f(n)< cg(n)\)</span>对<strong>所有</strong>常量<span class="math">\(c>0\)</span>成立。</p>
<blockquote>
<p><span class="math">\(\omega(g(n)) = \{f(n): 对任意正常量c>0,存在常量n_0>0,使得对所有n\ge n_0,有0\le cg(n) < f(n)\}\)</span></p>
</blockquote>
<p>关于<span class="math">\(\Theta,O,\Omega\)</span>这三种记号的理解,可以用下图来直观的表示:</p>
<p><img alt="boud" src="http://zhouyichu.com/images/bound.png"/></p>
<p>最后需要说明的一点是,上述的这五种记号都表示的是函数的集合,而不是具体的某一个函数,因此<span class="math">\(f(n)=O(n^2)\)</span>其实表示的是<span class="math">\(f(n)\in O(n^2) )\)</span>,只是为了方便所以才写成等号的。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>算法导论学习笔记0-前言2014-07-30T00:00:00-06:002014-07-30T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-30:/clrs/CLRS-0/<p>算法导论学习笔记的第一篇,说明学习的原因以及一些约定。</p><p>从刚上大学开始就知道这本书了,本科的时候曾经抱着这本大部头啃过一段时间,当时刚接触计算机和算法,一下子上来还不能很顺溜,看得磕磕盼盼的。后来在一次和导师的交流中,得知通常CLRS是作为研究生的算法教材的,于是当机立断将这本书放回了箱底。从那时到现在,几年过去了,而我也已经读研了,现在才想到要好好看看这本书(周围好多同学都是在本科时看过这本书了,这让我感到很落后的感觉)。</p>
<p>不管过去怎样,至少现在想到了,就不能忽视这个问题,于是又买了一本最新的第三版(当时买的是第二版),准备在接下来的几个月里好好啃一下。从本科到现在,虽然从没参加过ACM,但是程序、算法也接触了不少,看起来速度应该不会太慢。</p>
<p><strong>一些约定</strong></p>
<ol>
<li>
<p>在写笔记的过程中,我会尽量我理解的东西表达清楚,由于打算这次过一遍之后,就不会再次像这次一样地毯式地看了,所以这一次尽量不会跳过任何内容,即使遇到困难的地方,我也会尽量克服的。</p>
</li>
<li>
<p>这次笔记采用的是《算法导论》第三版的中文版,第三版中的增加了一些的新的内容,比如并行算法等,值得好好学习。</p>
</li>
<li>
<p>由于学校事情也不少,还要同时准备GRE,CLRS的学习只能抽空作为"娱乐"来处理,所以并不能保证定期更新,但是我不会停止更新,既然开始了,我一定会完成它的。</p>
</li>
<li>
<p>对于书中的算法,我会用Python来进行实现,主要是因为觉得Python更加简练,有助于我们关注算法本身,而不是语言细节。</p>
</li>
</ol>随机算法学习笔记8-Random Recurrence2014-07-17T00:00:00-06:002014-07-17T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-17:/randomized-algorithm/Randomized-Algorithms-8/<p>随机算法学习笔记8,Random Recurrence</p><h1>Random Quicksort</h1>
<p>在排序算法中,最常见的就是快排了,此处我们将介绍快排算法的随机版本,并且对其进行算法分析。</p>
<p>首先,随机版本的快排描述如下:</p>
<hr/>
<p>如果<span class="math">\(\vert S \vert > 1\)</span>:</p>
<ol>
<li>均匀地从<span class="math">\(S\)</span>中选取一个<span class="math">\(x\)</span>作为中心点</li>
<li>将<span class="math">\(S\)</span>分成两个子集<span class="math">\(S_1,S_2\)</span>,其中<span class="math">\(S_1\)</span>中的元素都要比<span class="math">\(x\)</span>小,而<span class="math">\(S_2\)</span>中的元素都要比<span class="math">\(x\)</span>大.</li>
<li>递归地对<span class="math">\(S_1,S_2\)</span>进行排序</li>
</ol>
<hr/>
<p>排序算法的复杂度是用比较次数来进行衡量的,因此我们接下来就是要分析在随机版的快排算法中,元素比较次数的期望是多少。</p>
<h2>Random Recurrence</h2>
<p>现在我们来看另外一个问题,在一个给定的集合<span class="math">\(S\)</span>中,选取第<span class="math">\(k\)</span>小的元素(<span class="math">\(1\le k\le n\)</span>).这个问题,我们之前已经讨论过了,有确定性的算法也有随机化的算法,受到快排算法的启发,我们可以设计另外的算法,来解决这个问题,该算法称为<strong>RandomQS</strong>.算法描述如下:</p>
<hr/>
<p><strong>RandomQS(S,k)</strong></p>
<ol>
<li>
<p>如果<span class="math">\(\vert S\vert = 1\)</span>,返回<span class="math">\(S\)</span>;
否则从<span class="math">\(S\)</span>中随机选择一个<span class="math">\(x\)</span>,构建两个子集<span class="math">\(S_1=\{y\in S \vert y \le x\},S_2=\{y\in S \vert y > x\}\)</span></p>
</li>
<li>
<p>如果<span class="math">\(\vert S_1 \vert\ge k\)</span>,返回RandomQS(<span class="math">\(S_1\)</span>,k);如果<span class="math">\(\vert S_1 \vert < k\)</span>,返回RandomQS(<span class="math">\(S_2\)</span>,k-<span class="math">\(\vert S_1\vert\)</span>).</p>
</li>
</ol>
<hr/>
<p>这是一个递归的过程,我们不禁要问,要经过多少次递归才能得到结果?</p>
<p>如果用<span class="math">\(T(n)\)</span>表示递归调用次数的话,那么显然<span class="math">\(T(n)\)</span>是一个随机变量,且其满足如下的式子:</p>
<div class="math">$$
T(n) =
\begin{cases}
1 + T(n-X(n)) \quad n > 1\\
0 \quad n = 1
\end{cases}
$$</div>
<p>其中,<span class="math">\(X(n)\)</span>也是一个随机变量,用来表示在每一次的递归调用中,被抛弃的元素的数目。具体来说,如果当<span class="math">\(\vert S_1\vert \ge k\)</span>时,<span class="math">\(X(n)=\vert S_2 \vert\)</span>;当<span class="math">\(\vert S_1 \vert < k\)</span>时,<span class="math">\(X(n)=\vert S_1\vert\)</span>.我们想要寻找<span class="math">\(E[T(n)]\)</span>的上界。</p>
<h3>Token Game</h3>
<p>其实上述递归中抛弃元素的过程,可以建立一种Token Game的模型:</p>
<ul>
<li>初始化的时候我们有<span class="math">\(n\)</span>个Token</li>
<li>在每一轮的运行中,我们独立的选取<span class="math">\(0\le X(m)\le m\)</span>,而<span class="math">\(X(m)\)</span>只依赖于当前的Token数目<span class="math">\(m\)</span>,选取<span class="math">\(X(m)\)</span>之后抛弃<span class="math">\(X(m)\)</span>个元素。</li>
<li>当没有Token剩下时,游戏结束。</li>
</ul>
<p>一共进行的轮数用随机变量<span class="math">\(T(n)\)</span>表示.</p>
<p>这样的模型其实在实际应用中就很常见,比如随机化的数据结构<a href="http://en.wikipedia.org/wiki/Skip_list">Skip List</a>,优惠券搜集问题(Coupon Collector)和几何分布。</p>
<h3>Karp-Upfal-Wigderson bound</h3>
<p>对于Token Game来说,存在如下的定理来帮助我们确定<span class="math">\(T(n)\)</span>的上界:</p>
<blockquote>
<p>Theorem</p>
<p>假设存在如下的递归过程:</p>
<p>
<div class="math">$$
T(n)=\begin{cases}
1 + T(n-X(n)) \quad n > c \\
0 \quad n = c
\end{cases}
$$</div>
</p>
<p>其中<span class="math">\(c\)</span>是一个常量</p>
<p>如果存在一个非递减的正函数<span class="math">\(\mu(x)\)</span>对所有<span class="math">\(n\)</span>满足<span class="math">\(E[X(n)]\ge \mu(n)\)</span>,则</p>
<p><span class="math">\(E[T(n)] \le \int_{c}^n \frac{1}{\mu(x)} dx\)</span></p>
</blockquote>
<h3>应用</h3>
<p>根据上述对RandomQS算法的描述,我们可以知道,RandomQS满足如下的递归过程:</p>
<div class="math">$$
T(n) =
\begin{cases}
1 + T(n-X(n)) \quad n > 1\\
0 \quad n = 1
\end{cases}
$$</div>
<p>其中,<span class="math">\(X(n)\)</span>可以表示为:</p>
<div class="math">$$
X(n) = \begin{cases}
n - \vert S_1 \vert \quad if \vert S_1 \vert \ge k - 1\\
\vert S_1 \vert \quad if \vert S_1 \vert < k - 1
\end{cases}
$$</div>
<p>可以看到,无论<span class="math">\(k\)</span>取什么值,<span class="math">\(X(n)\)</span>都满足<span class="math">\(X(n)\ge \min(m,n-m)\)</span>,其中<span class="math">\(m\)</span>是从<span class="math">\(\{0,1,\cdots,n-1\}\)</span>中按均匀分布取出的。</p>
<p>很显然我们可以得到<span class="math">\(E[X(n)]\ge \frac{n}{4}\)</span>,根据<strong>Karp-Upfal-Wigderson bound</strong>,可以得到:</p>
<div class="math">$$
E[T(n)] \le \int_{1}^n \frac{4}{x} dx = 4\ln n
$$</div>
<h2>分析</h2>
<p>分析的基本思路是,任意两个元素发生比较的概率,然后利用期望的线性可加性来估计整个排序过程的比较次数。</p>
<p>假设输入的待排序的序列为<span class="math">\(S\)</span>,令<span class="math">\(a_i\)</span>表示序列中第<span class="math">\(i\)</span>小的元素,令<span class="math">\(X_{ij}\in \{0,1\}\)</span>来指示<span class="math">\(a_i\)</span>和<span class="math">\(a_j\)</span>是否发生比较。根据上述的算法描述,我们可以知道,只有当<span class="math">\(a_i\)</span>或<span class="math">\(a_j\)</span>被选为中心点时,它们才会发生比较。对于这样的情况,我们有如下的观测:</p>
<p><strong>观察1</strong>: 任意一对的<span class="math">\(a_i\)</span>和<span class="math">\(a_j\)</span>最多只会比较一次。这是因为第一次比较之后,他们就会被分到不同的子集中了,而不同子集中的元素是绝不会再次比较的。正因为这样,对<span class="math">\(X_{ij}\)</span>进行累加,我们就能够得到整体比较的次数。而比较次数的期望就是</p>
<div class="math">$$E\bigg[\sum\limits_{i=1}^n\sum\limits_{j>i}X_{ij}\bigg]$$</div>
<p>,而根据期望的<strong>线性可加性</strong>,我们只需要分析</p>
<div class="math">$$E[X_{ij}]$$</div>
<p>就行了。</p>
<p><strong>观察2</strong>: <span class="math">\(a_i\)</span>和<span class="math">\(a_j\)</span>会发生比较当且仅当<span class="math">\(\{a_i,a_j\}\)</span>仍然属于同一个子集,且其中之一被选为中心点.</p>
<p><strong>观察3</strong>: 如果<span class="math">\(a_i\)</span>和<span class="math">\(a_j\)</span>仍然属于同一个子集,那么所有的</p>
<div class="math">$$\{a_i,a_{i+1},\cdots,a_{j-1},a_{j}\}$$</div>
<p>都在同一个子集中。</p>
<p><strong>观察4</strong>: 在每一次的排序中,如果要使得<span class="math">\(a_i\)</span>和<span class="math">\(a_j\)</span>分开在两个不同的子集中,那么中心点一定是在</p>
<div class="math">$$\{a_i,a_{i+1},\cdots,a_{j-1},a_{j}\}$$</div>
<p>之中的。</p>
<p><strong>观察5</strong>: <span class="math">\(\{a_i,a_{i+1},\cdots,a_{j-1},a_{j}\}\)</span>中的任意一个元素都是以等概率选取的,这是因为在选取中心点的时候,是均匀的。</p>
<p>根据上述的观察,我们能够得到:</p>
<div class="math">$$
Pr[a_i 和 a_j 发生比较] \le \frac{2}{j-i+1}
$$</div>
<p>所以<span class="math">\(E[X_{ij}]=1\cdot Pr[a_i 和 a_j 发生比较]\le\frac{2}{j-i+1}\)</span></p>
<p>利用期望的线性可加性:</p>
<div class="math">$$
\begin{aligned}
E\bigg[\sum\limits_{i=1}^n\sum\limits_{j>i} \bigg] &= \sum\limits_{i=1}^n\sum\limits_{j>i}E[X_{ij}] \\
&\le \sum\limits_{i=1}^n\sum\limits_{j>i} \frac{2}{j-i+1} \\
&= \sum\limits_{i=1}^n\sum\limits_{k=2}^{n-i+1} \frac{2}{k} (Let\quad k=j-i+1) \\
&\le \sum\limits_{i=1}^n\sum\limits_{i=1}^n \frac{2}{k} \\
&= 2n\sum\limits_{k=1}^n \frac{1}{k} \\
&= 2nH(n)
\end{aligned}
$$</div>
<p>其中<span class="math">\(H(n)\)</span>是第<span class="math">\(n\)</span>个Harmonic number,它满足:</p>
<div class="math">$$
H(n) = \ln n + O(1)
$$</div>
<p>因此,对于任意长度为<span class="math">\(n\)</span>的输入来说,随机版的快排算法的比较次数的期望是<span class="math">\(O(n\log n)\)</span></p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记7-Concentraion of Measure2014-07-15T00:00:00-06:002014-07-15T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-15:/randomized-algorithm/Randomized-Algorithms-7/<p>随机算法学习笔记7,重点是概率集中现象</p><h1>The Bounded Difference Method</h1>
<p>在上一篇的<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithms-6/">笔记</a>,我们分别讲到了<a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a>中的<strong>Doob sequence</strong>和<a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a>,如果把这两个工具放到一起,会发生什么呢?如果把这两个工具组合起来,我们就能够得到一个称为"the method of averaged bounded differences"的定理.</p>
<blockquote>
<p><strong>Theorem:Method of averaged bounded differences</strong></p>
<p>令<span class="math">\(\mathbf{X} = (X_1,\cdots,X_n)\)</span>表示任意的随机变量序列,令<span class="math">\(f\)</span>表示关于<span class="math">\(X_1,\cdots,X_n\)</span>的函数,并且对于所有的<span class="math">\(1\le i\le n\)</span>满足:</p>
<p>$ \big\vert E[f(\mathbf{X})\vert X_1,\cdots,X_i] - E[f(\mathbf{X})\vert X_1,\cdots,X_{i-1}]\big\vert \le c_i $</p>
<p>则</p>
<p><span class="math">\(Pr\big[\vert f(\mathbf{X}) - E[f(\mathbf{X}) ] \vert \ge t\big] \le 2exp\bigg( - \frac{t^2}{2\sum\limits_{i=1}^n c_i^2} \bigg)\)</span>
</p>
</blockquote>
<p>证明:</p>
<p>证明过程非常简单,需要定义<span class="math">\(Y_i=E[f(\mathbf{X})\vert X_1,\cdots,X_i]\)</span>为一个<a href="http://en.wikipedia.org/wiki/Doob_martingale">Doob Martingale</a>,然后直接套用<a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a>就行了。</p>
<p><span class="math">\(\Box\)</span></p>
<p>但是,在实际情况中,上述定理的条件是很难验证的,这就大大影响了该定理的使用。因此,这里我们将会介绍另外一个比较好验证的条件,称为<a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a>.其描述如下:</p>
<blockquote>
<p>Lipschitz condition</p>
<p>一个函数<span class="math">\(f(x_1,\cdots,x_n)\)</span>对于任意的<span class="math">\(x_1,\cdots,x_n\)</span>和<span class="math">\(y_i\)</span>满足:</p>
<p>
<div class="math">$$ \vert f(x_1,\cdots,x_{i-1},x_i,x_{i+1},\cdots,x_n) - f(x_1,\cdots,x_{i-1},y_i,x_{i+1},\cdots,x_n) \vert \le c_i $$</div>
</p>
<p>则称其满足Lipschitz condition.</p>
</blockquote>
<p>当随机变量序列满足<a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a>时,有如下的定理(<strong>注意:该定理的条件中,随机变量必须是独立的!</strong>)</p>
<blockquote>
<p>Theorem(Method of bounded differnces)</p>
<p>令<span class="math">\(\mathbf{X}=(X_1,\cdots,X_n)\)</span>表示<span class="math">\(n\)</span>个<strong>独立</strong>的随机变量,令<span class="math">\(f\)</span>表示一个满足Lipschitz condition的函数,则:</p>
<p><span class="math">\(Pr[\vert f(\mathbf{X}) - E[f(\mathbf{X})] \vert \ge t ] \le 2exp\bigg( -\frac{t^2}{2\sum\limits_{i=1}^n c_i^2} \bigg)\)</span>
</p>
</blockquote>
<p>Method of bounded differnces可以理解成这样的组合:</p>
<p><strong>独立性条件</strong> <span class="math">\(+\)</span> <strong>Lipschitz condition</strong> <span class="math">\(\Rightarrow f(X_1,X_2,\cdots,X_n)\)</span>集中在它的期望附近。</p>
<p>它最大一个优势就是不需要知道具体的<span class="math">\(f\)</span>函数是什么形式的,就能得出其概率集中的结论。</p>
<h1>Applications</h1>
<h2>小球问题</h2>
<p>假设我们现在有<span class="math">\(m\)</span>个小球要以独立且均匀的分布投入到<span class="math">\(n\)</span>个箱子中,我们需要考察小球投掷完成之后,还剩多少个空箱子?根据我们之前期望的线性可加性,我们能比较简单的计算其期望值:</p>
<p>令<span class="math">\(X_i\)</span>表示第<span class="math">\(i\)</span>个箱子是否为空,<span class="math">\(X_i=1\)</span>表示箱子<span class="math">\(i\)</span>为空;否则为<span class="math">\(X_i=0\)</span>.则<span class="math">\(X=\sum\limits_{i=1}^n\)</span>表示一共有多少空个箱子,则:</p>
<div class="math">$$
\begin{aligned}
E[X_i] &= (1-\frac{1}{n})^m \\
E[X] &= \sum\limits_{i=1}^n E[X_i] = n(1-\frac{1}{n})^m\\
\end{aligned}
$$</div>
<p>虽然我们求出了空箱子数目的期望,但是这还不够,我们希望能够得到更加精确的信息来描述随机变量<span class="math">\(X\)</span>.此时,我们就可以使用<strong>method of bounded differnces</strong>.</p>
<p><strong>method of bounded differnces</strong>有两个条件:1. 独立 2. <a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a></p>
<p>而此时的<span class="math">\(X_i\)</span>显然是不独立的,因此我们需要重新假设我们的随机变量。令<span class="math">\(Y_j\)</span>表示第<span class="math">\(j\)</span>个球落入到箱子的编号,则<span class="math">\(X\)</span>可以看成是<span class="math">\((Y_1,\cdots,Y_m)\)</span>的函数,即:</p>
<div class="math">$$
X = f(Y_1,\cdots,Y_n)
$$</div>
<p>此时的<span class="math">\(Y_i\)</span>是<strong>独立</strong>的。</p>
<p>而一个球的投掷,最多只能让一个箱子变得非空,每一次只改变一个变量,引起的变化最多为<span class="math">\(1\)</span>,即满足<a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a>.因此,我们直接使用<strong>method of bounded differnces</strong>:</p>
<div class="math">$$
Pr[\vert X-E[X]\vert \ge t\sqrt{m}] = 2e^{-\frac{t^2}{2}}
$$</div>
<p>因此,对于小球投掷问题来说,空箱子的数目主要集中在<span class="math">\(n(1-\frac{1}{n})^m\)</span>附近。</p>
<h2>模式匹配问题</h2>
<p>令<span class="math">\(\mathbf{X}=(X_1,X_2,\cdots,X_n)\)</span>均匀且独立地从字符表<span class="math">\(\Sigma\)</span>中选取的字符序列,其中<span class="math">\(\vert \Sigma \vert =m\)</span>。令<span class="math">\(\pi \in \Sigma^k\)</span>是任意一个固定长度的字符串。我们想要考察<span class="math">\(\pi\)</span>在<span class="math">\(\mathbf{X}\)</span>中出现的次数。</p>
<p>令<span class="math">\(Y\)</span>表示<span class="math">\(\pi\)</span>一共在<span class="math">\(\mathbf{X}\)</span>中出现的次数, <span class="math">\(Z_i=1\)</span>表示<span class="math">\(X_i\)</span>是<span class="math">\(\pi\)</span>的起始位置,否则<span class="math">\(X_i=0\)</span>.其中,<span class="math">\(0\le i \le n-k+1\)</span>.则:</p>
<div class="math">$$
Z_i=\begin{cases}
1 \quad (\frac{1}{m})^k \\
0 \quad 1-(\frac{1}{m})^k \\
\end{cases}
$$</div>
<p>且<span class="math">\(Y=\sum\limits_{i=0}^{n-k+1}\)</span>,所以<span class="math">\(E[Y]=(n-k+1)\cdot (\frac{1}{m})^k\)</span>.</p>
<p>同样的,我们还需要知道<span class="math">\(Y\)</span>是否有概率集中现象。我们可以将<span class="math">\(Y\)</span>看成是<span class="math">\((X_1,X_2,\cdots,X_n)\)</span>的函数,且<span class="math">\((X_1,X_2,\cdots,X_n)\)</span>是独立的.</p>
<p>而又因为,<span class="math">\(\pi\)</span>的长度是<span class="math">\(k\)</span>,因此<span class="math">\((X_1,X_2,\cdots,X_n)\)</span>其中一个字符改变时,带来<span class="math">\(Y\)</span>的变化最多为<span class="math">\(k\)</span>,因此满足<a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a>.所以,直接使用<strong>method of bounded differnces</strong>:</p>
<div class="math">$$
Pr[\vert Y-E[Y] \vert \ge tk\sqrt{n}] \le 2e^{-\frac{t^2}{2}}
$$</div>
<h1>参考资料</h1>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a></li>
<li><a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a></li>
<li><a href="http://en.wikipedia.org/wiki/Doob_martingale">Doob Martingale</a> </li>
<li><a href="http://en.wikipedia.org/wiki/Lipschitz_condition">Lipschitz condition</a></li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记6-Martingales2014-07-08T00:00:00-06:002014-07-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-08:/randomized-algorithm/Randomized-Algorithms-6/<p>随机算法学习笔记6,重点是Martingales模型。</p><h1>Continoal Expectation</h1>
<p><a href="http://en.wikipedia.org/wiki/Conditional_expectation">条件期望</a>是指,在给定条件的情况下,随机变量的期望值.条件期望可以表示成:</p>
<div class="math">$$
E[Y\vert X=a]
$$</div>
<p>我们可以将条件期望看成是关于<span class="math">\(X\)</span>的随即变量<span class="math">\(f(X)\)</span></p>
<p>假设<span class="math">\(X,Y,Z\)</span>是三个任意的随机变量,<span class="math">\(f,g\)</span>是任意的函数,则对于条件期望有如下的结论:</p>
<ol>
<li><span class="math">\(E[X]=E\big[E[X\vert Y] \big]\)</span>.</li>
<li><span class="math">\(E[X\vert Z]=E\big[E[X\vert Y,Z]\vert Z \big]\)</span></li>
<li><span class="math">\(E\big[E[f(X)g(X,Y)\vert X]\big]=E\big[f(X)\cdot E[g(X,Y)\vert X]\big]\)</span>(条件于<span class="math">\(X\)</span>,因此可以将<span class="math">\(f(X)\)</span>看成是一个常数,根据期望的线性可加性,就能够把<span class="math">\(f(X)\)</span>提出来了)</li>
</ol>
<h1>Martingales</h1>
<p><a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a>描述的是一系列的随机变量,该序列的当前的随机变量依赖之前所有的历史随机变量<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,如果当前的随机变量的期望不发生变化,则这整个随机过程就被称为是<a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a>.</p>
<blockquote>
<p>定义: Martingale</p>
<p>一个随机变量序列<span class="math">\(X_0,\cdots,X_{i-1}\)</span>是一个Martingale当且仅当对于所有的<span class="math">\(i>0\)</span>,都有:</p>
<p>
<div class="math">$$E[X_i \vert X_0,\cdots,X_{i-1}] = X_{i-1} $$</div>
</p>
</blockquote>
<h2>举例</h2>
<p>假设我们投掷一个均匀的硬币,令<span class="math">\(Z_j\in \{-1,1\}\)</span>表示第<span class="math">\(j\)</span>次投掷的结果,令<span class="math">\(X_0=0\)</span>和<span class="math">\(X_i=\sum\limits_{j\le i}Z_j\)</span>,则随机变量<span class="math">\(X_0,X_1,\cdots\)</span>定义了一个Martingale.</p>
<p>证明:</p>
<div class="math">$$
\begin{aligned}
E[X_i\vert X_0,\cdots,X_{i-1}] &= E[X_i\vert X_{i-1}] \\
&= E[X_{i-1}+Z_i\vert X_{i-1}] \\
&= E[X_{i-1}\vert X_i] + E[Z_i\vert X_{i-1}] \\
&= X_{i-1} + E[Z_i\vert X_{i-1}]\\
&= X_{i-1} + E[Z_i] \\
&= X_{i-1}
\end{aligned}
$$</div>
<h2>Generalizations</h2>
<p>Martingale还有更加一般化的定义,它不再只是一个只关于自己的随机序列,而是关于另外一个随机序列。</p>
<blockquote>
<p>定义 Generalized Martingale</p>
<p>一个随机变量序列<span class="math">\(Z_0,Z_1,\cdots\)</span>是一个关于<span class="math">\(X_0,X_1,\cdots\)</span>的Martingale,当且仅当对于任意的<span class="math">\(i>0\)</span>,满足下述三个条件:</p>
<ol>
<li><span class="math">\(Z_i\)</span>是<span class="math">\(X_0,X_1,\cdots,X_{i}\)</span>的函数</li>
<li><span class="math">\(E[\vert Z_i \vert] = \infty\)</span></li>
<li><span class="math">\(E[Z_{i+1}\vert X_0,X_1,\cdots,X_i] = Z_i\)</span></li>
</ol>
</blockquote>
<p>因此,如果一个随机变量序列<span class="math">\(X_0,X_1,\cdots\)</span>是关于自己的Martingale,那么它自身就是一个Martingale.</p>
<h1>Azuma's Inequality</h1>
<p>关于Martingale有一个比较重要的不等式,称为<a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a>,描述如下:</p>
<blockquote>
<p>Azuma's inequality</p>
<p>假设<span class="math">\(X_0,X_1,\cdots\)</span>是一个Martingale,且对于所有的<span class="math">\(k>1\)</span>,都有:</p>
<p>
<div class="math">$$\vert X_k - X_{k-1} \vert \le c_k$$</div>
</p>
<p>则</p>
<p><span class="math">\(Pr[\vert X_n-X_0 \vert \ge t] \le 2exp\bigg(-\frac{t^2}{2\sum\limits_{k=1}^n c_k^2}\bigg)\)</span>.
</p>
</blockquote>
<p>需要注意的是,在这个不等式中,是<strong>没有独立性</strong>要求的。</p>
<p>其中<span class="math">\(\vert X_k - X_{k-1}\vert \le c_k\)</span>的条件是整个不等式的核心,称为<strong>bounded difference condition</strong>.</p>
<p>该不等式描述的是,如果将<span class="math">\(X_0,X_1,\cdots\)</span>看成是随时间变换的状态的话,那么如果每一步的状态转换都没有出现大的跳跃,那么该不等式就保证整个过程一直处于其初始点附近。</p>
<p>其中有一种特殊情况,当<span class="math">\(c_k=c\)</span>的时候,不等式可以写成:</p>
<blockquote>
<p>假设<span class="math">\(X_0,X_1,\cdots\)</span>是一个Martingale,且对于所有的<span class="math">\(k>1\)</span>,都有:</p>
<p>
<div class="math">$$\vert X_k - X_{k-1} \vert \le c$$</div>
</p>
<p>则</p>
<p><span class="math">\(Pr[\vert X_n-X_0 \vert \ge ct\sqrt{n}] \le 2e^{-\frac{t^2}{2}}\)</span>
</p>
</blockquote>
<p>还有一般化的Azuma's Inequality:</p>
<blockquote>
<p>Azuma's inequality(general version)</p>
<p>假设<span class="math">\(Y_0,Y_1,\cdots\)</span>是关于<span class="math">\(X_0,X_1,\cdots\)</span>的一个Martingale,且对于所有的<span class="math">\(k>1\)</span>,都有:</p>
<p>
<div class="math">$$\vert Y_k - Y_{k-1} \vert \le c_k$$</div>
</p>
<p>则</p>
<p><span class="math">\(Pr[\vert Y_n-Y_0 \vert \ge t] \le 2exp\bigg(-\frac{t^2}{2\sum\limits_{k=1}^n c_k^2}\bigg)\)</span>.
</p>
</blockquote>
<h2>证明</h2>
<p>Azuma's Inequality的证明过程和<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithm-5/">笔记5</a>中证明<a href="http://en.wikipedia.org/wiki/Chernoff_bound">Chernoff Bound</a>的方法类似,先在<a href="http://en.wikipedia.org/wiki/Moment-generating_function">Moment Generating Function</a> 上使用<a href="http://en.wikipedia.org/wiki/Markov_inequality">Markov不等式</a>,然后确定这个<a href="http://en.wikipedia.org/wiki/Moment-generating_function">Moment Generating Function</a>的上界,最终选取合适的参数。</p>
<p>在正式开始证明之前,我们先要证明一个引理:</p>
<blockquote>
<p>引理</p>
<p>令<span class="math">\(X\)</span>为一个随机变量满足<span class="math">\(E[X]=0\)</span>且<span class="math">\(\vert X\vert \le c\)</span>,则对于任何的<span class="math">\(\lambda > 0\)</span>,有:</p>
<p><span class="math">\(E[e^{\lambda X}] \le e^{\lambda^2\frac{c^2}{2}}\)</span></p>
</blockquote>
<p>证明:</p>
<p>通过观察,我们可以看到函数<span class="math">\(e^{\lambda X}\)</span>在定义域<span class="math">\([c,c]\)</span>上是一个凸函数,所以如果我们在点<span class="math">\((-c,e^{-\lambda c})\)</span>和<span class="math">\((c,e^{\lambda c})\)</span>画一条直线,则<span class="math">\(e^{\lambda X}\)</span>的曲线必然在直线的下方。也即:</p>
<div class="math">$$
e^{\lambda X} \le \frac{e^{\lambda c} + e^{-\lambda c}}{2} + \frac{X}{2c}(e^{\lambda c}-e^{-\lambda c})
$$</div>
<p>因为<span class="math">\(E[X]=0\)</span>,因此:</p>
<div class="math">$$
\begin{aligned}
E[e^{\lambda X}] &\le E\bigg[\frac{e^{\lambda c} + e^{-\lambda c}}{2} + \frac{X}{2c}(e^{\lambda c}-e^{-\lambda c})\bigg] \\
&= \frac{e^{\lambda c} + e^{-\lambda c}}{2} + \frac{e^{\lambda c}-e^{-\lambda c}}{2c}E[X] \\
&= \frac{e^{\lambda c} + e^{-\lambda c}}{2} \\
&\le e^{\lambda^2\frac{c^2}{2}}
\end{aligned}
$$</div>
<p>上式中的最后一个不等式是根据<a href="http://en.wikipedia.org/wiki/Taylor_series">泰勒展开式</a>得到的。</p>
<p><span class="math">\(\Box\)</span></p>
<p>现在开始正式证明Azuma's Inequality<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>:</p>
<p><strong>偏移之和</strong></p>
<p>令<span class="math">\(Y_i = X_i - X_{i-1}\)</span>,则:</p>
<div class="math">$$
\begin{aligned}
E[Y_i\vert X_0,\cdots,X_{i-1}] &= E[X_i-X_{i-1}\vert X_0,\cdots,X_{i-1}] \\
&= E[X_i \vert X_0,\cdots,X_{i-1}] - E[X_{i-1}\vert X_0,\cdots,X_{i-1}] \\
&= X_{i-1} - X_{i-1} \\
&= 0
\end{aligned}
$$</div>
<p>令<span class="math">\(Z_n=\sum\limits_{i=1}^n Y_i\)</span>,则</p>
<div class="math">$$
Z_n=(X_1-X_0) + (X_2-X_1) + \cdots +(X_n-X_{n-1}) = X_n-X_0
$$</div>
<p>现在我们就需要找出<span class="math">\(Z_n\)</span>的上界。</p>
<p><strong>应用Markov不等式</strong></p>
<div class="math">$$
\begin{aligned}
Pr[Z_n \ge t] &= Pr[e^{\lambda Z_n}\ge e^{\lambda t}]\\
&\le \frac{E[e^{\lambda Z_n}]}{e^{\lambda t}}
\end{aligned}
$$</div>
<p>接下去就要寻找<span class="math">\(E[e^{\lambda Z_n}]\)</span>的上界。</p>
<div class="math">$$
\begin{aligned}
E[e^{\lambda Z_n}] &= E\big[ E[e^{\lambda Z_n}\vert X_0,\cdots,X_{n-1}] \big] \\
&= E\big[ E[e^{\lambda (Z_{n-1}+Y_n)}\vert X_0,\cdots,X_{n-1}] \big] \\
&= E\big[ E[e^{\lambda Z_{n-1}} \cdot e^{\lambda Y_n}\vert X_0,\cdots,X_{n-1}] \big] \\
&= E\big[ e^{\lambda Z_{n-1}} \cdot E[ e^{\lambda Y_n}\vert X_0,\cdots,X_{n-1}] \big] \\
\end{aligned}
$$</div>
<p>又因为</p>
<div class="math">$$E[Y_n\vert X_0,\cdots,X_{n-1}] = 0$$</div>
<p>且</p>
<div class="math">$$\vert Y_n \vert =\vert (X_n-X_{n-1}) \vert \le c_n$$</div>
<p>,所以直接套用之前证明的引理:</p>
<div class="math">$$
E[e^{\lambda Y_n}\vert X_0,\cdots,X_{n-1}] \le e^{\lambda^2 \frac{c_n^2}{2}}
$$</div>
<p>将其代回到<span class="math">\(E[e^{\lambda Z_n}]\)</span>中:</p>
<div class="math">$$
\begin{aligned}
E[e^{\lambda Z_n}] &= E\big[ e^{\lambda Z_{n-1}} \cdot E[ e^{\lambda Y_n}\vert X_0,\cdots,X_{n-1}] \big] \\
&\le E[e^{\lambda Z_{n-1}} \cdot e^{\lambda^2 \frac{c_n^2}{2}} ] \\
&= e^{\lambda^2 \frac{c_n^2}{2}} \cdot E[e^{\lambda Z_{n-1}}] \\
\end{aligned}
$$</div>
<p>将其递归展开:</p>
<div class="math">$$
\begin{aligned}
E[e^{\lambda}] &\le \prod\limits_{k=1}^n e^{\lambda^2 \frac{c_n^2}{2}} \\
&= \bigg( \lambda^2 \sum\limits_{k=1}^n \frac{c_k^2}{2} \bigg) \\
\end{aligned}
$$</div>
<p>代回到Markov不等式中:</p>
<div class="math">$$
\begin{aligned}
Pr[Z_n \ge t] &= \frac{E[e^\lambda Z_n]}{e^{\lambda t}} \\
&\le exp\bigg(\lambda^2 \sum\limits_{k=1}^n \frac{c_k^2}{2} -\lambda t \bigg)
\end{aligned}
$$</div>
<p><strong>选取合适的<span class="math">\(\lambda\)</span></strong></p>
<p>令<span class="math">\(\lambda = \frac{t}{\sum\limits_{k=1}^n c_k^2}\)</span>,则</p>
<div class="math">$$
exp\bigg(\lambda^2 \sum\limits_{k=1}^n \frac{c_k^2}{2} -\lambda t \bigg) = exp\bigg(-\frac{t^2}{2\sum\limits_{k=1}^nc_k^2} \bigg)
$$</div>
<p>所以:</p>
<div class="math">$$
\begin{aligned}
Pr[X_n - X_0 \ge t] &= Pr[Z_n \ge t] \\
&\le exp\bigg(\lambda^2\sum\limits_{k=1}^n \frac{c_k^2}{2}-\lambda t \bigg) \\
&= \bigg( -\frac{t^2}{2\sum\limits_{k=1}^n c_k^2} \bigg)
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<h1>The Doob martingales</h1>
<p>在Martingale中,有一类的Martingale比较重要,称为<a href="http://en.wikipedia.org/wiki/Doob_martingale">Doob Martingale</a>.</p>
<p>首先,我们先定义<strong>Doob Sequence</strong>,其定义如下:</p>
<blockquote>
<p>定义: <strong>Doob Sequence</strong></p>
<p>函数f关于随机变量<span class="math">\(X_1,X_2,\cdots\)</span>的Doob Sequence定义如下:</p>
<p><span class="math">\(Y_i = E[f(X_1,\cdots,X_n) \vert X_1,\cdots,X_i], 0 \le i \le n\)</span></p>
<p>特别地,<span class="math">\(Y_0=E[f(X_1,\cdots,X_n)]\)</span>且<span class="math">\(Y_n=f(X_1,\cdots,X_n)\)</span></p>
</blockquote>
<p>一个函数的Doob Sequence定义了一个Martingale,也就是说:</p>
<div class="math">$$
E[Y_i\vert X_1,\cdots,X_{i-1}] = Y_{i-1}
$$</div>
<p>证明:</p>
<div class="math">$$
\begin{aligned}
E[Y_i\vert X_1,\cdots,X_{i-1}] &= E\big[ E[f(X_1,\cdots,X_n) \vert X_1,\cdots,X_i] \vert X_1,\cdots,X_{i-1} \big] \\
&= E[f(X_1,\cdots,X_n)\vert X_1,\cdots,X_{i-1}] \\
&= Y_{i-1}
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<p>Doob Martingale是一个估计函数值的随机过程,对于关于随机变量<span class="math">\(X_1,\cdots,X_n\)</span>的函数<span class="math">\(f(X_1,\cdots,X_n)\)</span>,<span class="math">\(Y_0,Y_1,\cdots,Y_n\)</span>表示对函数值的一个估计,<span class="math">\(Y_i\)</span>表示,当已知<span class="math">\(X_1,\cdots,X_i\)</span>时,函数值<span class="math">\(f(X_1,\cdots,X_n)\)</span>的期望,
即<span class="math">\(Y_i=E[f(X_1,\cdots,X_n)\vert X_1,\cdots,X_i]\)</span>.因此,<span class="math">\(Y_0\)</span>表示在<span class="math">\(X_1,\cdots,X_n\)</span>全都未知的情况下,<span class="math">\(f(X_1,\cdots,X_n)\)</span>的期望,即<span class="math">\(Y_0=E[f(X_1,\cdots,X_n)]\)</span>;而<span class="math">\(Y_n\)</span>表示在<span class="math">\(X_1,\cdots,X_n\)</span>全部已知的情况下,<span class="math">\(f(X_1,\cdots,X_n)\)</span>的期望,也就是其在自身的函数值,也即<span class="math">\(Y_n=f(X_1,\cdots,X_n)\)</span>.</p>
<h2>举例</h2>
<h3>Edge Exposure Martingale</h3>
<p>令<span class="math">\(G\)</span>表示一个有<span class="math">\(n\)</span>个点的随机图,<span class="math">\(f\)</span>为一个这个随机图的一个函数,这个函数可以是随机图的任意的性质,比如染色数、包含三角的数目等等。令<span class="math">\(e_1,e_2,\cdots,e_m,m=\binom{n}{2}\)</span>表示图中所有可能出现的边,令:</p>
<div class="math">$$
X_i=\begin{cases}
1\quad if e_i\in G\\
0\quad otherwise
\end{cases}
$$</div>
<p>定义<span class="math">\(Y_i=E[f(G)\vert X_1,X_2,\cdots,X_i]\)</span>,则<span class="math">\(Y_0,Y_1,\cdots,Y_n\)</span>形成了一个Doob Martingale,通常称为<strong>edge exposure martingale</strong>.</p>
<h3>Vertex Exposure Martingale</h3>
<p>在edge exposure martingale中我们是不断暴露出边,其实我们也可以不断暴露点,假设随机图的点集为<span class="math">\([n]\)</span>,则令<span class="math">\(X_i\)</span>表示由点集<span class="math">\([i]\)</span>组成的子图.令<span class="math">\(Y_i=E[f(G)\vert X_1,\cdots,X_i]\)</span>.则<span class="math">\(Y_0,Y_1,\cdots,Y_n\)</span>也定义了一个Doob Martingale,通常称为<strong>vertex exposure martingale</strong>.</p>
<h3>Chromatic number</h3>
<blockquote>
<p>定理</p>
<p>令<span class="math">\(G\sim G(n,p)\)</span>,且<span class="math">\(\chi(G)\)</span>表示图<span class="math">\(G\)</span>的染色数,则</p>
<p><span class="math">\(Pr[\vert \chi(G) - E[\chi(G)] \vert \ge t\sqrt{n}] \le 2e^{-\frac{t^2}{2}}\)</span></p>
</blockquote>
<p>证明:</p>
<p>考虑图G的vertex exposure martingale,<span class="math">\(Y_i=E[\chi(G)\vert X_1,\cdots,X_i]\)</span>.</p>
<p>可以想像,每当我们暴露出一个点的时候,我们总可以用一种新的颜色去染色,也就是说它满足<strong>bounded difference condition</strong>:</p>
<div class="math">$$
\vert Y_i - Y_{i-1} \vert \le 1
$$</div>
<p>因此,我们对<span class="math">\(Y_0,\cdots,Y_n\)</span>直接套用Azuma's Inequality,就得到了上述的结论。</p>
<p><span class="math">\(\Box\)</span></p>
<h3>Hoeffding's Inequality</h3>
<blockquote>
<p>Hoeffding's Inequality</p>
<p>令<span class="math">\(X=\sum\limits_{i=1}^n X_i\)</span>,其中<span class="math">\(X_1,\cdots,X_n\)</span>是独立的随机变量,且<span class="math">\(a_i\le X_i\le b_i\)</span>,对于所有的<span class="math">\(1\le i\le n\)</span>,令<span class="math">\(\mu=E[X]\)</span>,则:</p>
<p>{% math %}Pr[\vert X-\mu \vert\ge t]\le 2exp\bigg( -\frac{2}{2\sum\limits_{i=1}^n(b_i-a_i)^2} \bigg){% endmath %}</p>
</blockquote>
<p>证明:</p>
<p>定义Doob Sequence:<span class="math">\(Y_i=E\bigg[ \sum\limits_{j=1}^n X_j\big\vert X_1,\cdots,X_i\bigg]\)</span>,很明显我们有<span class="math">\(Y_0=\mu\)</span>且<span class="math">\(Y_n=X\)</span>.</p>
<p>同时,<span class="math">\(\vert Y_i-Y_{i-1} \vert\le b_i-a_i\)</span>,所以,使用一般化的Azuma's Inequality,就能得到上述结论。</p>
<p><span class="math">\(\Box\)</span></p>
<h1>Stoppinng Times</h1>
<p>在Martingale中,还有另外一种问题,称为Stoppinng Times,比如在赌博的时候,令<span class="math">\(Z_i\)</span>表示玩家在第i局之后的赢钱数,很显然<span class="math">\(Z_1,Z_2,\cdots\)</span>形成了一个Martingale,如果玩家决定在第<span class="math">\(k\)</span><sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>局之后就退出赌局,那么这个玩家期望的赢钱数是多少?</p>
<p>首先介绍一个引理:</p>
<blockquote>
<p>引理</p>
<p>假设<span class="math">\(Z_0,Z_1,\cdots,Z_n\)</span>是关于<span class="math">\(X_0,X_1,\cdots,X_n\)</span>的一个Martingale,则</p>
<p>
<div class="math">$$ E[Z_n] = E[Z_0] $$</div>
</p>
</blockquote>
<p>证明:</p>
<p>根据Martingale的定义,我们有:</p>
<div class="math">$$
E[Z_{i+1}\vert X_0,\cdots,X_i] = Z_i
$$</div>
<p>
两边同时取期望,得到:</p>
<div class="math">$$
E\big[E[Z_{i+1} \vert X_0,\cdots,X_n]\big] = E[Z_{i+1}] = E[Z_i]
$$</div>
<p>不断重复上述过程,就能够得到:</p>
<div class="math">$$
E[Z_n] = E[Z_0]
$$</div>
<p><span class="math">\(\Box\)</span></p>
<p>有了上述的引理,我们就能说,如果在赌局开始之前就确定玩的轮数的话,那么期望的盈利就是0.</p>
<p>当然,一般在真实的场景中,情况要复杂得多,比如停止轮数是由当前的盈利状况来决定的。为了分析这种情况,我们需要引入Stoppinng Time的定义:</p>
<blockquote>
<p>Stoppinng Time</p>
<p>令<span class="math">\(\{Z_n,n\ge 0\}\)</span>为一个随机变量序列,<span class="math">\(T\)</span>为一个非负的整数随机变量,如果事件<span class="math">\(T=n\)</span>只依赖于<span class="math">\(Z_0,Z_1,\cdots,Z_n\)</span>,则<span class="math">\(T\)</span>就是<span class="math">\(\{Z_n,n\ge 0\}\)</span>的一个Stoppinng Time.</p>
</blockquote>
<p>结合上面关于Martingale的引理,如果赌局是公平的话,那么<span class="math">\(E[X_T]=E[X_0]=0\)</span>一直成立。但是,如果Stoppinng Time <span class="math">\(T\)</span>定义成第一次<span class="math">\(Z_i>B\)</span>,其中<span class="math">\(B\)</span>是一个固定的常量,则此时期望的盈利应该是大于<span class="math">\(0\)</span>的,然而此时的Stoppinng Time未必是有限的。</p>
<blockquote>
<p>Martingale Stoppinng Theorem</p>
<p>如果<span class="math">\(Z_0,Z_1,\cdots\)</span>是关于<span class="math">\(X_0,X_1,\cdots\)</span>的Martingale,且<span class="math">\(T\)</span>是<span class="math">\(X_1,X_2,\cdots\)</span>的一个Stoppinng Time,则:</p>
<p>当如下三个条件中的任意一个满足时:</p>
<ol>
<li>
<p><span class="math">\(Z_i\)</span>是有界的,即存在一个常数<span class="math">\(c\)</span>,使得对任意的<span class="math">\(i\)</span>,都有<span class="math">\(\vert Z_i\vert\le c\)</span></p>
</li>
<li>
<p><span class="math">\(T\)</span>是有界的</p>
</li>
<li>
<p><span class="math">\(E[T] < \infty\)</span>且存在一个常数<span class="math">\(c\)</span>使得<span class="math">\(E[\vert Z_{i+1}-Z_i\vert \big\vert X_1,\cdots,X_i]<c\)</span></p>
</li>
</ol>
<p>等式</p>
<p>
<div class="math">$$E[Z_T] = E[Z_0]$$</div>
</p>
<p>成立</p>
</blockquote>
<h2>举例</h2>
<p>考虑一个独立且公平的赌局,在每一轮的赌局中,玩家分别以<span class="math">\(\frac{1}{2}\)</span>的概率赢得1元或输掉1元.令<span class="math">\(X_i\)</span>表示第i轮所赢的数目,<span class="math">\(Z_i\)</span>表示第i轮之后一共赢得的数目,其中<span class="math">\(Z_0=0\)</span>,假设玩家第一次输掉<span class="math">\(l_1\)</span>元或赢得<span class="math">\(l_2\)</span>元时退出赌局,那么请问玩家在输掉<span class="math">\(l_1\)</span>元之前赢得<span class="math">\(l_2\)</span>元的概率是多少?<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup></p>
<p>分析:</p>
<p>令<span class="math">\(T\)</span>表示玩家第一次输掉<span class="math">\(l_1\)</span>元或赢得<span class="math">\(l_2\)</span>元时的轮数,则<span class="math">\(T\)</span>是<span class="math">\(X_1,X_2,\cdots\)</span>的一个Stoppinng Time.而<span class="math">\(Z_0,Z_1,\cdots\)</span>则是个Martingale.因为<span class="math">\(Z_i\)</span>是有界的,因此满足Martingale Stoppinng Theorem的条件,因此我们有:</p>
<div class="math">$$
E[Z_T] = E[Z_0] = 0
$$</div>
<p>令<span class="math">\(q\)</span>表示赢得<span class="math">\(l_2\)</span>元的概率,则:</p>
<div class="math">$$
E[Z_T] = l_2q - l_1(1-q) = 0
$$</div>
<p>我们可以得到:</p>
<div class="math">$$
q = \frac{l_1}{l_1+l_2}
$$</div>
<h1>Wald's Equation</h1>
<p>我们可以看到,在上述的Martingale Stoppinng Theorem中并没有要求随机变量必须是独立的,这体现出了Martingale的强大力量,但是如果随机变量是独立的,会发生什么呢?对于独立的随机变量的序列,我们有如下的定理:</p>
<blockquote>
<p>Theorem: Wald's Equation</p>
<p>令<span class="math">\(X_1,X_2,\cdots\)</span>是非负,独立同分布的随机变量序列,且这些随机变量都服从分布<span class="math">\(X\)</span>.令<span class="math">\(T\)</span>表示这个序列的一个Stoppinng Time。如果<span class="math">\(T\)</span>和<span class="math">\(X\)</span>的期望都是有界的,则:</p>
<p>
<div class="math">$$ E\bigg[\sum\limits_{i=1}^T X \bigg] = E[T]E[X]$$</div>
</p>
</blockquote>
<p>证明:</p>
<p>对于<span class="math">\(i\ge 1\)</span>,令<span class="math">\(Z_i=\sum\limits_{j=1}^i(X_j-E[X])\)</span>,则</p>
<div class="math">$$
\begin{aligned}
E\bigg[Z_{i+1}\vert X_1,X_2,\cdots,X_i\bigg] &= E\bigg[\sum\limits_{j=1}^i(X_j-E[X]) +X_{i+1}-E[X] \bigg \vert X_1,X_2,\cdots,X_i\bigg] \\
&= E\bigg[\sum\limits_{j=1}^i(X_j-E[X])\bigg\vert X_1,X_2,\cdots,X_i\bigg] + E\bigg[X_{i+1}-E[X]\bigg\vert X_1,X_2,\cdots,X_i\bigg] \\
&= \sum\limits_{j=1}^i(X_j-E[X]) + E[X_{i+1}-E[X]] \\
&= \sum\limits_{j=1}^i(X_j-E[X]) \\
&= Z_i
\end{aligned}
$$</div>
<p>所以,<span class="math">\(Z_1,Z_2,\cdots\)</span>形成了一个关于<span class="math">\(X_1,X_2,\cdots\)</span>的Martingale.又因为<span class="math">\(E[T]<\infty\)</span>且:</p>
<div class="math">$$
E[\vert Z_{i+1} - Z_i \vert \big\vert X_1,\cdots,X_i] = E[\vert X_{i+1} - E[X] \vert] \le 2E[X].
$$</div>
<p>因此,我们可以使用Martingale Stoppinng Theorem:</p>
<div class="math">$$
E[Z_T] = E[Z_1] = 0
$$</div>
<p>因为,我们可以做如下计算:</p>
<div class="math">$$
\begin{aligned}
E[Z_T] &= E\bigg[\sum\limits_{j=1}^T(X_j-E[X]) \bigg] \\
&= E\bigg[\bigg(\sum\limits_{j=1}^T X_j\bigg) - TE[X] \bigg] \\
&= E\bigg[\sum\limits_{j=1}^T X_j\bigg] - E[T]E[X] \\
&= 0
\end{aligned}
$$</div>
<p>即得到:</p>
<div class="math">$$
E\bigg[\sum\limits_{j=1}^T\bigg] = E[T]\cdot E[X]
$$</div>
<p>关于独立随机变量序列,还有另外一种Stoppinng Time的定义:</p>
<blockquote>
<p>定义:</p>
<p>令<span class="math">\(Z_0,Z_1,\cdots,Z_n\)</span>是一个独立的随机变量序列,<span class="math">\(T\)</span>是一个非负的,整数随机变量,如果事件<span class="math">\(T=n\)</span>独立于<div class="math">$$Z_{n+1},Z_{n+2},\cdots$$</div>,则<span class="math">\(T\)</span>是当前序列的一个Stoppinng Time</p>
</blockquote>
<h2>举例</h2>
<p>假设一个玩家参加一个赌局,他首先抛掷一个标准的骰子,得到的点数为<span class="math">\(X\)</span>,则第二次他同时抛掷<span class="math">\(X\)</span>个标准的骰子,假设这<span class="math">\(X\)</span>个骰子所有点数之和为<span class="math">\(Z\)</span>,问<span class="math">\(Z\)</span>的期望是多少?</p>
<p>分析:</p>
<p>对于<span class="math">\(1\le i\le X\)</span>,令<span class="math">\(Y_i\)</span>表示第<span class="math">\(i\)</span>个骰子得到的点数,则<span class="math">\(E[Z]=E\bigg[\sum\limits_{i=1}^X Y_i\bigg]\)</span>,根据上述的定义,<span class="math">\(X\)</span>是一个Stoppinng Time,因此根据Wald's Equation,我们得到:</p>
<div class="math">$$
E[Z] = E[X]\cdot E[Y_i] = \bigg(\frac{7}{2}\bigg) = \frac{49}{2}
$$</div>
<h1>总结</h1>
<p>本片文章主要介绍了有关Martingale的有关内容,首先从<a href="http://en.wikipedia.org/wiki/Conditional_expectation">条件期望</a>开始,引出了<a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a>的定义,<strong>Martingales</strong>是一个比较有用工具,主要用来分析一个随机变量的序列.<strong>Martingales</strong>的一个优势就是,它不要求独立性,这就比较强大了。</p>
<p><strong>Martingales</strong>的定义之后,我们介绍<a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a>,这里比较重要的是<strong>bounded difference condition</strong>,它保证了<strong>Martingales</strong>的序列不会离开初始状态太"远".</p>
<p>接着说明了一类特殊的<strong>Martingales</strong>——<a href="http://en.wikipedia.org/wiki/Doob_martingale">Doob Martingale</a>,它描述了当序列中的随机变量逐渐被确定时,其函数值期望的变化过程。</p>
<p>最后介绍了<strong>Martingales</strong>中的Stoppinng Time相关的内容,描述了序列停止时的性质。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Conditional_expectation">Condtional Expecation</a></li>
<li><a href="http://en.wikipedia.org/wiki/Martingale_(probability_theory)">Martingales</a></li>
<li><a href="http://en.wikipedia.org/wiki/Azuma%27s_inequality">Azuma's inequality</a></li>
<li><a href="http://en.wikipedia.org/wiki/Chernoff_bound">Chernoff Bound</a></li>
<li><a href="http://en.wikipedia.org/wiki/Markov_inequality">MarkovInequity</a></li>
<li><a href="http://en.wikipedia.org/wiki/Moment-generating_function">Moment Generating Function</a></li>
<li><a href="http://en.wikipedia.org/wiki/Taylor_series">Taylor Series</a> </li>
<li><a href="http://en.wikipedia.org/wiki/Doob_martingale">Doob Martingale</a> </li>
<li>《Probability and Computing:Randomized Algorithms and Probabilistic Analysis》</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>有点类似于Markov过程,只是依赖于之前所有的状态。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这里只证明原始的Azuma's Inequality,一般化的证明过程基本类似. <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>此处的k在赌局开始之前就已经确定了。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>《Probability and Computing》这本书的12.2.1节有一个更加复杂的例子,这里只举一个比较简单的例子。 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>单链表环问题2014-07-07T00:00:00-06:002014-07-07T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-07:/algorithm/Linked-List-Cycle/<p>分析了单链表中的环问题,不仅回答了是否存在环,还说明如何计算环的长度以及找出环的起始位置。</p><p>在很多面试、笔试题目中,经常会出现一些关于单链表的题目,其中比较常见的主要就是问你如何判断一个单链表是否含有环。这是一个比较简单的问题,但是其实还可以问的更难一些的,比如:如何计算环的长度?如何找出环的起始位置?本文对这三个问题分别进行了分析。</p>
<h1>是否含有环</h1>
<p>这是一个最常见的问题,答案也是非常简单的,只要设置两个步长分别1和2的指针<span class="math">\(p,q\)</span>,同时从head开始遍历整个链表,如果链表中含有环的话,则这两个指针<span class="math">\(p,q\)</span>迟早会相遇;如果不存在环,则<span class="math">\(p,q\)</span>永不相遇。</p>
<h1>计算环的长度</h1>
<p>这个问题承接于上一个问题,如果存在环的话,那么<span class="math">\(p,q\)</span>相遇的位置一定是在环内部,则此时只需要固定<span class="math">\(p\)</span>,让<span class="math">\(q\)</span>以步长1继续往前走,记录其步数,直到再次遇到<span class="math">\(p\)</span>,则<span class="math">\(q\)</span>所走步数就是环的长度。</p>
<h1>环的起始位置</h1>
<p>这个问题同样是承接于第一个问题,这个方法稍微有些复杂,首先说明一个算法过程,然后再证明它。</p>
<p>假设<span class="math">\(p,q\)</span>相遇在<span class="math">\(k\)</span>,此时令<span class="math">\(p\)</span>指向head(此时,q指向k,p指向head),然后<span class="math">\(p,q\)</span>分别继续往下遍历(步长为1),当<span class="math">\(p,q\)</span>再次相遇的时候,相遇的节点就是环开始的位置。</p>
<p>证明:</p>
<p>假设链表中环的起始位置为<span class="math">\(S\)</span>,head与<span class="math">\(S\)</span>之间有<span class="math">\(\mu\)</span>个节点,环的长度<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>为<span class="math">\(n\)</span>,<span class="math">\(p,q\)</span>第一次相遇的位置为<span class="math">\(K\)</span>,<span class="math">\(S\)</span>与<span class="math">\(K\)</span>之间有<span class="math">\(k\)</span>个节点(<span class="math">\(k\le n\)</span>)。假设p的步长为1,q的步长为2,令<span class="math">\(x\)</span>表示<span class="math">\(q\)</span>从head到<span class="math">\(K\)</span>一共经过的节点数<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>。则:</p>
<div class="math">$$
x=\mu + i\cdot n+k
$$</div>
<p>而对于<span class="math">\(p\)</span>来说,因为起步长为1且<span class="math">\(p,q\)</span>是同步运行的,所以<span class="math">\(p\)</span>经过的节点数应该为<span class="math">\(2x\)</span>:</p>
<div class="math">$$
2x=\mu+j\cdot n +k
$$</div>
<p>根据上述的等式,解出<span class="math">\(\mu=(j-2i)\cdot n-k\)</span>,将其代回<span class="math">\(x\)</span>中,我们可以得到:</p>
<div class="math">$$
x = (j-i)\cdot n \Rightarrow x+\mu = (j-i)\cdot n + \mu
$$</div>
<p>上述等式就说明了,当<span class="math">\(p,q\)</span>相遇之后,再按步长为1,向前走<span class="math">\(\mu\)</span>个节点,就可以到达环的起始位置。</p>
<p><span class="math">\(\Box\)</span></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>也即环中的节点数 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>虽然<span class="math">\(q\)</span>的步长是2,但是计算的经过的节点时,每一个在<span class="math">\(q\)</span>前面的节点都会被计算,不仅仅是其指向的节点。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记5-Chernoff Bound2014-07-02T00:00:00-06:002014-07-02T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-07-02:/randomized-algorithm/Randomized-Algorithm-5/<p>随机算法学习笔记5,主要说明Chernoff Bound的证明过程,及其相应的应用问题——Packet Routing问题。</p><h1>Chernoff Bound</h1>
<p><a href="http://en.wikipedia.org/wiki/Chernoff_bound">切尔诺夫界(Chernoff Bound)</a>通常是用来描述随机变量的和的取值在其<strong>期望</strong>附近的概率,在大多数情况下,随机变量都具有"集中"现象,也即概率较高的取值都集中在其<strong>期望</strong>附近。比如说抛硬币,抛一次硬币也许无法确定出现正面的概率,但是抛10000次之后呢?出现正反面的概率都稳定在了<span class="math">\(\frac{1}{2}\)</span>附近,这就是"概率集中"现象,而<strong>切尔诺夫界(Chernoff Bound)</strong>就可以定量的来描述这种现象。</p>
<p><strong>切尔诺夫界(Chernoff Bound)</strong>的证明主要用到了两个工具,一是<a href="http://en.wikipedia.org/wiki/Markov_inequality">Markov不等式</a>,一是<a href="http://en.wikipedia.org/wiki/Moment-generating_function">Moment Generating Functions</a>.之前的几篇笔记中已经证明过<strong>Markov不等式</strong>了,所以这里先介绍一下<strong>Moment Generating Function</strong>.</p>
<h2>Moment Generating Functions</h2>
<blockquote>
<p>定义: Moment Generating Functions</p>
<p>随机变量<span class="math">\(X\)</span>的Moment Generating Functions定义为:</p>
<p><span class="math">\(M_X(t)=E[e^{tX}]\)</span></p>
</blockquote>
<p>从定义中可以看到,</p>
<div class="math">$$M_X(t)$$</div>
<p>是关于<span class="math">\(t\)</span>的函数,而不是<span class="math">\(X\)</span>。利用如下的泰勒展开式:</p>
<div class="math">$$
e^{tX} \approx 1 + tX + \frac{t^2}{2!}X^2 + \cdots + \frac{t^k}{k!}X^k = \sum\limits_{k=0}^\infty \frac{t^k}{k!}X^k
$$</div>
<p>我们可以得到:</p>
<div class="math">$$
\begin{aligned}
M_X(t) = E[e^{tX}] &= E\bigg[\sum\limits_{k=0}^\infty \frac{t^k}{k!}X^k\bigg] \\
&= \sum\limits_{k=0}^\infty E\bigg[\frac{t^k}{k!}X^k\bigg]
\end{aligned}
$$</div>
<p>因此,<strong>Moment Generating Functions</strong>这个函数实际上是包含了<span class="math">\(X\)</span>的所有阶的信息.</p>
<h2>证明Chernoff Bound</h2>
<blockquote>
<p>定理(Chernoff Bound)</p>
<p>假设<span class="math">\(X=\sum\limits_{i=1}^n X_i\)</span>,且<span class="math">\(X_1,X_2,\cdots,X_n\)</span>是独立的泊松实验<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,其中<span class="math">\(\mu=E[X]\)</span>.
则对于任何的<span class="math">\(\delta > 0\)</span>,有:</p>
<p><span class="math">\(Pr[X\ge (1+\delta)\mu]\le \bigg(\frac{e^{\delta}}{(1+\delta)^{1+\delta}}\bigg)^\mu\)</span></p>
</blockquote>
<p>证明:</p>
<p>首先根据指数函数的递增性,我们有:</p>
<div class="math">$$
X\ge (1+\delta)\mu \Leftrightarrow e^{tX} \ge e^{t(1+\delta)\mu}
$$</div>
<p>由此将原来的不等式和Moment Generating Functions联系了起来。利用Markov Inequity得到:</p>
<div class="math">$$
Pr\bigg[e^{tX} \ge e^{t(1+\delta)\mu} \bigg] \le \frac{E[e^{tX}]}{e^{t(1+\delta)\mu}}
$$</div>
<p>然后我们计算<span class="math">\(E[e^{tX}]\)</span>:</p>
<div class="math">$$
\begin{aligned}
E[e^{tX}]&=E\bigg[e^{t\sum\limits_{i=1}^n X_i}\bigg]\\
&= E\bigg[\prod_{i=1}^n e^{tX_i} \bigg] \\
&= \prod_{i=1}^nE[e^{tX_i}]
\end{aligned}
$$</div>
<p>上述化简过程中的最后一个等号是因为<span class="math">\(X_i\)</span>是相互独立的。</p>
<p>令<span class="math">\(p_i = Pr[X_i=1]\)</span>,则:</p>
<div class="math">$$
\begin{aligned}
Pr[X_i=0] &= 1-p_i\\
E[X] &= E[\sum\limits_{i=1}^n X_i] \\
&= \sum\limits_{i=1}^n E[X_i] \\
&= \sum\limits_{i=1}^n p_i\\
&=\mu
\end{aligned}
$$</div>
<p>因为<span class="math">\(E[e^{tX_i}]\)</span>可以计算为:</p>
<div class="math">$$
\begin{aligned}
E[e^{tX_i}] &= p_i\cdot e^t + (1-p_i)\cdot e^0 \\
&= p_i(e^t-1) + 1\\
&\le e^{p_i(e^t-1)}
\end{aligned}
$$</div>
<p>上式中的最后一个不等号是因为根据泰勒展开式,当<span class="math">\(y>0\)</span>时,有<span class="math">\(e^y\ge 1+y\)</span>.</p>
<p>因此:</p>
<div class="math">$$
\begin{aligned}
E[e^{tX}] &\le \prod_{i=1}^n e^{p_i(e^t-1)}\\
&= e^{(e^t-1)\sum\limits_{i=1}^n p_i} \\
&= e^{(e^t-1)\mu}
\end{aligned}
$$</div>
<p>将其代回原来的Markov Inequity:</p>
<div class="math">$$
\begin{aligned}
Pr\bigg[e^{tX} \ge e^{t(1+\delta)\mu} \bigg] &\le \frac{E[e^{tX}]}{e^{t(1+\delta)\mu}} \\
&\le \frac{e^{(e^t-1)\mu}}{e^{t(1+\delta)\mu}}\\
&= \bigg(\frac{e^{(e^t-1)}}{e^{t(1+\delta)}}\bigg)^\mu
\end{aligned}
$$</div>
<p>令<span class="math">\(t=\ln(1+\delta)\)</span>,我们就得到:</p>
<div class="math">$$
Pr\bigg[X \ge (1+\delta)\mu \bigg] \le \bigg(\frac{e^\delta}{(1+\delta)^{(1+\delta)}}\bigg)^\mu
$$</div>
<p><span class="math">\(\Box\)</span></p>
<h2>小结</h2>
<p>Chernoff Bound一共有三个条件:</p>
<ol>
<li>X必须是多个随机变量的和</li>
<li>每一个<span class="math">\(X_i\)</span>必须是独立的</li>
<li><span class="math">\(X_i\)</span>是一个0-1取值的随机变量(这不是必须的,但是0-1变量比较容易计算)</li>
</ol>
<p>从上述证明步骤来看,证明的主要流程有以下几点:</p>
<ol>
<li>利用了Moment Generating Functions和Markov Inequity</li>
<li>计算<span class="math">\(E[e^{tX_i}]\)</span>,其中需要用到泰勒展开式</li>
<li>选取合适的<span class="math">\(t\)</span></li>
</ol>
<p>另外还有一些Chernoff Bound的变形形式:</p>
<blockquote>
<p>Chernoff Bound其他形式</p>
<p>假设<span class="math">\(X=\sum\limits_{i=1}^n X_i\)</span>,且<span class="math">\(X_1,X_2,\cdots,X_n\)</span>是独立的泊松实验,其中<span class="math">\(\mu=E[X]\)</span>.
则</p>
<p>1.对于<span class="math">\(0<\delta\le 1\)</span>有:</p>
<p>$Pr[X\ge (1+\delta)\mu]< exp\bigg(-\frac{\mu\delta^2}{2} \bigg) $</p>
<p>$Pr[X\le (1-\delta)\mu]< exp\bigg(-\frac{\mu\delta^2}{2} \bigg) $</p>
<p>2.对于<span class="math">\(t\ge 2e\mu\)</span>,有:</p>
<p><span class="math">\(Pr[X\ge t]\le 2^{-t}\)</span></p>
</blockquote>
<h1>Packet Routing</h1>
<p>这个Packet Routing问题是来自于并行计算领域,描述的是,假如我们有<span class="math">\(N\)</span>个处理器,这些处理器之间需要进行信息交互,那这些处理器就构成了一个网络,处理器在这个网络中通过发包和收包来进行信息的交互。构成的图有如下的限制:</p>
<ol>
<li>每一个处理器有且仅有一个独一无二的目的地</li>
<li>信息传递是同步的,每一条边每次最多只能传递一个数据包。</li>
</ol>
<p>可以试想一下,如果构成的图结构是一个完全图<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,那么每次只需要一轮传递,就能把所有的包送达到目的地。但是,在很多的实际情况中,完全图是无法实现的,考虑到成本问题,图结构应该是比较稀疏的(具有很少的边),因此两个节点进行信息交互的时候,需要经过多条边的传递才能完成一次交互。在这种情况下,当有大量的数据包需要传递的时候,必然会导致网络的堵塞和瓶颈,我们的目的就是要能够设计出一种尽量稀疏的网络结构及其相应的路由算法,使得任意两点间进行信息交互的时候经过尽量少的边。</p>
<h2>Hypercube</h2>
<p>现在我们来考虑一个比较特殊的图结构——<a href="http://en.wikipedia.org/wiki/Hypercube">Hypercube</a>.所谓的<a href="http://en.wikipedia.org/wiki/Hypercube">Hypercube</a>,是一种特殊的无向图,它有<span class="math">\(N\)</span>个节点,且<span class="math">\(N=2^d\)</span>,其中<span class="math">\(d\)</span>是一个正整数,称为Hypercube的度。Hypercube中的每一个点都用一个二进制串<span class="math">\(\{0,1\}^d\)</span>来表示。节点<span class="math">\(u,v\)</span>有边当且仅当<span class="math">\(u,v\)</span>之间仅有一位是不同的,也即是<span class="math">\(u\)</span>和<span class="math">\(v\)</span>的<a href="http://en.wikipedia.org/wiki/Hamming_distance">Hamming Distance</a>为1。</p>
<p>下图是度为1-4时,Hypercube的例子:</p>
<p><img alt="Hypercube" src="http://zhouyichu.com/images/hypercube.png"/></p>
<p>根据Hypercube的定义,我们可以知道这样一个性质:<strong>对于图中任何一个点对<span class="math">\((u,v)\)</span>,它们之间的距离<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>最多为<span class="math">\(d\)</span></strong>.这是因为从一个点到另外一个点最多会有<span class="math">\(d\)</span>位完全不一致。</p>
<p>这个性质给了我们不小的启发,我们可以轻易地设计如下的路由算法:</p>
<hr/>
<p>Bit-Fixing Routing Algorithm</p>
<p>For each packet:</p>
<ol>
<li>Let <span class="math">\(u,v\in \{0,1\}^d\)</span> be the origin and destination of the packet respectively.</li>
<li>
<p>For i = 1 to d,do:</p>
<p>if <span class="math">\(u_i\neq v_i\)</span> then traverse the edge <span class="math">\((v_1,\cdots,v_{i-1},u_i,\cdots,u_d) \rightarrow (v_1,\cdots,v_{i-1},v_i,u_{i+1},\cdots,u_d)\)</span></p>
</li>
</ol>
<hr/>
<p>在实际情况下,在并行的路由<span class="math">\(N\)</span>个数据包的时候,很有可能会出现同一条边同时被多个数据包使用,而根据之前的定义,每一条边一次最多只能通过一个数据包,因此我们需要为每一条边设计一个排队策略,可以是FIFO(First In First Out)或者FTG(Furthest To Go).</p>
<p>但是,对于上述的Bit-First Routing Algorithm算法来说,无论设计的是什么样的排队策略,总会有存在一个目的地的排列,使得需要通过<span class="math">\(\Omega(\sqrt{N})\)</span>轮才能将所有的<span class="math">\(N\)</span>个数据包路由到起各自的目的地。这是最坏的情况,但是在这里我们将会只分析这个算法的平均情况,分析的过程中就将会使用到之前的证明的Chernoff Bound.</p>
<h2>平均情况分析</h2>
<p>首先,我们将原问题进行一下放松,不再约束每一个处理器必须有独一无二的目的地,而可以是图上的任意一点。对于平均情况来说,任意一个起始点<span class="math">\(v\)</span>的目标点是<span class="math">\(\{0,1\}^d\)</span>的一个均匀且独立的分布,我们用<span class="math">\(P_v\)</span>表示点<span class="math">\(v\)</span>到其随机目的地<span class="math">\(r\)</span>的路径,<span class="math">\(P_v\)</span>是一个边的序列。</p>
<p>显然,如果<span class="math">\(P_v\)</span>和<span class="math">\(P_u\)</span>有公共的边,那么<span class="math">\(u,v\)</span>就有可能会发生堵塞现象,我们需要对此进行分析。</p>
<p>令<span class="math">\(H_{uv}\)</span>为一个指示变量,用来说明<span class="math">\(P_u\)</span>和<span class="math">\(P_v\)</span>是否有公共边:</p>
<div class="math">$$
H_{uv} =
\begin{cases}
1\quad if\quad P_u\quad and\quad P_v\quad share\quad at\quad least\quad one\quad edge\quad \\
0 \quad otherwise
\end{cases}
$$</div>
<p>根据上述的定义,显然我们可以得到</p>
<div class="math">$$H_u=\sum\limits_{v\in\{0,1\}^d } H_{uv}$$</div>
<p>,<span class="math">\(H_u\)</span>表示所有经过<span class="math">\(P_u\)</span>的路径的数目,这是<span class="math">\(u\)</span>被延迟的次数的一个上界。</p>
<p>由于<span class="math">\(u,v\)</span>的目的地点都是独立选取的,因此<span class="math">\(H_{uv}\)</span>之间也是相互独立的,因此我们可以使用Chernoff Bound.</p>
<p>令<span class="math">\(e\)</span>表示图中的边,<span class="math">\(T(e)\)</span>表示经过边<span class="math">\(e\)</span>的路径的数目,则我们可以得到:</p>
<div class="math">$$
H_u \le \sum\limits_{e\in P_u}T(e)
$$</div>
<p>因此:</p>
<div class="math">$$
\begin{equation}
E[H_u] \le \sum\limits_{e\in P_u}E[T(e)]\label{x}
\end{equation}
$$</div>
<p>令<span class="math">\(\vert P_v\vert\)</span>表示路径<span class="math">\(P_v\)</span>的长度,这里的长度其实就是起始点与目标点之间的不同的位数,又因为目的地点是均匀分布的,所以<span class="math">\(E[\vert P_v \vert] = \frac{d}{2}\)</span>,因此我们得到:</p>
<div class="math">$$
\sum\limits_{v\in\{0,1\}^d}E[\vert P_v \vert] = \frac{dN}{2}
$$</div>
<p>又因为"所有的点的路径长度之和"和"每一条边上经过的路径的数目之和"是相等的,因此可以得到:</p>
<div class="math">$$
\sum\limits_{v\in\{0,1\}^d}\vert P_v\vert = \sum\limits_{e}T(e)
$$</div>
<p>则:</p>
<div class="math">$$
\sum\limits_{e}E[T(e)] = \sum\limits_{v\in\{0,1\}^d}E[\vert P_v\vert ] = \frac{dN}{2}
$$</div>
<p>又因为<span class="math">\(T(e)\)</span>是同分布的,因此每一个<span class="math">\(E[T(e)]\)</span>是相等的,而对于一个Hypercube来说,一共有<span class="math">\(\frac{dN}{2}\)</span>条边,因此:</p>
<div class="math">$$
E[T(e)] = \frac{2}{dN} \cdot \frac{dN}{2} = 1
$$</div>
<p>而<span class="math">\(P_u\)</span>的长度最多为<span class="math">\(d\)</span>,因此根据<span class="math">\(\ref{x}\)</span>,我们可以得到:</p>
<div class="math">$$
E[H_u] \le \sum\limits_{e\in P_u}E[T(e)] \le d
$$</div>
<h2>应用Chernoff Bound</h2>
<p>我们可以是用Chernoff Bound的第二种变形形式:</p>
<p>当<span class="math">\(t\ge 2e\mu\)</span>时,<span class="math">\(Pr[X\ge t] \le 2^{-t}\)</span></p>
<p>取<span class="math">\(t=6d>2eE[H_u]=2ed\)</span>,应用Chernoff Bound:</p>
<div class="math">$$
Pr[H_u > 6d] < 2^{-6d}
$$</div>
<p>此时我们只是给定了指定的<span class="math">\(H_u\)</span>的一个上界,对于整个图的来说,我们需要应用Union Bound:</p>
<div class="math">$$
\begin{aligned}
Pr[maximum\quad delay > 6d] &\le Pr\bigg[\max\limits_{u\in\{0,1\}^d}H_u > 6d\bigg] \\
&\le NPr[H_u>6d] \\
&<N\cdot 2^{-6d}\\
&= 2^{-5d}
\end{aligned}
$$</div>
<h1>参考资料</h1>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Chernoff_bound">wiki:Chernoff Bound</a></li>
<li><a href="http://en.wikipedia.org/wiki/Markov_inequality">wiki:Markov Inequity</a></li>
<li><a href="http://en.wikipedia.org/wiki/Moment-generating_function">wiki:Moment Generating Function</a></li>
<li><a href="http://en.wikipedia.org/wiki/Hypercube">wiki:Hypercube</a></li>
<li><a href="http://en.wikipedia.org/wiki/Hamming_distance">wiki:HammingDistacne</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>注意,这里的泊松实验并不是指泊松分布,这是两个完全不同的概念。泊松实验是指<span class="math">\(X_i\)</span>是0-1二值的布尔随机变量,但是<span class="math">\(X_1,X_2,\cdots,X_n\)</span>之间并不不一定是同分布的,但是必须是独立的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>任意一个点都与其他所有点都有边相连. <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>距离用经过的边的数目来衡量. <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年6月阅读书单2014-06-17T00:00:00-06:002014-06-17T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-06-17:/reading-list/Reading-List-2014-June/<p>2014年6月阅读书单</p><h1>鬼吹灯</h1>
<p>作者: 天下霸唱</p>
<p>上个月看完了《盗墓笔记》,后来又听说还有一部同样是盗墓主题的《鬼吹灯》,对于盗墓历险的感觉有些意犹未尽,于是乎,又开始看《鬼吹灯》了。</p>
<p>总体来说,虽然这两部小说都是讲盗墓的,但是风格还是不太一样的。《鬼吹灯》中没有那么多“坑”……作者基本是挖一个就填一个的,而不像《盗墓笔记》中那样,只挖坑而不填坑……</p>
<p>虽说《盗墓笔记》只挖坑不填坑,但是从头到尾都是有一条总线的,按写散文的角度来看,就是形散而神不散;而《鬼吹灯》中历次的盗墓经历似乎就没有那么强的联系了,有点散,然后很牵强地串在了一起。</p>C语言中字符串2014-06-12T00:00:00-06:002014-06-12T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-06-12:/programming-language/C-String/<p>C语言中有关字符串的复习内容,内容不成体系,仅以记录之前不曾记得的要点。</p><h1>字符串定义</h1>
<p>字符串一共有4种不同的定义方式,分别是:</p>
<ol>
<li>字符串常量方式:位于双引号中的任意字符,但并不包括<code>\0</code>,<code>\0</code>由编译器自动添加。</li>
<li>char指针方式</li>
<li>字符串数组方式</li>
</ol>
<p>分别举例如下:</p>
<pre><code>#!c
char m1[50] = "Hello, and how are you today!"; //字符串常量
char *m2 ="Hello, and how are you today!"; //char 指针方式*
char *mytal[LIM] = {"Adding numbers swiftly",
"Multipying arrurately","Stashing data",
"Following instructions to the letter",
"Understanding the C language"
}; //字符串数组方式*
</code></pre>
<p>1、3两种方式定义字符串时,是从静态存储区将整个字符串复制到数组中去;而对于第二种指针赋值的方式,则只是复制字符串的地址。在这种情况下,字符串存储在静态数据区,不应该也不能被修改。</p>
<h1>字符串输入</h1>
<p>一共有三种不同的字符串输入函数:</p>
<ol>
<li><code>scanf()</code>: 最常用的输入函数,可以高度定制输入格式。</li>
<li><code>gets()</code>: 从系统标准输入设备获得一个字符串,读取字符串遇到<code>\n</code>时,结束读取,并且会丢弃最后一个<code>\n</code>字符。将一个地址作为参数,同时返回这个地址。这个函数不检查预留存储区是否能够容纳实际输入的数据。</li>
<li><code>fgets()</code>: 类似与<code>gets()</code>,但是提供第二个参数<code>n</code>,用于说明最大读入字符数。<code>fgets()</code>会读取最多<code>n-1</code>个字符或者读完一个换行符位置,由这二者最先满足的那个结束输入。</li>
</ol>
<h1>字符串输出</h1>
<p>一共有三种不同的字符串输出函数:</p>
<ol>
<li><code>printf()</code>: 最常用的输出函数,可以控制各种各样的输出格式。</li>
<li><code>puts()</code>: 自动添加换行符,遇到空字符时才会停止。</li>
<li><code>fputs</code>: 是<code>puts</code>的面向文件的版本,<code>fputs()</code>的第二个参数用来说明要写的文件,但是它并不会自动添加换行符。</li>
</ol>
<h1>总结</h1>
<ul>
<li>
<p><code>gets()</code>会分别丢掉输入里的换行符,而<code>puts()</code>会为输出自动添加换行符。</p>
</li>
<li>
<p><code>fgets()</code>直接存储输入里的换行符,不会丢弃;而<code>fputs()</code>也不会自动为输出添加换行符。</p>
</li>
</ul>当运动成为习惯2014-06-03T00:00:00-06:002014-06-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-06-03:/words/Habit-of-Sport/<p>当运动成为一种习惯,它将不再是一种负担,而是一种享受。</p><p>本科的时候一点都不在乎是否需要运动,基本没运动过几次,到了研究生阶段,由于总是坐在实验室里,身体越来越僵硬,为了做一个健康的程序员,我开始有意识的每天都运动一下,锻炼身体。</p>
<h1>跑步</h1>
<p>自从去年10月份开始跑步以来,只要条件允许,一直在坚持每天跑步,跑着跑着,渐渐发现已经养成了习惯了,每天不跑一下,就觉得不舒服。</p>
<p>从最早的一次只能跑个4、5圈,现在一次可以跑个11、12圈了,逐步递进,跑完之后有一种酣畅淋漓的感觉。</p>
<p>最初开始跑步的时候,不够专业,没有换衣服,直接穿着牛仔裤去跑了,结果两条牛仔裤直接被磨破了,只能废弃了。后来学乖了,买了一套专业的运动服,换上之后再跑步,加上一个头戴式的MP3,装备就齐了,跑起来的感觉非常好。</p>
<p>记得曾经在《人性的弱点》中看到过一种理论,那就是情绪会影响身体的机能,反过来,身体也能够影响人的情绪。两周之前,上课的时候竟然将kindle忘记在了教室里了,后来回去找的时候已然不见了,想想也是, 如此有价值的东西怎么会被人留下呢。当时心情很不爽,也许是已经养成了习惯的原因吧,后来也不管kindle了,到点了就直接去操场跑起步来了。跑完步之后,一身大汗,心情却是舒畅,已经平和了很多了,不再那么的纠结和懊恼了,只能默默接受这个事实了。这样的体验验证了《人性的弱点》中身体和情绪是相互影响的理论,进一步加深了我坚持运动的信心。</p>
<p>我现在跑步的时候一般都会用咕咚来记录跑步的里程数,到目前为止已经累计400多公里了.</p>
<p><img alt="咕咚记录" src="http://zhouyichu.com/images/records.png"/></p>
<h1>篮球</h1>
<p>当然,除了跑步,还有很多的运动方式,现在我每周打两次篮球,其他时间一般都是跑步。</p>
<p>仔细想想,本科四年基本没怎么打过球,总是蹲点蹲在图书馆,实在太可惜了。现在得好好补补过去的遗憾了,只要有时间,总会找人去打球。</p>
<p>虽然已经没有当年篮球队时的体力与激情了,但是那种很high的感觉还是存在的,打起球来仿佛一切烦恼都没有了,全身都被调动了起来,在球场上奔跑,跳跃.</p>2014年5月阅读书单2014-06-03T00:00:00-06:002014-06-03T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-06-03:/reading-list/Reading-List-2014-May/<p>2014年5月阅读书单</p><h1>盗墓笔记</h1>
<p>作者: 南派三叔</p>
<p>这是我第一次阅读这种发源于网络的文学作品,和之前看的一些古典类型的小说形成了鲜明的对比,在古典小说中作者通常会对人物的心理会有详细的描写,而这种慢条斯理的描述方式在网络文学中是绝对见不到的,发源于网络的文学必然是拼命推剧情的,这样才能吸引人气。《盗墓笔记》就是这样的,刚开始三章都是在拼命推剧情,吸引人气,之后的内容节奏上虽然有所放缓,但是还能感觉得出和古典文学作品的区别的。</p>
<p>从整体剧情上看,其实并不是很严密,虽然主线还是较为完整的,但是在细节上不同的人能够得到不同的解读,就像一整张地图,被人从中挖出了很多零碎的孔,但是地图的主要线路保留了下来。</p>
<hr/>
<h1>神雕侠侣</h1>
<p>作者: 金庸</p>
<p>之前看过很多版本的电视剧,就是没有看过小说,刚好看到收藏的电子书中有本金庸全集,于是就翻出来好好看了一遍。</p>
<p>相比之前《射雕英雄传》中的郭靖,杨过的形象简直可以说是郭靖的反面,狂妄不羁,无视礼法,活脱脱一个浪子。尽管如此,他们依然有着共同之处,那就是执着,郭靖执着于"礼",执着于"侠之大者,为国为民";杨过执着于情, 执着于"黯然销魂者,唯别而已矣".如此的反差,最终却都名列五绝之一。也许金庸先生想告诉我们,不管性情如何,根基如何,不忘初心,方得始终。</p>
<hr/>
<h1>倚天屠龙记</h1>
<p>作者: 金庸</p>
<p>这个月貌似看的都是小说,此部《倚天屠龙记》中的张无忌,不是很喜欢,优柔寡断,处处留情却不断情。若不是靠着机缘,怎么能当上明教教主,本身性格上没有任何特点,不似前两部中郭靖和杨过那么的执着。整部小说中,我反而更喜欢的是赵敏这个人物,机智、果断却有带着少女的痴情。为了张无忌弃父别兄,着实让人钦佩。</p>C语言中的数组and指针2014-05-16T00:00:00-06:002014-05-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-05-16:/programming-language/C-Array-Pointer/<p>C语言中数组和指针的复习内容,内容不成体系,仅以记录之前不曾记得的要点。</p><p>数组和指针的概念是C语言中最为重要的概念,也是能够灵活运用C语言的关键,重读了一下<c plus="" primer="">关于数组和指针的那一章,较之于之前学习的内容,感觉有了很大的补充,仅以此篇博客记录。本篇博文仅仅记录个人之前不熟悉的概念或技巧,基本概念本文不会重复。</c></p>
<h1>数组</h1>
<p>基本来说,数组是在编程过程中最基本的一种的数据结构,具有<strong>随机访问</strong>的特点。</p>
<p>对于C语言来说,定义一个数组需要两个信息:</p>
<ol>
<li>数组元素的类型 </li>
<li>数组元素的个数。</li>
</ol>
<p>这二者缺一不可,且必须是在定义时就确定,也就是说数组的大小必须用一个<strong>常量</strong> 来定义,不能使用<strong>变量</strong>.</p>
<h2>初始化</h2>
<p>在初始化一个数组的时候,有一个小trick,如果初始化时赋予数组的值小于数组的长度,那么剩下的数组元素就会自动赋值为0.</p>
<p>举例:</p>
<pre><code>:::c
int ar[4] = {1,2};
</code></pre>
<p>上述代码中,<code>ar</code>的前两个元素是1和2,而后两个元素就会自动赋值为0,但是,如果不初始化数组,仅仅是申明的话,数组中的元素值是不确定的,不会自动初始化为0.</p>
<p>另外,初始化时也可以不指定数组大小,由用初始化的数值的个数来确定.</p>
<p>举例:</p>
<pre><code>:::c
int ar[] = {1,2};
</code></pre>
<h1>指针</h1>
<p>指针是一个非常重要的概念,它能提供了一种直接操作内存地址的方式,如果能正确并灵活地运用指针,可以大大提高程序的运行效率。</p>
<p>指针说穿了就是一类特殊的变量,该变量存储的值是<strong>内存地址</strong>,而不是普通的数值。</p>
<p>关于指针,有两个完全的相反的操作:取地址<code>&</code>和取值<code>*</code>.</p>
<ul>
<li>取地址<code>&</code>: 可以用与任意的变量上,<code>&</code>运算符给出变量的地址。</li>
<li>取值<code>*</code>: 只能用于指针变量,<code>*</code>运算符用来取出存储在被指向地址中的数值。</li>
</ul>
<p>在定义一个指针变量的时候,最重要的是要确定其类型,因为只有确定了指针的类型,才能正确的计算所需要的内存地址。</p>
<h2>指针操作</h2>
<p>在C语言中,指针变量一共可以进行六种操作:</p>
<ol>
<li>赋值</li>
<li>取值</li>
<li>加法</li>
<li>减法</li>
<li>取地址</li>
<li>比较</li>
</ol>
<p>由于指针变量存储的实际内容是内存的地址,因此对地址进行乘法或除法运算是没有任何意义的。</p>
<p>当对指针变量进行加法或减法的时候,增加或减少的是一个存储单元,而不是一个字节,存储单元的大小由指针的类型来确定,这也就是为什么定义指针的时候,必须明确指定其类型。简单来说,<strong>对指针加1等于对指针的值加上它指向的对象类型的字节大小</strong></p>
<p>在使用指针的时候,有一点必须要注意:<strong>不能对未初始化的指针取值</strong>.</p>
<pre><code>:::c
int *pt; //未初始化的指针*
*pt = 5; //一个可怕的错误*
</code></pre>
<p>由于<code>pt</code>并没有被初始化,因此其存储的内存地址完全是随机的,我们无法知道5到底被存储到哪里去了。这个位置如果覆盖了程序的其他数据,会引起灾难性的后果。需要切记:<strong>当创建一个指针的时候,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。</strong></p>
<h2>指针与数组</h2>
<p>指针和数组的关系是非常密切的,一个最直观的关系就是:<strong>数组名就是数组首元素的地址</strong>,即如果<code>arg</code>是一个数组的话,那么等式<code>arg=&arg[0]</code>永远成立.</p>
<p>但是,指针和数组还是有区别的,最重要的是:</p>
<ul>
<li>数组是一个常量,无法改变,无法自增自减。</li>
<li>指针是一个变量,可以被改变,可以自增自减。</li>
</ul>随机算法学习笔记4-二阶矩(Second Moment)2014-05-05T00:00:00-06:002014-05-05T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-05-05:/randomized-algorithm/Randomized-Algorithms-4/<p>随机算法学习笔记4,这次重心在二阶矩应用的几个模型。</p><p>这里所说的二阶矩(Second Moment)其实可以理解成在<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithms-3/">上一篇笔记</a> 中的中所说的的<strong>方差</strong>,<strong>期望</strong>是一阶矩,而<strong>方差</strong>就是二阶矩。本篇笔记中的中模型大多数都是利用二阶矩来进行证明的,最常用的工具就是<strong>Chebyshev不等式</strong>。 </p>
<h1>随机图(Random Graphs)</h1>
<p>一个随机图是按照如下规则生成的一个图结构:</p>
<ol>
<li>图中一共有<span class="math">\(n\)</span>个节点,即<span class="math">\(\vert V \vert=n\)</span></li>
<li>图中任意两个定点之间以<span class="math">\(p\)</span>的概率出现边,且这些边之间是相互独立的。</li>
</ol>
<p>这样生成一个随机图的过程就是随机图模型,用<span class="math">\(G(n,p)\)</span>来表示。在随机图模型上有很多有趣的性质,接下来我们将分别讨论。</p>
<h1>图的单调属性(Monotone Properties)</h1>
<blockquote>
<p><strong>定义</strong>:图属性</p>
<p>令<span class="math">\(\mathcal{G_n}=2^{\binom{n}{2}}\)</span>表示所有具有<span class="math">\(n\)</span>个点的图所能够生成的所有图结构的集合,<strong>图的属性</strong>是一个布尔函数<span class="math">\(P:\mathcal{G_n}\rightarrow \{0,1\}\)</span>,且这个函数并不依赖的于顶点的顺序。也即是说,如果<span class="math">\(G\)</span>和<span class="math">\(H\)</span>是同构的,则<span class="math">\(P(G)=P(H)\)</span></p>
<p><strong>定义</strong>: 图的单调属性</p>
<p>图的单调属性是指,假设<span class="math">\(G,H\)</span>都是有<span class="math">\(n\)</span>个顶点的图,且满足<span class="math">\(G\subseteq H\)</span>, 如果<span class="math">\(G\)</span>有属性<span class="math">\(P\)</span>则<span class="math">\(H\)</span>必有属性<span class="math">\(P\)</span></p>
</blockquote>
<p>图的单调属性有很多,比如:</p>
<ul>
<li>是否存在汉米尔顿路径</li>
<li>是否含有和<span class="math">\(H\)</span>同构的子图</li>
</ul>
<p>当然也有属性不是单调的,比如:</p>
<ul>
<li>是否存在欧拉路径</li>
</ul>
<p>图的单调属性和单调函数的概念很相似,可以做一些类比。</p>
<p>对于所有图的单调属性,有如下的定理:</p>
<blockquote>
<p>定理:</p>
<p>令<span class="math">\(P\)</span>是一个图的单调属性,假设<span class="math">\(G_1=G(n,p_1),G_2=G(n,p_2)\)</span>,且<span class="math">\(0\le p_1\le p_2 \le 1\)</span>,则</p>
<p>
<div class="math">$$Pr[P(G_1)] \le Pr[P(G_2)] $$</div>
</p>
</blockquote>
<p>证明:</p>
<p>要证明这个定理,需要用到一个称为<strong>coupling</strong>的技巧,所谓<strong>coupling</strong>是指,要是使得两个问题发生耦合,用某种方法将两个不同的问题捆绑到一起,这样比较利于分析。</p>
<p>在我们这个具体的证明中,假设<span class="math">\(p_1,p_2\)</span>是共享一个随机源的,这强迫使它们发生了联系。对于任意的<span class="math">\((u,v)\in V\)</span>来说,令<span class="math">\(X_{u,v}\)</span>表示一个<span class="math">\([0,1]\)</span>上的分布。</p>
<p>当且仅当<span class="math">\(X_{uv}\in [0,p_1]\)</span>时,<span class="math">\((u,v)\in G_1\)</span>;当且仅当<span class="math">\(X_{uv}\in [0,p_2]\)</span>时,<span class="math">\((u,v)\in G_2\)</span>,又因为<span class="math">\(p_1 \le p_2\)</span>,所以<span class="math">\((u,v)\in G_1 \Rightarrow (u,v)\in G_2\)</span>,也即<span class="math">\(G_1\subseteq G_2\)</span>.</p>
<p>根据图的单调性的定义,如果<span class="math">\(P(G_1)=1\)</span>,则<span class="math">\(P(G_2)=1\)</span>,也就说说<span class="math">\(Pr[P(G_1)]\le Pr[P(G_2)]\)</span></p>
<p><span class="math">\(\Box\)</span></p>
<h1>阈值现象(Threshold Phenomenon)</h1>
<p>在随机图上有着一个比较好玩的性质,称为<strong>阈值现象(Threshold Phenomenon)</strong>.它描述的是随机图(<span class="math">\(G(n,p)\)</span>)上的某一些属性是随着<span class="math">\(p\)</span>激增的,当<span class="math">\(p\)</span>小于某个阈值<span class="math">\(p(n)\)</span>时,随机图几乎没有对应的属性<span class="math">\(P\)</span>;而当<span class="math">\(p\)</span>大于某个阈值<span class="math">\(p(n)\)</span>时,随机图<span class="math">\(G(n,p)\)</span>则会有很高的概率有对应的属性<span class="math">\(P\)</span>。用数学语言来描述是:</p>
<ul>
<li>当<span class="math">\(n\ll p(n)\)</span>时, 随着<span class="math">\(n\rightarrow \infty,Pr[P(G(n,p))]=0\)</span></li>
<li>当<span class="math">\(n\gg p(n)\)</span>时, 随着<span class="math">\(n \rightarrow \infty,Pr[P(G(n,p))]=1\)</span></li>
</ul>
<h2>4-clique</h2>
<p>在图中,4-clique是指如下的子图(子图中有4个顶点,且两两有边):</p>
<blockquote>
<p>定理:</p>
<p>一个随机图含有4-clique的阈值是<span class="math">\(n^{-\frac{2}{3}}\)</span></p>
</blockquote>
<p>证明:</p>
<p>令<span class="math">\(S\)</span>表示随机图<span class="math">\(G(n,p)\)</span>中的任意一个由4个顶点组成的子图,<span class="math">\(X_S\)</span>为一个二值变量:</p>
<div class="math">$$
X_S=\begin{cases}
1, \quad S\ is\ a\ 4-clique\\
0,\quad else
\end{cases}
$$</div>
<p>则<span class="math">\(Pr[X_S=1]=p^6\)</span>,因为4-clique一共有6条边,而每条出现的概率是<span class="math">\(p\)</span>.</p>
<p><span class="math">\(X\)</span>表示<span class="math">\(G(n,p)\)</span>中4-clique的个数,也即<span class="math">\(X=\sum\limits_{S\in\binom{n}{4}}X_S\)</span>.</p>
<p>根据阈值现象的定义,我们只需要证明如下两个引理:</p>
<ol>
<li>当<span class="math">\(p=o(n^{-\frac{2}{3}})\)</span>时,随着<span class="math">\(n\rightarrow\infty, Pr[X\ge 1]\rightarrow 0\)</span></li>
<li>当<span class="math">\(p=w(n^{-\frac{2}{3}})\)</span>时,随着<span class="math">\(n\rightarrow\infty, Pr[X\ge 1]\rightarrow 1\)</span></li>
</ol>
<p>首先,我们来证明第一个:</p>
<p>根据Markov不等式,我们有:</p>
<div class="math">$$
\begin{aligned}
Pr[X\ge 1] &\le \frac{E[X]}{1} \\
&=E[X] \\
&= E\bigg[\sum\limits_{S\in \binom{n}{4}}X_S\bigg] \\
&= \sum\limits_{S\in\binom{n}{4}}E[X_S]\\
&= \binom{n}{4}p^6\\
&= O(n^4p^6)
\end{aligned}
$$</div>
<p>又因为<span class="math">\(p=o(n^{-\frac{2}{3}})\)</span>, 所以:</p>
<div class="math">$$
Pr[X\ge 1] = o(n^4n^{-4}) = o(1)
$$</div>
<p>即<span class="math">\(Pr[x\ge 1]\rightarrow 0\)</span></p>
<p>现在我们来证明第二个引理,首先<span class="math">\(Pr[x\ge 1]\rightarrow 1\)</span>我们可以看成证明<span class="math">\(Pr[X=0]\rightarrow 0\)</span><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,这两者是等价的。 则:</p>
<div class="math">$$
Pr[X=0] \le Pr\bigg[\vert X-E[X] \vert \ge E[X]\bigg] = \frac{Var[X]}{(E[X])^2}
$$</div>
<p>其中,<span class="math">\(E[X]=\binom{n}{4}p^6=O(n^4p^6)\)</span></p>
<p>剩下的我们就需要计算<span class="math">\(Var[X]\)</span>,根据方差的性质:</p>
<div class="math">$$
Var[X] = Var\bigg[\sum\limits_{S\in\binom{n}{4}}X_S\bigg]=\sum\limits_{S\in\binom{n}{4}}Var[X_S] + \sum\limits_{S,T\in \binom{n}{4},S\neq T}Cov(X_S,X_T)
$$</div>
<p>现在我们需要分别计算<span class="math">\(Var[X_S]\)</span>和<span class="math">\(Cov(X_S,X_T)\)</span></p>
<div class="math">$$
Var[X_S] = E[X_S^2] - (E[X_S])^2 \le E[X_S^2]=E[X_S]=p^6
$$</div>
<p>所以<span class="math">\(\sum\limits_{S\in\binom{n}{4}}Var[X_S]=n^4p^6\)</span></p>
<p>接下来我们要计算<span class="math">\(Cov(X_S,X_T)\)</span>,此时需要分情况讨论:</p>
<ul>
<li><span class="math">\(\vert S\cap T\vert \le1\)</span>时,<span class="math">\(S,T\)</span>没有公共边,因此<span class="math">\(Cov(S,T)=0\)</span></li>
<li><span class="math">\(\vert S\cap T \vert =2\)</span>时,<span class="math">\(S,T\)</span>有一条公共边,且一共有11条边,因此</li>
</ul>
<div class="math">$$
Cov[X_S,X_T] = E[X_SX_T] - E[X_S]E[X_T]\le E[X_SX_T] = Pr[X_S=1\wedge X_T=1] = p^{11}
$$</div>
<p>又因为<span class="math">\(\vert S\cup T\vert=6\)</span>,因此在这种情况下,<span class="math">\(\sum\limits_{S,T\in \binom{n}{4},S\neq T}Cov(X_S,X_T)=O(n^6p^{11})\)</span></p>
<ul>
<li><span class="math">\(\vert S\cap T \vert =3\)</span>时,<span class="math">\(S,T\)</span>有3条公共边,且一共有9条边,因此:</li>
</ul>
<div class="math">$$
Cov[X_S,X_T] = E[X_SX_T] - E[X_S]E[X_T]\le E[X_SX_T] = Pr[X_S=1\wedge X_T=1] = p^{9}
$$</div>
<p>又因为<span class="math">\(\vert S\cup T\vert=5\)</span>,因此在这种情况下,<span class="math">\(\sum\limits_{S,T\in \binom{n}{4},S\neq T}Cov(X_S,X_T)=O(n^5p^{9})\)</span></p>
<p>综合上述所有情况,<span class="math">\(Var[X]=O(n^4p^6+n^6p^{11}+n^5p^9)\)</span></p>
<p>所以:</p>
<div class="math">$$
Pr[X=0] \le \frac{Var[X]}{(E[X])^2} = O(n^{-4}p^{-6}+n^{-2}p^{-1}+n^{-3}p^{-3})
$$</div>
<p>因此,当<span class="math">\(n=w(n^{-\frac{2}{3}})\)</span>时,<span class="math">\(Pr[X=0]\rightarrow 0\)</span></p>
<p><span class="math">\(\Box\)</span></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>此处进行变换是因为原式其实并不好处理,但是等价转换之后,我们可以应用Chebyshev不等式。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年4月阅读书单2014-05-02T00:00:00-06:002014-05-02T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-05-02:/reading-list/Reading-List-2014-April/<p>2014年4月阅读书单</p><h1>平凡的世界</h1>
<p>作者: 路遥</p>
<p>这是路遥的最后一篇长篇小说,整个三月下旬和四月上旬都是在这本小说,小说主要描写了上世纪70年代到80年代中国西北农村的一系列社会变化,从几个具体的人物生活中折射出了整个时代的变迁。</p>
<p>个人觉得"平凡的世界"这个名字起的非常好,小说中的各个人物都是在生活的激流中逐渐成长,但却始终没能彻底改变自己的生存环境。少安通过努力打拼逐渐改变家庭的贫困,正当其走上幸福之路时,相濡以沫的妻子却得了肺癌;读过书,见过世面的少平最终在爱人晓霞死之后,拒绝了金秀的爱情,独自回到了矿井;深爱着少安的润叶最终因丈夫的事故而成长,最终选择和残疾的丈夫一起生活。</p>
<p>整部小说反映了整个时代的变化,站在时代前沿的各色人等都在生活这个漩涡中苦苦挣扎,从生活中学习,从苦难中升华,在希望中迎接未来。</p>
<p>这就是生活,平凡中透着磨难,磨难中透着希望.</p>
<hr/>
<h1>重说中国近代史</h1>
<p>作者: 张鸣</p>
<p>这本书是张鸣教授的上课笔记的整理版,但这并不妨碍整本书的阅读。</p>
<p>张鸣教授以一种全新的视角来看待中国近代史,书中阐述了很多和传统教育不一样的历史观,分析了很多历史人物和事件,比如慈禧是否真的就是中国落后的罪魁祸首,袁世凯是否真的就是一个权术的野心家等等,看完这本书能够对中国近代史有一个全面而深入的理解,而不是仅仅停留在教科书上所说的用笼统的阶级矛盾、西方列强侵略中国等空洞的理论。</p>
<hr/>
<h1>达芬奇密码</h1>
<p>作者: 丹·布朗</p>
<p>很早之前就看过它的电影版了,这次看完原著小说之后,发现电影拍得要比小说来得好,也许有点先入为主的原因,在很多细节的处理上感觉电影更加细腻和细致。</p>
<p>总体来说,这本小说在情节悬疑方面做得还是很好的,虽然猜到了结局,却没能猜到圣杯真正的隐藏之地。</p>
<p>值得一读,但也仅仅是一读而已。</p>C语言中的字符串and输入输出2014-04-24T00:00:00-06:002014-04-24T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-24:/programming-language/C-String-IO/<p>C语言中的有关字符串和输入输出的整理说明。</p><h1>字符串</h1>
<p>在C语言中,字符串是指一个或多个字符的序列,直接存储的在char数组中。用于存储字符串的数组末尾都会有一个<code>\0</code>字符,这个字符称为<strong>空字符(null character)</strong>,C语言用它来指明字符串结束的位置。所以,通常来说,一个字符串的存储空间要比它本身的长度多一个字节。</p>
<p><code>\0</code>是一个非打印字符,它的ASCII码是0.</p>
<p>在C语言中单引号表示一个字符,而双引号表示一个字符串,这两者是不同的,这一点和Python有区别,需要多加注意。</p>
<h2>strlen()函数</h2>
<p><code>strlen()</code>函数是定义在<code>string.h</code>头文件中的,用于获取字符串的长度,它以<strong>字符</strong>{:.red}为单位给出字符串的长度。而<code>sizeof</code>也是用来获取变量所占空间长度的,但是<code>sizeof</code>以<strong>字节</strong>{:.red}为单位给出数据的大小。</p>
<p>对于<code>strlen()</code>函数来说,它在遇到<code>\0</code>时就停止计数了,而<code>sizeof</code>则返回的是整个变量所占空间的长度,如下代码所示:</p>
<p><code>strlen</code>返回值的类型是<code>size_t</code>,也即是<code>unsigned int</code>;<code>sizeof</code>返回值的类型是<code>long unsigned int</code></p>
<pre><code>#!c
#include<stdio.h>
#include<string.h>
int main()
{
char c[40]="flyaway";
printf("%lu\n",strlen(c));
printf("%lu",sizeof(c));
}
</code></pre>
<p>上述代码输出为7和40,分别表示字符串实际的长度和字符串实际所占空间的长度。</p>
<h1>预处理</h1>
<p>C语言中的<code>#define</code>宏定义仅仅是简单的替换过程,它本身不是C语言的语句,因此不需要末尾不需要分号。</p>
<p>C语言在<code>limits.h</code>和<code>float.h</code>头文件中分别提供了整数类型和浮点类型的大小限制的详细信息。</p>
<p><code>limits.h</code>中的一些符号常量如下图所示:</p>
<p><img alt="limits.h中的符号常量" src="http://zhouyichu.com/images/limits.png"/></p>
<p><code>float.h</code>中的符号常量如下图所示:</p>
<p><img alt="float.h中的符号常量" src="http://zhouyichu.com/images/float.png"/></p>
<h1>printf()函数</h1>
<p><code>printf()</code>函数是通过<strong>转换说明符(conversion specification)</strong> 来指定输出形式的,具体的转换说明符如下所示:</p>
<p><img alt="转换说明符" src="http://zhouyichu.com/images/conversion.png"/></p>
<p><code>printf()</code>的返回值是打印字符的数目,如果发生错误,就返回一个负值。</p>
<h1>scanf()函数</h1>
<p><code>scanf()</code>函数是以空白符(空格、制表符、换行符)来分割输入串的,其转换说明符和<code>printf()</code>类似。</p>
<p><code>scanf()</code>主要有两个注意点:</p>
<ol>
<li>用<code>scanf()</code>来读取基本类型的数据时,要在变量之前加上<code>&</code>符号,这其实就是取出变量的地址。</li>
<li>用<code>scanf()</code>来读取字符串的时候,不需要使用<code>&</code>,数组名本身就是地址。</li>
</ol>
<p><code>scanf()</code>函数返回成功读入的项目的个数,如果它没有读入任何项目,则返回0.</p>所谓兄弟情2014-04-20T00:00:00-06:002014-04-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-20:/words/Brotherhood/<p>君子之交淡如水</p><p>几天前在朋友圈里看到一张朋友上传的照片,照片显然是在KTV包厢里用手机拍的,几个大小伙子东倒西歪地躺在沙发里,显然已经是喝得不省人事了,还有几个小伙站着唱歌。照片大概就是这样了,照片的标题是"兄弟情".</p>
<p>当时看到的时候,其实第一反应是这真是兄弟情么?难道不只是一群酒肉朋友一起吃喝玩乐么?</p>
<p>由于受父亲的影响,其实我本质里还是有一些读书人的清高的,虽然我的第一反应是一种反对的态度,但是后来又转念一想,其实也不尽然,谁说一起喝酒、玩乐的就不能是真兄弟呢?我还是不要妄加揣测了。</p>
<p>我不再像以前那样血气方刚,凡是都是要较个真,现在做出判断之前还是要好好想一想的。</p>
<p>虽然不能全盘否定,但我还是欣赏那种君子之交淡如水的感觉,而不是那种一群人簇拥在一起"感情深,一口闷"。事实上,我一直觉得这种酒桌文化乃是中国传统文化中的一大陋习,有多少权钱交易是从酒桌上谈出来的?</p>
<p>所谓君子之交淡如水,是指相互之间不会轻易涉足对方的生活细节,保持在适当距离,当需要帮助的时候,一通电话一声问候就足以说明一切。</p>
<p>人与人相处,不应该是一道墙,也不应该什么都没有,而应该是一扇门,一扇能够上锁的门,需要独处的时候默默锁上门,别人不会来敲门,硬要把你拖出去;朋友需要帮助的时候,大方地打开大门来迎接朋友。</p>
<p>不想喝酒时可以不喝,这不影响你和Ta的关系;想要喝酒时,也不要强迫Ta陪你喝,自斟自饮也足以排解寂寞。</p>
<p><img alt="Brotherhood" src="http://zhouyichu.com/images/Brotherhood.jpg"/></p>C语言中的数据类型2014-04-19T00:00:00-06:002014-04-19T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-19:/programming-language/C-Data-Type/<p>总结整理了一下C语言中各个基础数据类型的资料,主要是针对过去不曾注意到的地方进行了一些补充和整理。</p><h1>数据关键字</h1>
<p>在C语言的C99规范中,C语言一共有12个和数据相关的关键字,分别是:</p>
<ul>
<li>
<p><strong>int</strong>: 整型数据类型,最常见的一种数据类型。一般来说,在现在64位系统普及的今天,一个<code>int</code>是占4个字节,也即32个bit.</p>
</li>
<li>
<p><strong>long</strong>: 长整型数据类型,一个<code>long</code>一般占8个字节,也即64个bit.</p>
</li>
<li>
<p><strong>short</strong>: 短整型数据类型,一个<code>short</code>一般占2个字节,也即16个bit。这种类型一般是用在明确知道数据不会太大的基础上的,主要是为了节省空间。另外需要注意的是,这里的<code>short</code>类型是<strong>有符号</strong> 的,过去我一直错误地认为<code>short</code>是无符号的。</p>
</li>
<li>
<p><strong>unsigned</strong>: 无符号类型,这才是真正的无符号类型,其实它是<code>unsigned int</code>的简写,所占字节数是和<code>int</code>一致的,但是却是非负的,这主要是用在某个变量不可能出现负值的情况下,比如在计数的时候,它能取得比<code>int</code>还要大的正数。</p>
</li>
<li>
<p><strong>char</strong>: 字符类型,其实本质也是整数类型。一个<code>char</code>占1个字节,即8个bit,因为ASCII码的范围是0-127,因此只需要8个bit就能表示了.对于字符和字符串来说,还有一点要注意的是,在C中,单引号中的一定是字符,而双引号中的一定是字符串。</p>
</li>
<li>
<p><strong>float</strong>: 浮点数,一般来说占4个字节,32个bit,能够保持6位有效位。</p>
</li>
<li>
<p><strong>double</strong>: 双精度浮点数,一般来说占8个字节,64个bit,能够保持10位有效位。</p>
</li>
<li>
<p><strong>signed</strong>: 有符号类型,通常可以和任何有符号的类型放在一起使用,只是为了强调有符号,使得数据类型更加明确。</p>
</li>
<li>
<p><strong>void</strong>: 空类型。</p>
</li>
<li>
<p><strong>_ Bool</strong>: 布尔类型。True和False</p>
</li>
<li>
<p><strong>_ Complex</strong> : 复数类型。</p>
</li>
<li>
<p><strong>_ Imaginary</strong> : 虚数类型。</p>
</li>
</ul>
<p>需要注意的是,这里的<code>int</code>,<code>long</code>,<code>short</code>所占字节数并不是固定的,不同的系统,不同的编译器在细节上可能会有不同的处理,但是C有如下的规定:</p>
<p><strong>C保证<code>short</code>不会比<code>int</code>且<code>long</code>不会比<code>int</code>短</strong></p>
<p>在C语言中,<code>sizeof</code>关键字通常是用来获取数据的大小的,它以字节为单位给出数据的大小,返回的的数据类型是<code>long unsigned int</code>类型,在用<code>printf()</code>函数输出的时候,格式化字符应该是<code>%lu</code>,如果只用<code>%d</code>的话,编译器会报警告,但这不是错误。</p>
<h1>常量</h1>
<p>关于常量其实没什么好说的,唯一值得注意的是有关后缀的问题。可以通过在一个常量末尾添加特殊符号来指定其数据类型。</p>
<p>对于小数常量来说,如果后缀是<code>f</code>或<code>F</code>,则该常量会被当做<code>float</code>类型;如果后缀是<code>l</code>或<code>L</code>,则该常量会被当做<code>long double</code>;如果没有后缀则是<code>double</code>.</p>
<p>对于整数来说,如果后缀是<code>l</code>或<code>L</code>,则该常量会被当做<code>long</code>;没有后缀则是<code>int</code></p>
<h1>输出</h1>
<p>关于格式化输出的部分,我也不想多说什么,都是比较简单的,这里想记录的是,何时会刷新缓冲区。刷新缓冲区主要有3种情况:</p>
<ol>
<li>缓冲区满了</li>
<li>遇到换行符了</li>
<li>需要等待用户输入字符的时候。</li>
</ol>
<h1>参考资料</h1>
<ul>
<li>《C Primer Plus》第三章</li>
</ul>码代码的初心2014-04-13T00:00:00-06:002014-04-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-13:/words/The-Original-Heart-Of-Coding/<p>寻找已经失去了的编程初心</p><p>最近几天是微软"编程之美"的竞赛的时间,周围好多同学都在跃跃欲试,在实验室里展开了激烈的讨论。而我,却对这样的比赛失去了兴趣,手头有太多的任务要完成,太多的deadline需要追赶。</p>
<p>不知从什么时候开始,渐渐被各种新技术、新模型给绑架了,忙于追赶各种新奇的技术、新的数学模型、痴迷于写技术博客,而忘记这一切是怎么开始的。</p>
<p>一切都是开始于那个"Hello World",开始于对未知世界的好奇,开始于对创造新事物的热爱。</p>
<p>然而,随着学习的深入,接触到了越来越多的新技术,渐渐在这个汪洋大海中迷失了,失去最初的乐趣。读研以来,三点一线(宿舍、教学楼、实验室)的生活仿佛又回到了高中时代,这样的生活虽然仍然在不断学习新事物,但始终缺乏了一种激情,一种第一次写出"Hello World"时的激情。</p>
<p>每天都是吃饭、睡觉、学习,真正码代码的时间却少之又少,脑海中总是充满了各种各样的idea,有了足够的知识储备,有了能够支撑的硬件条件,唯一缺少的却是时间。</p>
<p>甚至曾经一度怀疑过,读研的选择是否正确,因为这样的生活毫无乐趣,失去了我最初写出"Hello World"时的快乐。</p>
<p>此时,又会有另一个声音告诉我,这只是一个必然的学习过程,一个毛虫化蛹成蝶的过程,过程痛苦但结果美好。</p>
<p>真的是这样吗?</p>
<p>我不知道,我真的不知道。当我写下这篇文字的时候,我依然不知道答案是什么,只能边走边看,且行且珍惜。</p>艺术之于我2014-04-01T00:00:00-06:002014-04-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-01:/words/Art-to-Me/<p>作为理工科学生对于艺术作品的感悟与思考。</p><p>一直以来潜意识中就一直认为自己是那种艺术绝缘体,我就是那种就算把《蒙娜丽莎的微笑》免费送给我,我还不一定要的那种人.对我来说这就是一幅画,我无法理解也不想理解,对我来说它什么都不是。</p>
<p>然而,自从读研之后,我发现自己确实有了不少的变化,尽管从过去到现在我一直在理工科这个漫长的跑道上奔跑,但是现在的我,我时不时会停下脚步,看看隔壁的艺术跑道上的风景,看得心满意足之后,继续在原有跑道上奔跑。</p>
<p>2014年1月,临近期末考试,感情和学业上的事情各种不顺,心情很是糟糕。结果,不知为什么,鬼使神差的决定去听一场新年音乐会。当我坐在大会堂的位置上,倾听我人生第一场音乐会的时候,仿佛大会堂之外的世界与里面的世界隔离了,耳中所听、心中所想,唯有音乐而已。尽管我无法准确地说出听的是哪些曲目,尽管我无法理解这些音符中作者所包含的感情,但是我真切体会到了音乐带给人的欢愉,这是一种心灵上的宁静。</p>
<p>很多过去认为是"过时"的音乐,在大会堂中由音乐家现场演奏出来,给人一种完全不一样的感受,比如《茉莉花》,要是放在平时,我是绝不会主动去听这么"过时"的曲子的,然而,当晚我走出大会堂时,一路上都是哼着《茉莉花》的曲调。经典之所以为经典,是因为它能在任何时候,任何地点感动任何人。</p>
<p>散场之后,走在人流穿梭的道路上,觉得过去的几个小时恍若隔世,就像从宁静安详的乌托邦中一下子被拖回了残酷的现实世界<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。但是,心中不再躁动不安,取而代之的平静与轻松.虽然这并不能解决我的实际问题,但是音乐让我有了更加平静的心态去迎接生活工作的问题。</p>
<p>2014年3月底,和朋友去了上海一趟,此行的目的在于上海的两个艺术展,一是草间弥生的现代艺术展,二是莫奈的画展。这次的艺术之行,我最大的收获是,让我明白了,我并不是一个真正的"艺术绝缘体",当我驻足在莫奈的《帆船》之前时,我又一次被震撼了。说不出为什么,我就是喜欢上了这幅画,看到它,我第一个想到的是<老人与海>,海天一色的画面中,一只孤独的帆船独自航行,实在是太美了。</p>
<p>我不知道莫奈是在什么样的情况下画出这幅作品的,《帆船》也不是莫奈最出名的作品,但是这些我都不关心,我只在乎它带给我的感觉,我只在乎我自己对它的理解,就像俗话说的,一千个人眼中有一千个哈姆雷特,我只是静静地看着它,品味它,其他的一切与我无关。</p>
<p>说到绘画,其实我也不完全是门外汉,好歹年少时学过几年的国画。西方的油画与中国的国画相比,可以说是各有特点,国画注重笔法,每一个线条都是非常细腻的,而西方的油画,却略显粗糙,仔细看的时候,觉得简直就是小孩子的涂鸦。但是,对于颜色与光线的使用,中国的国画就远远不如西方了,西方的肖像画栩栩如生,画家熟练的使用光线与阴影,别有一番风味。在这次展出的莫奈的画作中,我最喜欢其中的三幅,分别是《帆船》、《日落》和《睡莲》。</p>
<p>经过两次的艺术"熏陶",我逐渐体会到了世界的另一面,一个我从未关注过的世界,一个无法用公式和符号来推理的世界,这是一个美好的世界,是一个宁静的世界,一个我将会常常"光顾"的世界。</p>
<p><img alt="帆船" src="http://zhouyichu.com/images/boat.jpg"/></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实我认为这个世界并不残酷,但也不宁静安详。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>随机算法学习笔记3-矩(Moment)和方差(Deviation)2014-04-01T00:00:00-06:002014-04-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-01:/randomized-algorithm/Randomized-Algorithms-3/<p>随机算法学习笔记3,这次的重点是两个常用的不等式(马尔科夫不等式和切比雪夫不等式),方差以及相应的例子。</p><h1>马尔科夫不等式(Markov's Inequity)</h1>
<blockquote>
<p><strong>定理(Markov's Inequity)</strong>:</p>
<p>假设<span class="math">\(X\)</span>是一个取值为非负数的随机变量,则对于任何的<span class="math">\(t>0\)</span>,满足如下不等式:</p>
<p><span class="math">\(Pr[X\ge t] =\frac{E[X]}{t}\)</span></p>
</blockquote>
<p>证明:</p>
<p>令<span class="math">\(Y\)</span>为一个布尔变量:</p>
<div class="math">$$
Y=\begin{cases}
1 \quad X \ge t \\
0 \quad X < t
\end{cases}
$$</div>
<p>则<span class="math">\(Y\)</span>很明显满足:<span class="math">\(E[Y]=Pr[Y=1]=Pr[X\ge t]\)</span>,所以:</p>
<div class="math">$$
\begin{equation}
Pr[X\ge t] = Pr[Y=1] = E[Y] \le E\bigg[\frac{X}{t}\bigg] = \frac{E[X]}{t}
\end{equation}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<hr/>
<p><a href="http://en.wikipedia.org/wiki/Markov_inequality">马尔科夫不等式(Markov's Inequity)</a>是一个非常有用的不等式工具,可以用来证明很多其他的不等式,包括后面将会说明的<a href="http://en.wikipedia.org/wiki/Chebyshev%27s_inequality">切比雪夫不等式(Chebyshev's Inequity)</a>.</p>
<h2>应用举例</h2>
<p>马尔科夫不等式一个典型应用是可以用来设计一个可以将<a href="http://en.wikipedia.org/wiki/Las_Vegas_algorithm" title="wiki: Las Vegas algorithm">Las Vegas算法</a>转化为一个<a href="http://en.wikipedia.org/wiki/Monte_Carlo_algorithm" title="wiki: Monte Carlo algorithm">Monte Calo算法</a><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>:</p>
<p>假设算法<span class="math">\(A(x)\)</span>是一个针对某个判定问题的Las Vegas算法,且它运行时间的期望是<span class="math">\(T(n)\)</span>,则我们可以设计一种方法将<span class="math">\(A(x)\)</span>转化为具有<strong>单边错误</strong>的Monte Calo的算法<span class="math">\(B(x)\)</span>:</p>
<hr/>
<p><span class="math">\(B(x)\)</span>:</p>
<ol>
<li>运行<span class="math">\(2T(n)\)</span>时长的<span class="math">\(A(x)\)</span>算法。</li>
<li>如果<span class="math">\(A(x)\)</span>返回一个结果,则将该结果直接返回;如果<span class="math">\(A(x)\)</span>没能返回结果,就直接返回1.</li>
</ol>
<hr/>
<p>可以看到,<span class="math">\(B(x)\)</span>是一个运行时间确定,但是返回结果不确定的算法,也即是Monte Calo算法。并且,只有当<span class="math">\(A(x)\)</span>没有返回结果时,才有可能返回错误解。这是<strong>False Postive</strong>的单边错误类型。我们可以来计算一下<span class="math">\(B(x)\)</span>返回一个错误的解的概率,在这计算过程中,我们就需要用到马尔科夫不等式了。</p>
<div class="math">$$
\begin{equation}
Pr[返回错误解]\le Pr[A(x)的运行时间\ge 2T(n)] \le \frac{E[A(x)的运行时间]}{2T(n)} = \frac{T(n)}{2T(n)} = \frac{1}{2}
\end{equation}
$$</div>
<h1>方差(Variance)</h1>
<blockquote>
<p><strong>定义</strong>: 一个随机变量<span class="math">\(X\)</span>的方差定义为:</p>
<p><span class="math">\(Var[X] = E[(X-E[X])^2] = E[X^2] - E[X]^2\)</span> </p>
<p>一个随机变量<span class="math">\(X\)</span>的标准差定义为:</p>
<p><span class="math">\(\delta[X]=\sqrt{Var[X]}\)</span></p>
</blockquote>
<p>需要注意的是,<strong>方差</strong>和<strong>期望</strong>不一样,是不满足线性可加性的。</p>
<blockquote>
<p><strong>定义</strong>: 两个随机变量的协方差定义为:</p>
<p><span class="math">\(Cov(X,Y)=E[(X-E[X])(Y-E[Y])]\)</span></p>
<p><strong>定理</strong>: 对于任意的随机变量<span class="math">\(X_1,X_2,\cdots,X_n\)</span>,有:</p>
<p><span class="math">\(Var\bigg[\sum\limits_{i=1}^n X_i \bigg] = \sum\limits_{i=1}^n Var[X_i] + \sum\limits_{i\neq j}Cov(X_i,X_j)\)</span></p>
</blockquote>
<p>证明: 这只需要证明两个随机变量的情况。假设有两个随机变量<span class="math">\(X\)</span>,<span class="math">\(Y\)</span>,则</p>
<div class="math">$$
\begin{aligned}
Var[X+Y] &= E\big[(X+Y-E[X+Y])^2\big] \\
&= E\big[(X-E[X]+Y-E[Y])^2\big] \\
&= Var[X] + Var[Y] +2Cov(X,Y)
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<hr/>
<blockquote>
<p>定理: 对于任何两个独立的随机变量<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>,有:</p>
<p><span class="math">\(E[X\cdot Y]=E[X]\cdot E[Y]\)</span></p>
</blockquote>
<p>证明: 假设<span class="math">\(X,Y\)</span>是两个相互独立的随机变量,则我们可以做如下的推导:</p>
<div class="math">$$
\begin{aligned}
E[X\cdot Y] &= \sum\limits_{xy}Pr[X=x\wedge Y=y] \\
&= \sum\limits_{xy}xPr[X=x]yPr[Y=y]\\
&= \sum\limits_{x}xPr[X=x]\sum\limits_{y}yPr[Y=y]\\
&=E[X]\cdot E[Y]
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<hr/>
<p>上述第二个等号之所以成立,是因为<span class="math">\(X,Y\)</span>相互独立。</p>
<p>利用上述的定理,我们可以证明下面的定理:</p>
<blockquote>
<p>对于任何两个独立的随机变量<span class="math">\(X,Y\)</span>,它们的协方差为0:</p>
<p>Cov(X,Y) = 0</p>
</blockquote>
<p>证明:</p>
<div class="math">$$
\begin{aligned}
Cov(X,Y) &= E\big[(X-E[X])(Y-E[Y])\big] \\
&= E\big[X-E[X]\big]E\big[Y-E[Y]\big]\\
&= 0
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<hr/>
<p>利用上述的结论,我们可以直接得到下面结论:</p>
<blockquote>
<p>定理: 对于两两独立的随机变量<span class="math">\(X_1,X_2,\cdots,X_n\)</span>来说,有:</p>
<p>
<div class="math">$$Var\bigg[\sum\limits_{i=1}^n X_i \bigg] = \sum\limits_{i=1}^n Var[X_i]$$</div>
</p>
</blockquote>
<h2>伯努利分布的方差</h2>
<p>对于满足伯努利分布的<span class="math">\(X\)</span>来说,有:</p>
<div class="math">$$
\begin{equation}
X = \begin{cases}
1 \quad p \\
0 \quad 1-p \\
\end{cases}
\end{equation}
$$</div>
<p>则其方差可以直接计算:</p>
<div class="math">$$
\begin{equation}
Var[X] = E[X^2] - E[X]^2 = p - p^2=p(1-p)
\end{equation}
$$</div>
<h2>二项式分布的方差</h2>
<p>二项分布是n个独立的伯努利实验,因此,如果<span class="math">\(Y\)</span>是满足二项分布的话,则<span class="math">\(Y=\sum\limits\_{i=1}^n X\_i\)</span>,利用独立性条件,<span class="math">\(Y\)</span>的方差可以直接计算:</p>
<div class="math">$$
\begin{equation}
Var[Y] = Var\bigg[\sum\limits_{i=1}^n X_i\bigg] = \sum\limits_{i=1}^n Var[X_i] = \sum\limits_{i=1}^n p(1-p) = np(1-p)
\end{equation}
$$</div>
<h2>切比雪夫不等式(Chebyshev's Inequity)</h2>
<p>在概率统计中,<a href="http://en.wikipedia.org/wiki/Chebyshev%27s_inequality">切比雪夫不等式(Chebyshev's Inequity)</a>是一个非常重要的不等式,它给出了比<a href="http://en.wikipedia.org/wiki/Markov_inequality">Markov不等式</a>更强的界。它表述如下:</p>
<blockquote>
<p>对于任何的<span class="math">\(t>0\)</span>,都满足:</p>
<p>
<div class="math">$$Pr[\vert X-E[X] \vert \ge t] \le \frac{Var[X]}{t^2}$$</div>
</p>
</blockquote>
<p>证明:</p>
<p>首先,如下等式是肯定成立的:</p>
<div class="math">$$
\begin{equation}
Pr[\vert X-E[X] \vert \ge t] = Pr[( X-E[X] )^2 \ge t^2]
\end{equation}
$$</div>
<p>我们可以将<span class="math">\((X-E[X])^2\)</span>整体看成是一个随机变量,且这个随机变量是非负的,因此我们直接套用<strong>Markov</strong>不等式:</p>
<div class="math">$$
\begin{aligned}
Pr[\vert X-E[X] \vert \ge t] &= Pr[( X-E[X] )^2 \ge t^2] \\
&\le \frac{E\bigg[(X-E[X])^2 \bigg]}{t^2} \\
&= \frac{Var[X]}{t^2}
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<h1>问题举例</h1>
<h2>中位数选择(Median Selection)</h2>
<p>中位数选择问题也是一个比较常见的问题,<strong>从一个集合<span class="math">\(S\)</span>中选择第<span class="math">\(\lceil\frac{n}{2}\rceil\)</span>小的数</strong>.其实这个问题可以进行推广到从集合中选取第<span class="math">\(k\)</span>小的数<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,但是在这里我们暂时只讨论特殊情况:<strong>只寻找集合<span class="math">\(S\)</span>中的中位数。</strong>这个寻找过程很直接地可以利用排序来完成,一旦将<span class="math">\(S\)</span>排好序了,自然就能找到任意<span class="math">\(k\)</span>小的元素了。但是,排序算法的最好代价是<span class="math">\(O(n\log n)\)</span>,而如果我们利用随机算法的方法的话,可以将时间代价降低为线性时间<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>。</p>
<p>这个随机化的算法被称为是<strong>LazySelect</strong>,其基本思想是:如果我们能够从集合<span class="math">\(S\)</span>中寻找到满足如下条件的元素<span class="math">\(d\)</span>和<span class="math">\(u\)</span>:</p>
<ol>
<li>中位数<span class="math">\(m\)</span>存在于<span class="math">\([d,u]\)</span>中,也即<span class="math">\(m\)</span>满足<span class="math">\(d\le m\le u\)</span></li>
<li>位于<span class="math">\(d\)</span>和<span class="math">\(u\)</span>之间的元素足够少,也即<span class="math">\(C=\\{x\in S \big\vert d\le x\le u\\},\vert C \vert = o(\frac{n}{\log n})\)</span>,使得<span class="math">\(C\)</span>能在线性时间内排序。</li>
</ol>
<p>如果我们能找到这样的<span class="math">\(d,u\)</span>的话,那么我们就能够在线性时间内找到中位数<span class="math">\(m\)</span>.</p>
<p>假设我们已经找到了这样的<span class="math">\(d,u\)</span>,那么我们只需要计算如下的步骤:</p>
<ol>
<li>从<span class="math">\(S\)</span>中计算出小于<span class="math">\(d\)</span>的元素个数<span class="math">\(l\_d\)</span></li>
<li>将<span class="math">\(C\)</span>排序,由于<span class="math">\(\vert C\vert = o(\frac{n}{\log n})\)</span>,因此<span class="math">\(C\)</span>的排序能够在线性时间内完成。</li>
<li>在排好序的<span class="math">\(C\)</span>中,第<span class="math">\(\lfloor \frac{n}{2} \rfloor-l_d+1\)</span>个元素就是我们需要求的<span class="math">\(m\)</span></li>
</ol>
<p>好了,那么我们如何才能快速地找到满足条件的<span class="math">\(d,u\)</span>呢?事实上,<span class="math">\(d,u\)</span>需要满足的条件并不是非常严格的,是一种比较"粗粒度"的约束条件,那我们就可以利用随机取样的方法来得到<span class="math">\(d,u\)</span>,具体做法是这样的:</p>
<ol>
<li>从<span class="math">\(S\)</span>中随机取样得到一个子集<span class="math">\(R\)</span></li>
<li>将<span class="math">\(R\)</span>排序,在<span class="math">\(R\)</span>的中位数附近寻找这样的<span class="math">\(d,u\)</span></li>
<li>如果寻找的<span class="math">\(d,u\)</span>满足上述的条件,那我们就能在线性时间内找到<span class="math">\(S\)</span>的中位数,否则算法失败。</li>
</ol>
<p>在这个过程中,有两个参数很重要,一是子集<span class="math">\(R\)</span>的大小,既不能太小,从而导致不能找到合适的<span class="math">\(d,u\)</span>;也不能太大,从而导致不能在线性时间内排序。二是<span class="math">\(d,u\)</span>的选择范围,如果<span class="math">\(d,u\)</span>靠得很近,很有可能<span class="math">\(m\)</span>就不在<span class="math">\(C\)</span>中了,如果<span class="math">\(d,u\)</span>分得很开,那么会导致<span class="math">\(\vert C\vert\)</span>很大,不能在线性时间内完成排序。</p>
<p>在这个算法中,我们选取<span class="math">\(R\)</span>的大小为<span class="math">\(n^{\frac{3}{4}}\)</span>,而<span class="math">\(d,u\)</span>是<span class="math">\(R\)</span>的中位数的<span class="math">\(\sqrt{n}\)</span>的范围<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>。整体的算法步骤如下所示:</p>
<hr/>
<p><strong>input</strong>: 一个有<span class="math">\(n\)</span>个元素的集合<span class="math">\(S\)</span></p>
<p><strong>output</strong>: <span class="math">\(S\)</span>的中位数<span class="math">\(m\)</span></p>
<ol>
<li>从<span class="math">\(S\)</span>中随机取样得到一个大小为<span class="math">\(\lceil n^{\frac{3}{4}}\rceil\)</span>的子集<span class="math">\(R\)</span></li>
<li>将<span class="math">\(R\)</span>进行排序</li>
<li>令<span class="math">\(d\)</span>为排好序的集合<span class="math">\(R\)</span>中的第<span class="math">\(\lfloor \frac{1}{2}n^{\frac{3}{4}} - \sqrt{n} \rfloor\)</span>小的元素</li>
<li>令<span class="math">\(u\)</span>为排好序的集合<span class="math">\(R\)</span>中的第<span class="math">\(\lceil \frac{1}{2}n^{\frac{3}{4}} + \sqrt{n} \rceil\)</span>小的元素</li>
<li>遍历<span class="math">\(S\)</span>中的元素,计算出集合<span class="math">\(C=\{x\in S: d\le x\le u \}\)</span>,以及<span class="math">\(l_d=\vert\{ x\in S: x < d \} \vert\)</span>,<span class="math">\(l_u=\vert x\in S: x > u \vert\)</span></li>
<li>如果<span class="math">\(l_d >\frac{n}{2}\)</span>或者<span class="math">\(l_u > \frac{n}{2}\)</span>,则算法失败。</li>
<li>如果<span class="math">\(\vert C \vert \le 4n^{\frac{3}{4}}\)</span>,则将<span class="math">\(C\)</span>排序;否则算法失败。</li>
<li>在排好序的<span class="math">\(C\)</span>中,返回<span class="math">\(\lfloor \frac{n}{2} \rfloor-l_d+1\)</span>小的元素。</li>
</ol>
<hr/>
<p>在上述的算法步骤中,第6步是用来保证<span class="math">\(d,u\)</span>存在于<span class="math">\(C\)</span>之中,而第7步是用来保证<span class="math">\(\vert C\vert\)</span>足够小,能够在线性时间内完成排序。</p>
<p>现在我们需要来分析一下这个算法,首先我们需要定义三个事件:</p>
<ul>
<li><span class="math">\(\epsilon_1\)</span>: <span class="math">\(Y_1 = \vert \{ r\in R \vert r \le m \} \vert < \frac{1}{2}n^{\frac{3}{4}} - \sqrt{n}\)</span></li>
<li><span class="math">\(\epsilon_2\)</span>: <span class="math">\(Y_2 = \vert \{ r\in R \vert r \ge m \} \vert < \frac{1}{2}n^{\frac{3}{4}} - \sqrt{n}\)</span></li>
<li><span class="math">\(\epsilon_3\)</span>: <span class="math">\(\vert C \vert > 4n^{\frac{3}{4}}\)</span></li>
</ul>
<p>很显然,事件<span class="math">\(\epsilon_1,\epsilon_2\)</span>对应于步骤6中的两个判断条件,因为如果<span class="math">\(l_d>\frac{n}{2}\)</span>,则<span class="math">\(R\)</span>中的所有元素都在中位数<span class="math">\(m\)</span>的右侧,即<span class="math">\(R\)</span>中第<span class="math">\(\frac{1}{2}n^{\frac{3}{4}} - \sqrt{n}\)</span>小的元素一定大于<span class="math">\(m\)</span>.同理<span class="math">\(l_u > \frac{n}{2}\)</span>等价于事件<span class="math">\(\epsilon_2\)</span>.而<span class="math">\(\epsilon_3\)</span>等价于上述算法中的步骤7.</p>
<p>从整个算法的步骤中,我们可以看到,当前仅当<span class="math">\(\epsilon_1,\epsilon_2,\epsilon_3\)</span>中的其中之一发生时,算法才会失败,否则一定会返回出一个正确的解。</p>
<p>现在我们就需要来计算一下<span class="math">\(\epsilon_1,\epsilon_2,\epsilon_3\)</span>中至少有一个发生的概率是多少。</p>
<p><span class="math">\(\epsilon_1\)</span>和<span class="math">\(\epsilon_2\)</span>是类似的,因此我们首先来看一下<span class="math">\(\epsilon_1\)</span>发生的概率是多少。</p>
<p>定义<span class="math">\(X_i\)</span>为一个布尔值:</p>
<div class="math">$$
\begin{equation}
X_i = \begin{cases}
1 \quad 如果的i个样本小于等于中位数m \\
0 \quad 如果的i个样本大于中位数m
\end{cases}
\end{equation}
$$</div>
<p>则<span class="math">\(Y_1=\sum\limits_{i=1}^{n^{\frac{3}{4}}}X_i\)</span>,而<span class="math">\(Pr[X_i=1]\)</span>可以进行如下的计算:</p>
<div class="math">$$
\begin{equation}
p = Pr[X_i=1] = \frac{1}{n}\lceil \frac{n}{2} \rceil \ge \frac{1}{2}
\end{equation}
$$</div>
<p>而此时的<span class="math">\(Y_1\)</span>是一个二项分布,因此</p>
<div class="math">$$
\begin{aligned}
E[Y_1] &= n^{\frac{3}{4}}p \ge \frac{1}{2}n^{\frac{3}{4}} \\
Var[Y_1] &= n^{\frac{3}{4}}p(1-p) \le \frac{1}{4}n^{\frac{3}{4}}
\end{aligned}
$$</div>
<p>因此,我们可以应用<strong>Chebyshev不等式</strong>:</p>
<div class="math">$$
\begin{aligned}
Pr[\epsilon_1] &= Pr\bigg[Y_1<\frac{1}{2}n^{\frac{3}{4}} - \sqrt{n}\bigg] \\
&= Pr\bigg[Y_1-\frac{1}{2}n^{\frac{3}{4}}<-\sqrt{n}\bigg] \\
&\le Pr\bigg[\vert Y_1 - E[Y_1]\vert < \sqrt{n}\bigg] \\
&\le \frac{Var[Y_1]}{n} \\
&= \frac{1}{4}n^{-\frac{1}{4}}
\end{aligned}
$$</div>
<p>因此,<span class="math">\(\epsilon_1\)</span>发生的概率不大于<span class="math">\(\frac{1}{4}n^{-\frac{1}{4}}\)</span>.同理,<span class="math">\(\epsilon_2\)</span>发生的概率也同样不会超过<span class="math">\(\frac{1}{4}n^{-\frac{1}{4}}\)</span>.</p>
<p>现在我们来分析一下<span class="math">\(\epsilon_3\)</span>的情况。</p>
<p>如果<span class="math">\(\epsilon_3\)</span>发生的话,那么根据<a href="http://en.wikipedia.org/wiki/Pigeonhole_principle" title="wiki: Pigeonhole Principle">鸽巢原理</a>,如下两个事件至少会发生一个:</p>
<ul>
<li><span class="math">\(\xi_1\)</span>: 在<span class="math">\(C\)</span>中至少有<span class="math">\(2n^{\frac{3}{4}}\)</span>个元素大于<span class="math">\(m\)</span></li>
<li><span class="math">\(\xi_2\)</span>: 在<span class="math">\(C\)</span>中至少有<span class="math">\(2n^{\frac{3}{4}}\)</span>个元素小于<span class="math">\(m\)</span></li>
</ul>
<p>我们只需要分析一种情况,另外一种情况利用对称性就能得到了。</p>
<p>我们来分析<span class="math">\(\xi_1\)</span>,如果<span class="math">\(\xi_1\)</span>成立,那么<span class="math">\(u\)</span>在排好序的<span class="math">\(S\)</span>中的位置至少为<span class="math">\(\frac{1}{2}n+2n^{\frac{3}{4}}\)</span>到这里位置应该还是比较好理解的,但是接下来的结论会有点绕,所以我先用一个图来说明一下目前<span class="math">\(S\)</span>的划分情况:</p>
<p><img alt="mid" src="http://zhouyichu.com/images/mid.png"/></p>
<p>从图中可以看到,如果<span class="math">\(\xi_1\)</span>成立的话,我们就能得到如下的结论:<strong>集合<span class="math">\(R\)</span>中至少有<span class="math">\(\frac{1}{2}n^{\frac{3}{4}}-\sqrt{n}\)</span>个元素是在<span class="math">\(S\)</span>的前<span class="math">\(\frac{1}{2}n-2n^{\frac{3}{4}}\)</span>大的元素集合中</strong>.从图上来看,就是<span class="math">\(uD\)</span>一定是属于<span class="math">\(uB\)</span>的,而<span class="math">\(\frac{1}{2}n^{\frac{3}{4}}-\sqrt{n}\)</span>和<span class="math">\(\frac{1}{2}n-2n^{\frac{3}{4}}\)</span>分别是<span class="math">\(uD\)</span>和<span class="math">\(uB\)</span>的长度。<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup></p>
<p>在得出上述的结论之后,后面的计算就比较简单了:</p>
<p>定义<span class="math">\(X_i\)</span>为一个布尔值:</p>
<div class="math">$$
\begin{equation}
X_i = \begin{cases}
1 \quad 第i个样本处于uB\\
0 \quad 第i个样本不处于uB
\end{cases}
\end{equation}
$$</div>
<p>同时令<span class="math">\(X=\sum\limits_{i=1}^{n^{\frac{3}{4}}}X_i\)</span>为所有落入<span class="math">\(uD\)</span>之间的元素的总数。</p>
<p>又因为</p>
<div class="math">$$
\begin{equation}
p=Pr[X_i=1] = \frac{\frac{1}{2}n-2n^{\frac{3}{4}}}{n} = \frac{1}{2} - 2n^{-\frac{1}{4}}
\end{equation}
$$</div>
<p>且<span class="math">\(X\)</span>是一个二项分布,因此:</p>
<div class="math">$$
\begin{equation}
E[X] = n^{\frac{3}{4}}p=\frac{1}{2}n^{\frac{3}{4}} - 2\sqrt{n} \\
Var[X] = n^{\frac{3}{4}}p(1-p) = \frac{1}{4}n^{\frac{3}{4}} - 4n^{\frac{1}{4}} < \frac{1}{4}n^{\frac{3}{4}}
\end{equation}
$$</div>
<p>最后应用<a href="http://en.wikipedia.org/wiki/Chebyshev%27s_inequality">Chebyshev不等式</a>,我们得到:</p>
<div class="math">$$
\begin{aligned}
Pr[\xi_1] &= Pr\bigg[X\ge \frac{1}{2}n^{\frac{3}{4}}-\sqrt{n}\bigg]\\
&\le Pr\bigg[ \vert X-E[X] \vert \ge \sqrt{n} \bigg]\\
&\le \frac{Var[X]}{n} \\
&\le \frac{1}{4}n^{-\frac{1}{4}}
\end{aligned}
$$</div>
<p>因此,<span class="math">\(Pr[\epsilon_3]\le Pr[\xi_1] + Pr[\xi_2]\le \frac{1}{2}n^{-\frac{1}{4}}\)</span></p>
<p>综合上面对<span class="math">\(\epsilon_1,\epsilon_2,\epsilon_3\)</span>的分析,我们最终得到如下的界:</p>
<div class="math">$$
\begin{equation}
Pr[\epsilon_1] + Pr[\epsilon_2] + Pr[\epsilon_3] \le n^{-\frac{1}{4}}
\end{equation}
$$</div>
<p>因此,说明算法失败的概率是比较小,能够以较大的概率在线性时间内找到正确的中位数。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Moment_(mathematics)">wiki:Moment</a></li>
<li><a href="http://en.wikipedia.org/wiki/Markov_inequality">wiki: Markov's Inequity</a></li>
<li><a href="http://en.wikipedia.org/wiki/Chebyshev%27s_inequality">wiki: Chebyshev's Inequity</a></li>
<li><a href="http://en.wikipedia.org/wiki/Monte_Carlo_algorithm" title="wiki: Monte Carlo algorithm">wiki:Monte Calo algorithm</a></li>
<li><a href="http://en.wikipedia.org/wiki/Las_Vegas_algorithm" title="wiki: Las Vegas algorithm">wiki:Las Vegas algorithm</a></li>
<li>Probability and Computing:Randomized Algorithms and Probabilistic Analysis</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>Las Vegas算法是指运行时间不确定,但是运行结果一定正确的一类随机算法。而Monte Carlo算法是指运行时间确定,但是运行结果不一定正确的一类随机算法。这两个算法的概念我在<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithm-0/">随机算法学习笔记0-概率空间&计算模型</a>中详细说明了。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这里的集合<span class="math">\(S\)</span>是乱序的。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>其实也存在能够在线性时间内解决中位数的确定性算法的,但是这个算法比较复杂,以前曾经实现过一次,但是现在已经基本不记得了。感兴趣的朋友可以查看<a href="http://en.wikipedia.org/wiki/Median_of_medians" title="wiki: Median of medians">这里</a> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>这些数值是如何得出的,其实我也说不清,这些数值完全是凑出来的,是为了方便后续的计算而硬凑出来的。 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p>这个结论至关重要,是后面一系列计算的基础,但是我看过的资料上这部分结论都是直接得出的,没有相似的说明,这张图也是我自己研究了半天之后才画出的,应该对理解如何得出这个结论会有帮助,这部分确实需要好好想想才能想通。 <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年3月阅读书单2014-04-01T00:00:00-06:002014-04-01T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-04-01:/reading-list/Reading-List-2014-March/<p>2014年3月的阅读书单</p><h1>野火集</h1>
<p>作者: 龙应台</p>
<p>《野火集》是龙应台在1984年在台湾的中国时报上刊登的专栏文章的集合,其中还包括了很多读者的评论。阅读30年前台湾的批评文章,发现其实任何社会都是存在问题的,重点是要有民主的机制,政府能够听得下批评的声音,勇于承认错误,才能真正将国家、社会治理好。</p>
<hr/>
<h1>黑天鹅</h1>
<p>作者: [美]纳西姆·尼古拉斯·塔勒布</p>
<p>这本书很不错,以随机事件的角度来看待我们的世界,其中的一些观点很新颖,给我以不同的视角来看待世界。</p>
<p>其中的核心思想是,<strong>这个世界不是连续的,而是由一些极端事件所推动的。而这些极端事件其实是不可预测的,但是在事后却总可以找到合理的解释.</strong></p>
<p>其实,仔细想想,也许确实是这样的,我们后人研究历史的时候,总是站在一个全局的角度来研究历史,没能站在当时事件发生的角度来分析问题,所谓"历史的必然性",其实未必真就存在吧,也许这仅仅只是后人在知道结果的条件下想象出来的"理由"来解释历史。</p>
<p>作者将这个世界分成了两类不同的事件:<strong>平均斯坦</strong>和<strong>极端斯坦</strong>.</p>
<p>平均斯坦是指那些能够普通的事件,能够通过积累而成功的事情;而极端斯坦是指那些随机性很大的事件,通常来说很少的人会掌握大部分资源。</p>
<p>极端斯坦典型的例子包括IT界、学术界和艺术界,IT界有且仅有几个巨头霸占了90%的市场,学术界也只有很少一部分大牛能够获得资助。其实用一句话就可以说明这个问题:<strong>挨饿的艺术家总是比挨饿的会计师多。</strong></p>
<p>其实我们不能只关心我们看到的事情,而忽略了没有看到的事情,而没有看到的部分往往含有更多的信息,我们总是关注于那些成功的企业和成功的CEO,但是在他们的脚下,又有多少失败的企业和失败的CEO?从数学上讲,只要样本足够大,总会有一些离群点,而这些离群点的出现完全是随机的,成功的企业往往会寻找各种原因来解释其成功的秘密,包括什么企业文化、CEO的执行力等等,但是这些仅仅是在"事后"给出的解释,是在知道结果的情况下给出的解释。这些解释真的是他们成功的原因吗?</p>
<p>我们应该牢记,<strong>我们只能看到现象,而不能看到规律!</strong></p>
<p>遗憾的是,我看的是这本书的中文版,而中文版的翻译质量较差,很多语句都有问题,好在并不妨碍理解作者的意思,以后有空再找英文原版看一下。</p>
<hr/>
<h1>万历十五年</h1>
<p>作者: 黄仁宇</p>
<p>这本书我基本是在医院挂水的两天内看完的,看得比较快,只能简要记录一下看完之后的感觉。</p>
<p>这本书主要是分析了整个明朝的政治体制及其基础,整个明朝都是以文官制度来管理的,文人的很多弊病在200多年的明朝体现得淋漓尽致。这其中有很多可笑、可悲、可叹的事情,这里我不想再重复了。</p>
<p>总的来说,黄仁宇先生对明朝的分析还是很透彻的,见解比较深刻。但是,可能由于是前段时间刚看完<黑天鹅>的原故吧,总是觉得像这样的分析有点类似于"马后炮",如果利用现在得出的结论重新来一次明朝的历史,这些分析过程真的能够用来预测未来吗?我表示很怀疑。</p>PCA原理分析2014-03-21T00:00:00-06:002014-03-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-03-21:/machine-learning/PCA-Tutorial/<p>本文简要阐述了PCA的原理及其算法过程。</p><h1>动机</h1>
<p>在机器学习领域中,我们常常会遇到维数很高的数据,有些数据的特征维度高达上百万维,很显然这样的数据是无法直接计算的,而且维度这么高,其中包含的信息一定有冗余,这时就需要进行降维,总的来说,我们降维的主要目的有如下几条:</p>
<ol>
<li>在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少冗余信息所造成的误差,提高识别(或其他应用)的精度。</li>
<li>希望通过降维算法来寻找数据内部的本质结构特征。</li>
<li>通过降维来加速后续计算的速度</li>
<li>还有其他很多目的,如解决数据的sparse问题</li>
</ol>
<p>而比较常用的一种降维方法就是<a href="http://en.wikipedia.org/wiki/Principal_component_analysis">PCA(主成分分析)</a>.</p>
<h1>PCA思路</h1>
<p>降维的过程其实可以看成是一种映射的过程,把在高维空间中的点投影到低维空间中,在这个投影的过程中,我们应当尽量使得信息最大程度的保留。那么,我们应该如何来度量包含信息的多少呢?一种比较常见的方法就是用<a href="http://en.wikipedia.org/wiki/Variance">方差(Variance)</a>来衡量。这在直观上很容易理解,对于数据的一个维度来说,如果这个维度上的数据具有很大的方差,说明这个维度对于数据来说有很大的差异性,其中包含了更多的信息。</p>
<p>另外,如果两个维度之间是无关的,那么这两个维度所包含的信息是没有"重叠"部分的,这种情况包含的信息是最多的;反过来说,如果两个维度是高度相关的,从一个维度就能推出另外一个维度,那么很显然,这两个相关的维度其实最多只包含了一个维度的信息,这就造成了冗余。那么,我们又应该用什么来衡量两个维度之间的相似程度呢?在数学上,我们可以使用<a href="http://en.wikipedia.org/wiki/Covariance">协方差(Covariance)</a>来衡量两个随机变亮之间的相似程度,因此我们可以利用<strong>协方差</strong>来衡量维度之间的相似程度。协方差为0时,说明两个随机变量是完全无关的。</p>
<p>因此,PCA的基本思想是这样的:</p>
<p><strong>将高维空间中的点投影(线性映射)到某个低维空间中间,使得投影之后的点</strong>:</p>
<ol>
<li><strong>每一个维度内部的方差尽量大.</strong></li>
<li><strong>维度之间的协方差为0,也即每一个维度两两正交。</strong></li>
</ol>
<p>假设我们现在有<span class="math">\(m\times n\)</span>的数据<span class="math">\(X\)</span>,其中<span class="math">\(m\)</span>表示数据的大小,<span class="math">\(n\)</span>表示维度的大小。</p>
<p>对于维度<span class="math">\(j\)</span>来说,它的方差为:</p>
<div class="math">$$
\begin{aligned}
Var_j &= \frac{1}{m}\sum\limits_{i=1}^m(X_{ij}-\mu_j)^2 \\
\mu_j &= \frac{1}{m}\sum\limits_{i=1}^mX_{ij}
\end{aligned}
$$</div>
<p>上式中的<span class="math">\(\mu_j\)</span>其实是维度<span class="math">\(j\)</span>的均值.</p>
<p>对于维度<span class="math">\(p\)</span>,<span class="math">\(q\)</span>来说,他们之间的协方差为:</p>
<div class="math">$$
\begin{equation}
Cov_{pq} = \frac{1}{m}\sum\limits_{i=1}^m(X_{ip}-\mu_p)(X_{iq}-\mu_q)
\end{equation}
$$</div>
<p>上式中的<span class="math">\(\mu_p,\mu_q\)</span>其实是维度<span class="math">\(q,q\)</span>的均值.</p>
<p>如果光看上述的式子,也许会觉得计算<span class="math">\(X\)</span>的 每一个维度的方差和协方差是非常麻烦的,其实不然,我们可以利用矩阵运算来简化我们的计算过程。</p>
<p>首先,我们注意到不管在计算方差还是协方差的时候,我们都需要计算<span class="math">\(\mu_j\)</span>,因此,我们可以先对<span class="math">\(X\)</span>进行如下的处理:</p>
<p>计算每一个维度的均值<span class="math">\(\mu_j\)</span>,然后将每个维度上的值减去这个均值,这样就使得每个维度上的均值都变成了0.也即令<span class="math">\(X_{ij}=X_{ij} - \mu_j\)</span>.</p>
<p>经过这样处理之后,原来的方差和协方差就可以表示为:</p>
<div class="math">$$
\begin{aligned}
Var_j &= \frac{1}{m}\sum\limits_{i=1}^m X_{ij}^{2} \\
Cov_{pq} &= \frac{1}{m}\sum\limits_{i=1}^m X_{ip}X_{iq}
\end{aligned}
$$</div>
<p>这看起来还是比较繁琐,但是,事实上,根据矩阵乘法运算的规则,我们可以得到如下的等式:</p>
<div class="math">$$
\begin{equation}
X^{T}X= \begin{bmatrix}
\sum\limits_{i=1}^m X_{i1}^{2} & \dots & \sum\limits_{i=1}^m X_{i1}X_{in}\ \\
\vdots & \ddots & \vdots \\
\sum\limits_{i=1}^m X_{in}X_{i1} & \dots & \sum\limits_{i=1}^m X_n^2
\end{bmatrix}
\end{equation}
$$</div>
<p>可以看到,其实<span class="math">\(\frac{1}{m}X^T X\)</span>是一个对称矩阵,其对角线上的元素就是我们的<strong>方差</strong>,而其他元素就是对应维度之间的<strong>协方差</strong>!</p>
<p>这看来,计算方差和协方差是非常容易的!</p>
<p>令<span class="math">\(C=\frac{1}{m}X^{T}X\)</span>,则<span class="math">\(C\)</span>就称为<span class="math">\(X\)</span>的协方差矩阵。</p>
<p>我们需要进一步具体化我们的优化目标,令<span class="math">\(Y\)</span>表示经过映射之后的数据,则<span class="math">\(Y=XP\)</span>,假设<span class="math">\(D\)</span>是<span class="math">\(Y\)</span>的协方差矩阵,那么我们有如下的推导:</p>
<div class="math">$$
\begin{aligned}
D &= \frac{1}{m}Y^t Y \\
&= \frac{1}{m}(XP)^T(XP)\\
&= \frac{1}{m} P^TX^TXP \\
&= P^T(\frac{1}{m}X^T X)P\\
&= P^T C P
\end{aligned}
$$</div>
<p>也就是说,我们的目标可以变得非常具体了:想要找到这样一个矩阵<span class="math">\(P\)</span>,使得<span class="math">\(P^T C P\)</span>是一个对角矩阵,其对角线元素从大到小一次排列,并且除了对角线以外的其他元素均为0.</p>
<p>从大到小排列是因为方便选取方差较大的维度,对角线以外的元素为0表示新数据的各个维度之间是相互无关的。</p>
<p>现在,我们的问题就是如何使得协方差矩阵<span class="math">\(C\)</span>对角化,这在数学上其实早就已经有了成熟的方法,在矩阵论中,有这样的结论:<strong>一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量</strong>.</p>
<p>设<span class="math">\(n\times n\)</span>的实对称矩阵有特征向量<span class="math">\(e_1,e_2,\cdots,e_n\)</span>,将其组成矩阵<span class="math">\(E=(e_1,e_2,\cdots,e_n)\)</span></p>
<p>则对于<span class="math">\(C\)</span>来说,有如下的结论:</p>
<div class="math">$$
\begin{equation}
E^TC E = \Lambda = \begin{bmatrix}
\lambda_1 & & & \\
& \lambda_2 & & \\
& & \ddots & \\
& & & \lambda_n \\
\end{bmatrix}
\end{equation}
$$</div>
<p>其中<span class="math">\(\Lambda\)</span>是一个对角矩阵,其对角元素是个特征向量对应的特征值。</p>
<p>到了这里,我们就可以发现,我们想要寻找的<span class="math">\(P\)</span>其实就是<span class="math">\(E\)</span></p>
<h1>算法过程</h1>
<p>根据上面的分析,我们就能够得出计算PCA时的几个步骤:</p>
<p>假设原始数据是<span class="math">\(X_{m\times n}\)</span>,其中<span class="math">\(m\)</span>表示数据大小,<span class="math">\(n\)</span>表示维度大小。</p>
<ol>
<li>将<span class="math">\(X\)</span>中的数据进行零均值化,即每一列都减去其均值。</li>
<li>计算协方差矩阵<span class="math">\(C=\frac{1}{m}X^T X\)</span></li>
<li>求出<span class="math">\(C\)</span>的特征值和特征向量</li>
<li>将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P</li>
<li><span class="math">\(Y=XP\)</span>就是降维到k维后的数据。</li>
</ol>
<h1>参考资料</h1>
<ul>
<li><a href="http://blog.csdn.net/jirongzi_cs2011/article/details/9499011">主成分分析(PCA)</a></li>
<li><a href="http://blog.codinglabs.org/articles/pca-tutorial.html">PCA的数学原理</a></li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记2-随机变量and期望2014-03-13T00:00:00-06:002014-03-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2014-03-13:/randomized-algorithm/randomized-algorithms-2/<p>随机算法学习笔记2,这次的重点是随机变量、几个常见分布的期望以及相应的几个例子。</p><h1>随机变量&期望</h1>
<h2>随机变量</h2>
<blockquote>
<p><strong>定义</strong>: 随机变量<span class="math">\(X\)</span>是定义在样本空间<span class="math">\(\Omega\)</span>上的一个实值函数<span class="math">\(X:\Omega\rightarrow \cal{R}\)</span></p>
</blockquote>
<p>需要注意的是,随机变量在这里是一个<strong>函数</strong> ,而不是一个"<strong>变量</strong> ",在没有特殊说明的情况下,这里的随机变量都是指离散的情况。</p>
<blockquote>
<p><strong>定义</strong>: 两个随机变量是独立的,当且仅当</p>
<p>
<div class="math">$$ Pr[(X=x) \wedge (Y=y)] = Pr[X=x] \cdot Pr[Y=y] $$</div>
</p>
</blockquote>
<p>这和事件独立的定义很相似。</p>
<h2>期望</h2>
<blockquote>
<p><strong>定义</strong>: 离散随机变量的期望<span class="math">\(E[X]\)</span>定义如下:</p>
<p>
<div class="math">$$ E[X] = \sum\limits_{x\in X}xPr[X = x] $$</div>
</p>
<p><strong>定理(期望的线性可加性)</strong>: 对于任意的随机变量<span class="math">\(X_1,X_2,\cdots,X_n,\)</span>和实数<span class="math">\(a_1,a_2,\cdots,a_n\)</span>,均有</p>
<p>
<div class="math">$$ E[\sum\limits_{i=1}^na_iX_i] = \sum\limits_{i=1}^n a_i\cdot E[X_i] $$</div>
</p>
</blockquote>
<p>上述定理可以理解成"<strong>和的期望=期望的和</strong> "</p>
<p>证明:</p>
<p>要证明上述的定理,我们首先需要证明两个等式:</p>
<ul>
<li><span class="math">\(E[X+Y] = E[X] + E[Y]\)</span></li>
<li><span class="math">\(E[cX] = cE[X]\)</span></li>
</ul>
<p>上述两个等式的证明非常简单:</p>
<p>第一个等式:</p>
<div class="math">$$
\begin{aligned}
E[X+Y] &= \sum\limits_{x\in X,y\in Y}(x+y)Pr[X=x,Y=y] \\
&= \sum\limits_{x\in X,y\in Y}xPr[X=x,Y=y] + \sum\limits_{x\in X,y\in Y}yPr[X=x,Y=y] \\
&= \sum\limits_{x\in X}xPr[X=x] + \sum\limits_{y\in Y}xPr[Y=y]\\
&= E[X] + E[Y]
\end{aligned}
$$</div>
<p>第二个等式:</p>
<div class="math">$$
\begin{equation}
E[cX] = \sum\limits_{x\in X}cxPr[X=x] = c\sum\limits_{x\in X}xPr[X=x] = cE[X]
\end{equation}
$$</div>
<p>有了上述两个等式之后,我们可以用归纳法来证明这个定理:</p>
<p><span class="math">\(n=2\)</span>时:</p>
<div class="math">$$
\begin{aligned}
E[a_1X_1 + a_2X_2] &= E[a_1X_1] + E[a_2X_2] \\
&= a_1P[X_1] + a_2P[X_2]
\end{aligned}
$$</div>
<p>假设<span class="math">\(n=k-1\)</span>时,<span class="math">\(E\big[\sum\limits_{i=1}^{k-1}a_ix_i\big] = \sum\limits_{i=1}^{k-1}a_iE[x_i]\)</span>成立,则当<span class="math">\(n=k\)</span>时:</p>
<div class="math">$$
\begin{aligned}
E\big[ \sum\limits_{i=1}^ka_iX_i \big] &= E[\sum\limits_{i-1}^{k-1}a_iX_i + a_kX_kA] \\
&= E\big[ \sum_{i=1}^{k-1} a_iX_i \big] + E[a_kX_k] \\
&= \sum\limits_{i=1}^k a_iE[X_i]\\
\end{aligned}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<hr/>
<p><strong>期望的线性可加性</strong>这个定理非常有用,因为它没有任何的附加的条件,不管是否独立,这个定理<strong>总是成立</strong>的。</p>
<blockquote>
<p><strong>定义</strong>: 对于随机变量<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>来说,<strong>条件期望</strong>定义为:</p>
<p>
<div class="math">$$ E[X\vert Y = y] = \sum\limits_{x\in X}xPr[X=x\vert Y=y] $$</div>
</p>
<p><strong>定义</strong>: 对于随机变量<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>来说,<strong>总期望</strong>定义为:</p>
<p>
<div class="math">$$ E[X] = \sum\limits_{y\in Y}E[X\vert Y=y] \cdot Pr[Y=y] $$</div>
</p>
</blockquote>
<h2>Union Bound</h2>
<p><a href="http://en.wikipedia.org/wiki/Union_bound">Union Bound</a>是指一个不等式,这个不等式在概率论中经常被用到,它的描述如下:对于任何的有限或可数事件集合,至少一个事件发生的概率不大于所有独立事件的概率和。</p>
<p>对于事件集合<span class="math">\(A_1,A_2,\cdots\)</span>,我们有:</p>
<div class="math">$$
\begin{equation}
Pr[\mathop{\cup}_i A_i] \le \sum\limits_i Pr[A_i]
\end{equation}
$$</div>
<h1>三种常见的分布</h1>
<h2>伯努利分布(Bernoulli Distribution)</h2>
<p><a href="http://en.wikipedia.org/wiki/Bernoulli_distribution">伯努利分布</a>描述了单个抛硬币的情况,以<span class="math">\(p\)</span>的概率出现正面(<span class="math">\(1\)</span>),而以<span class="math">\(1-p\)</span>的概率出现反面(<span class="math">\(0\)</span>)。</p>
<p>如果<span class="math">\(X\)</span>服从与伯努利分布,则:</p>
<div class="math">$$
\begin{equation}
X=
\begin{cases}
1 \quad p\\
0 \quad 1-p
\end{cases}
\end{equation}
$$</div>
<p>可以看到,对于伯努利分布来说,<span class="math">\(E[X]=p\)</span></p>
<h2>几何分布(Geometric Distribution)</h2>
<p>重复投掷一个硬币直到第一次出现正面,其中的每一次的投掷都是服从伯努利分布的.</p>
<p>令<span class="math">\(X\)</span>表示一共投掷了多少次的随机变量,则我们称<span class="math">\(X\)</span>服从于参数为<span class="math">\(p\)</span>的<a href="http://en.wikipedia.org/wiki/Geometric_Distribution">几何分布</a>:</p>
<div class="math">$$
\begin{equation}
Pr[X=k] = (1-p)^{k-1}p
\end{equation}
$$</div>
<p>对于几何分布来说,我们可以直接利用插值法来计算几何分布的期望,但是,其实还有一种更加巧妙的方法来计算其期望。</p>
<p>令<span class="math">\(Y_k\)</span>表示一个布尔值,当前<span class="math">\(k\)</span>次投掷都没有出现正面时,<span class="math">\(Y_k =1\)</span>,否则<span class="math">\(Y_k=0\)</span>.很显然,我们有<span class="math">\(E[Y_k]=(1-p)^k\)</span>,且<span class="math">\(X=\sum\limits_{k=0}^{\infty}Y_k\)</span>.</p>
<p>则利用期望的线性可加性:</p>
<div class="math">$$
\begin{equation}
E[X] = E\bigg[\sum_{k=0}^{\infty}Y_k\bigg] = \sum_{k=0}^{\infty}E[Y_k] = \sum_{k=0}^{\infty}(1-p)^k = \lim_{k\rightarrow \infty}\frac{1-(1-p)^k}{p} = \frac{1}{p}
\end{equation}
$$</div>
<h2>二项分布(Binomial Distribution)</h2>
<p>如果我们将硬币投掷<span class="math">\(n\)</span>次,每一次投掷都是服从伯努利分布的,用<span class="math">\(X\)</span>表示在这<span class="math">\(n\)</span>投掷中出现正面的次数,则<span class="math">\(Pr[X=k]=\binom{n}{k}(1-p)^{n-k}p^k\)</span></p>
<p>通常来说,我们用<span class="math">\(B(n,p)\)</span>来表示一个<a href="http://en.wikipedia.org/wiki/Binomial_distribution">二项分布</a>。</p>
<p>我们可以利用期望的线性可加性来计算二项分布的期望:</p>
<p>令<span class="math">\(X_i\)</span>表示事件"第<span class="math">\(i\)</span>次投掷为正面",也即当第<span class="math">\(i\)</span>次投掷为正面时,<span class="math">\(X_i=1\)</span>,否则<span class="math">\(X_i=0\)</span>.</p>
<p>显然有<span class="math">\(X=\sum\limits_{i=1}^nX_i\)</span>,且<span class="math">\(E[X_i]=p\)</span>,所以:</p>
<div class="math">$$
\begin{equation}
E[X] = E\bigg[\sum\limits_{i=1}^nX_i\bigg] = \sum\limits_{i=1}^nE[X_i] = np
\end{equation}
$$</div>
<h1>问题举例</h1>
<h2>优惠券搜集问题(Coupon Collector)</h2>
<p>优惠券问题是我小时候常常被坑的一种把戏,某个卖干脆面的商家在每一包的干脆面中都会放置一张小卡片,每一张小卡片都代表一个历史或武侠小说(三国、水浒等)中的人物,如果你能够集齐所有的人物卡片,那么商家会赠送一个大奖给你。这对于小学生来说,是非常具有诱惑力的<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<p>现在我们可以用数学的方式来看一下这种营销模式,我们首先假设商家的这些卡片人物都是均匀分布的<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,那么我们将整个问题建模成一个小球投掷的问题: 假设我们有<span class="math">\(n\)</span>个空箱子(卡片人物),每次都任意地向其中一个箱子投掷一个小球(买一包干脆面),每次投掷都是独立的,且是均匀分布的。那么,现在的问题是平均需要投掷多少次小球,才能使所有的箱子都是非空的。</p>
<p>令<span class="math">\(X\)</span>表示最终投掷小球的数目,这样我们的目标就变成了计算<span class="math">\(E[X]\)</span>.</p>
<p>令<span class="math">\(X_i\)</span>表示有<span class="math">\(i-1\)</span>个箱子非空时,需要投掷多少个小球才能变成有<span class="math">\(i\)</span>个箱子非空。根据这样的建模,我们有<span class="math">\(X=\sum\limits_{i=1}^n X_i\)</span>.</p>
<p>其次,很显然,<span class="math">\(X_i\)</span>是一个几何分布,且对于每一次的投掷来说,投入到一个空箱子的概率是<span class="math">\(p_i=1-\frac{i-1}{n}\)</span>,因此我们有</p>
<div class="math">$$
\begin{equation}
Pr[X_i=k] = (1-p_i)^{k-1}p
\end{equation}
$$</div>
<p>所以<span class="math">\(E[X_i]=\frac{1}{p_i}=\frac{n}{n-i+1}\)</span></p>
<p>利用期望的可加性,我们有:</p>
<div class="math">$$
\begin{equation}
E[X] = E\bigg[ \sum\limits_{i=1}^n X_i \bigg] = \sum\limits_{i=1}^n E[X_i] = n\sum\limits_{k=1}^n\frac{1}{k} = nH(n)
\end{equation}
$$</div>
<p>上式中的<span class="math">\(H(n)\)</span>表示第<span class="math">\(n\)</span>个<strong>调和数</strong>。</p>
<p>又因为<span class="math">\(H(n)=\ln n + O(1)\)</span>,所以为了能够集齐所有的卡片,我们平均需要购买<span class="math">\(n\ln n+O(n)\)</span>袋干脆面。</p>
<h2>负载问题(Occupancy Problem)</h2>
<p>我们可以继续来看一下小球投掷的模型,在<a href="#coupon_collector">优惠券搜集</a>的问题中,我们考虑的关注点在于有多少个箱子是非空的,而在这里,我们考虑的是,每个箱子最多会被投掷多少个小球。</p>
<p>这种模型的一种典型应用就是大型网站的流量分配,对于大型门户网站来说,它的服务器集群都是上百台服务器,如何分配流量请求使得这些服务器不会出现负载过重的现象是非常重要的。要分析类似的负载问题时,我们就可以利用小球投掷来建模。</p>
<p>假设现在有<span class="math">\(m\)</span>个小球需要投掷到<span class="math">\(n\)</span>个箱子中,我们首先来看一下<strong>平均情况</strong>下每一个箱子的负载情况:</p>
<p>令<span class="math">\(X_i\)</span>表示第<span class="math">\(i\)</span>个箱子被投掷的小球数,很显然我们有<span class="math">\(\sum\limits_{i=1}^nX_i=m\)</span>,利用<strong>期望的可加性</strong>,我们有:</p>
<div class="math">$$
\sum\limits_{i=1}^nE[X_i] = E\bigg[\sum\limits_{i=1}^nX_i\bigg] = E[m]=m
$$</div>
<p>又因为我们每一次的投掷都是均匀分布的,且是独立的,因此可以得到<span class="math">\(E[X_i]=\frac{m}{n}\)</span></p>
<p>可以看到,在均匀分布且每次投掷都是独立的情况下,每一个箱子的负载<span class="math">\(E[X_i]=\frac{m}{n}\)</span>.</p>
<hr/>
<p>在实际情况下,除了平均情况以外,我们通常比较关注的是最坏情况,也就是一个箱子在最差情况下它的负载是多少。我们现在就来分析一下这样的最坏情况:</p>
<p>令<span class="math">\(M\)</span>表示某一个箱子在最坏情况被投掷的小球数目,而我们的任务就是要计算<span class="math">\(Pr[\max\limits_{1\le i\le n} X_i\ge M]\)</span>,首先利用<a href="#union_bound">Union Bound</a>,我们有:</p>
<div class="math">\begin{equation}
Pr[\max\limits_{1\le i\le n} X_i\ge M]=Pr\bigg[\mathop{\cup}_i(X_i\ge M)\bigg] \le\sum_{i=1}^nPr[X_i \ge M] = nPr[X_1\ge M]\label{ref0}
\end{equation}</div>
<p>上式中中间的不等号是因为<a href="#union_bound">Union Bound</a>,最后一个等号是因为<span class="math">\(X\_i\)</span>是均匀分布且独立的。</p>
<p>现在我们的问题就变成了估算<span class="math">\(Pr[X_1\ge M]\)</span>,表示第一个箱子至少被投入<span class="math">\(M\)</span>个小球的概率。很显然,我们有:</p>
<div class="math">$$
Pr[X_1=M] = \binom{n}{M}(\frac{1}{n})^M\Rightarrow Pr[X_i\ge M] \le \binom{n}{M}(\frac{1}{n})^M
$$</div>
<p>对于右侧的不等式,我们可以继续计算:</p>
<div class="math">$$
\begin{aligned}
Pr[X_i\ge M] \le\binom{n}{M}(\frac{1}{n})^M &= \frac{n!}{(n-M)!\cdot M!\cdot n^M}\\
&= \frac{n\cdot(n-1)\cdot (n-2)\cdots(n-M+1)}{M!\cdot n^M} \\
&= \frac{1}{M!} \cdot \prod_{i=0}^{M-1}(1-\frac{i}{n})\le\frac{1}{M!}
\end{aligned}
$$</div>
<p>利用<a href="http://en.wikipedia.org/wiki/Stirling's_approximation">Stirling逼近</a>,我们有<span class="math">\(M!\approx \sqrt{2\pi M}(\frac{M}{e})^M\)</span>,因此:</p>
<div class="math">$$
\begin{equation}
Pr[X_i\ge M] \le \frac{1}{M!} \approx \frac{1}{\sqrt{2\pi M}(\frac{M}{e})^M} \le (\frac{e}{M})^M
\end{equation}
$$</div>
<p>将这个结果代回<span class="math">\(\ref{ref0}\)</span>中:</p>
<div class="math">$$
\begin{equation}
Pr[\max\limits_{1\le i\le n} X_i\ge M] \le n\bigg(\frac{e}{M}\bigg)^M
\end{equation}
$$</div>
<p>当<span class="math">\(M=\frac{3\ln n}{\ln\ln n}\)</span>时<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>,我们有:</p>
<div class="math">$$
\begin{aligned}
Pr\bigg[\max\limits_{1\le i\le n} X_i\ge M\bigg] &\le n\big(\frac{e}{M}\big)^M \\
& = n \cdot \bigg(\frac{e\ln\ln n}{3\ln n} \bigg) ^ {\frac{2\ln n}{\ln\ln n}} \\
&< n \cdot \bigg(\frac{\ln\ln n}{\ln n} \bigg) ^ {\frac{2\ln n}{\ln\ln n}} \\
&= n \cdot e^{\frac{3(\ln\ln\ln n-\ln\ln n)\ln n}{\ln\ln n}} \\
&= n \cdot e^{\frac{-3\ln n+3\ln\ln\ln n\ln n}{\ln\ln n}} \\
&\le n\cdot e^{-2\ln n} \\
& = n \cdot \frac{1}{n^2}\\
& = \frac{1}{n}
\end{aligned}
$$</div>
<p>因此,我们可以得出结论:</p>
<div class="math">$$
\begin{equation}
Pr\bigg[\max\limits_{1\le i\le n} X_i\ge \frac{3\ln n}{\ln\ln n}\bigg] \le \frac{1}{n}
\end{equation}
$$</div>
<h1>总结</h1>
<p>随机算法的很多问题在于怎么建模,比如之前的计算几何分布和二项分布的期望的时候,将随机变量设置成一个<span class="math">\(\{0,1\}\)</span>的布尔值,这就在很大程度上简化了计算难度,很容易就能计算其期望。</p>
<p>另外常见的不等式(Union Bound),分布都要比较熟悉,这样才能在遇到具体问题时灵活应用。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>当年被这玩意坑了很多钱。-.-! <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>事实上,对于商检来说,是不可能做成均匀分布的。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>这一步纯粹是靠经验凑出来的结果,为了简化后面的化简过程。这一数值是直接参考老师上课的讲义。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记外传0-Monty Hall问题2014-03-08T00:00:00-07:002014-03-08T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-03-08:/randomized-algorithm/randomized-Algorithms-Addition-0/<p>本文从概率角度阐述了Monty Hall问题。</p><p><a href="http://en.wikipedia.org/wiki/Monty_Hall_problem">Monty Hall Problem</a>主要描述了这样一个场景:假设你参加一个电视节目,有三扇门,其中一扇门之后是一台豪华轿车,其他两扇门之后分别是一头山羊,但是你并不知道汽车在哪扇门之后。首先你随机选择一扇门(假设为a),然后由主持人(知道所有门后的情况)从另外两扇门中打开一扇后面是山羊的门(假设为c),现在只剩下两扇门了(a和b),问你的选择是否改变(选择b)?</p>
<p>其实这就是一个概率的问题,我们可以做一下简单的计算:</p>
<p>首先我们需要假设两个基本事件,<span class="math">\(A=\)</span>"你最终赢得大奖",<span class="math">\(B=\)</span>"第一次的选择是正确的".</p>
<p>现在分两种情况来计算其概率:</p>
<ol>
<li>
<p>选择不换。那么当初你是从三个门中选择一个的,所以<span class="math">\(Pr[A] = \frac{1}{3}\)</span></p>
</li>
<li>
<p>选择换,在这种情况下,可以利用全概率法则对<span class="math">\(Pr[A]\)</span>进行展开:</p>
</li>
</ol>
<div class="math">$$
\begin{equation}
Pr[A] = Pr[A\vert B]Pr[B] + Pr[A\vert \bar{B}]Pr[\bar{B}] = 0 + \frac{2}{3} = \frac{2}{3}
\end{equation}
$$</div>
<p>因为在选择交换的情况下,<span class="math">\(Pr[A\vert B]=0\)</span>,所以上式中的第一项就是<span class="math">\(0\)</span>,同样的,当初是在两扇门之间进行选择,所以<span class="math">\(Pr[\bar{B}]=\frac{2}{3}\)</span>,而<span class="math">\(Pr[A\vert\bar{B}]=1\)</span>,所以第二项为<span class="math">\(\frac{2}{3}\)</span></p>
<p>这个结果也许有一些反直觉,但事实就这样,选择换得奖的概率要比不换大,这正是数学的神奇之处~</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>随机算法学习笔记1-PITandMin-Cut2014-03-04T00:00:00-07:002014-03-04T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-03-04:/randomized-algorithm/Randomized-Algorithms-1/<p>随机算法学习笔记1,主要分析了两个应用随机算法的例子,相对之前的学习笔记0中的例子,本次笔记中的两个例子要相对复杂一些,且更加有趣。</p><h1>多元多项式判定问题(PIT)</h1>
<p>在之前的<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithm-0/">学习笔记0</a> 中,曾经分析过这个问题,但是,当时是对于<strong>单元多项式</strong>进行分析的,这要比多元的情况要简单得多。这次,我们将来看一下<strong>多元多项式</strong>的判定问题。</p>
<p>多元多项式判定问题可以表述成:</p>
<hr/>
<p><strong>input</strong>: 定义在数域<span class="math">\(F\)</span>上度为<span class="math">\(d\)</span>的多元多项<span class="math">\(P_1(x_1,x_2,\cdots,x_n),P_2(x_1,x_2,\cdots,x_n)\)</span></p>
<p><strong>output</strong>: 如果<span class="math">\(P_1(x_1,x_2,\cdots,x_n) \equiv P_2(x_1,x_2,\cdots,x_n)\)</span>,则返回<code>Yes</code>,否则返回<code>No</code></p>
<hr/>
<p>注意,在这里多元多项式的<strong>度</strong>是指每一项中所有变元的指数之和的最大值。</p>
<p>利用随机算法可以很巧妙地设计一种算法思路,首先令<span class="math">\(Q(x_1,x_2,\cdots,x_n)=P_1(x_1,x_2,\cdots,x_n)-P_(x_1,x_2,\cdots,x_n)\)</span>,则原问题可以转化为判断<span class="math">\(D(x_1,x_2,\cdots,x_n)\equiv 0\)</span>是否成立。</p>
<p>一个和<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithm-0/">学习笔记0</a>中相似的算法可以用来进行判断:</p>
<hr/>
<p>Algorithms for PIT</p>
<ol>
<li>从<span class="math">\(F\)</span>中随机取出一个若干个数,形成集合<span class="math">\(S\)</span></li>
<li>从<span class="math">\(S\)</span>中随机取出<span class="math">\(r_1,r_2,\cdots,r_n\)</span>,形成向量<span class="math">\(\vec{r}\)</span></li>
<li>如果<span class="math">\(D(r_1,r_2,\cdots,r_n)=0\)</span>,则返回<code>Yes</code>,否则返回<code>No</code></li>
</ol>
<hr/>
<p>现在我们要来分析这个算法的正确性。</p>
<p>我们的分析过程可以用<strong>归纳法</strong>:</p>
<p>首先,当<span class="math">\(n=1\)</span>时,则多元多项式退化为单元多项式,根据在<a href="http://zhouyichu.com/randomized-algorithm/Randomized-Algorithm-0/">学习笔记0</a>中的分析,使用该算法的情况下,单元多项式判断出错的概率是</p>
<div class="math">$$
\begin{equation}
Pr[D(r)=0] \leq \frac{d}{\vert S \vert}
\end{equation}
$$</div>
<p>我们假设在<span class="math">\(n=k-1\)</span>时,<span class="math">\(Pr[D(r_1,r_2,\cdots,r_{k-1})]\leq \frac{d}{\vert S \vert}\)</span>成立。</p>
<p>则当<span class="math">\(n=k\)</span>时,可以<span class="math">\(D(x_1,x_2,\cdots,x_n)\)</span>表示成:</p>
<div class="math">$$
\begin{equation}
D(x_1,x_2,\cdots,x_k) = \sum\limits_{i=0}^tx_1^iD_i(x_2,x_3,\cdots,x_k)
\end{equation}
$$</div>
<p>其中,<span class="math">\(t\)</span>表示<span class="math">\(x_1\)</span>的最大指数,这也就意味着,对于<span class="math">\(D_t\)</span>来说,它的度<strong>最大</strong>是<span class="math">\(d-t\)</span>,同时<span class="math">\(D_t\not\equiv 0\)</span></p>
<p>特别的,我们可以将<span class="math">\(D\)</span>写成如下的特殊形式:</p>
<div class="math">$$
\begin{equation}
D(x_1,x_2,\cdots,x_k) = x_1^tD_t(x_2,x_3,\dots,x_k) + \bar{D}(x_1,x_2,\cdots,x_k)
\end{equation}
$$</div>
<p>注意,这里的<span class="math">\(\bar{D}(x_1,x_2,\cdots,x_k)\)</span>中是不含<span class="math">\(x_1^t\)</span>这一项的。</p>
<p>根据<strong>归纳法</strong>的证明步骤,在我们现在需要证明<span class="math">\(Pr[D(r_1,r_2,\cdots,r_k)=0]\le \frac{d}{\vert S \vert}\)</span></p>
<p>首先,令<span class="math">\(\epsilon\)</span>表示事件"<span class="math">\(D_t(r_2,r_3,\cdots,r_k)=0\)</span>"我们可以利用全概率法则,将<span class="math">\(D(r_1,r_2,\cdots,r_k)\)</span>展开成:</p>
<div class="math">$$
\begin{equation}
Pr[D(\vec{r})=0] = Pr[D(\vec{r})=0\vert \epsilon]\cdot Pr[\epsilon] + Pr[D(\vec{r})=0\vert \neg\epsilon]\cdot Pr[\neg\epsilon] \label{ref0}
\end{equation}
$$</div>
<p>对于<span class="math">\(D_t(x_2,x_3,\dots,x_k)\)</span>来说,它满足以下三点性质:</p>
<ol>
<li><span class="math">\(D_t\)</span>来说,它有<span class="math">\(k-1\)</span>个未知数,也即<span class="math">\(k-1\)</span>个变元</li>
<li><span class="math">\(D_t\)</span>的<strong>度</strong>最大不会超过<span class="math">\(d-t\)</span></li>
<li><span class="math">\(D_t\not\equiv 0\)</span></li>
</ol>
<p>则根据我们之前的假设,应该有</p>
<div class="math">$$
\begin{equation}
Pr[D_t(r_2,r_3,\cdots,r_k)=0]\le \frac{d-t}{\vert S\vert}\label{ref1}
\end{equation}
$$</div>
<p>而当<span class="math">\(D_t(r_2,r_3,\cdots,r_k)\neq 0\)</span>也即<span class="math">\(\urcorner\epsilon\)</span>成立时,令</p>
<div class="math">$$
\begin{equation}
D(x_1,r_2,\cdots,r_k) = x_1^tD_t(r_2,r_3,\cdots,r_k) + \bar{D}(x_1,r_2,\cdots,r_k) = G(x_1)
\end{equation}
$$</div>
<p>则,<span class="math">\(G\)</span>有如下三点性质:</p>
<ol>
<li><span class="math">\(G(x_1)\)</span>是一个单元多项式</li>
<li><span class="math">\(G(x_1)\not\equiv 0\)</span></li>
<li><span class="math">\(G(x_1)\)</span>的度为<span class="math">\(t\)</span>(因为<span class="math">\(D_t(r_2,r_3,\cdots,r_k)\neq 0\)</span>,所以<span class="math">\(x_1^t\)</span>一定存在,同时<span class="math">\(\bar{D}(x_1,r_2,\cdots,r_k)\)</span>中又不包含<span class="math">\(x\_1^t\)</span>这一项)</li>
</ol>
<p>所以有</p>
<div class="math">$$
\begin{equation}
Pr\big[D(\vec{r})=0\big\vert \neg\epsilon\big] = Pr[G(r_1)=0\big\vert \neg\epsilon]\leq \frac{t}{\vert S \vert}\label{ref2}
\end{equation}
$$</div>
<p>而根据<span class="math">\(\ref{ref0}\)</span>的等式,我们可以做如下变换:</p>
<div class="math">$$
\begin{equation}
Pr\big[D(\vec{r})=0\big] = Pr\big[D(\vec{r})=0\big\vert \epsilon\big]\cdot Pr\big[\epsilon\big] + Pr\big[D(\vec{r})=0\big\vert \neq\epsilon\big]\cdot Pr\big[\neg\epsilon] \leq Pr[\epsilon] + Pr[D(\vec{r}=0)\vert \neg\epsilon]
\end{equation}
$$</div>
<p>而上式中右侧的<span class="math">\(Pr[\epsilon]\)</span>和<span class="math">\(Pr[D(\vec{r}=0)\vert \neg\epsilon]\)</span>可以通过<span class="math">\(\ref{ref1}\)</span>和<span class="math">\(\ref{ref2}\)</span>进行计算,因此我们就能得到:</p>
<div class="math">$$
\begin{equation}
Pr\big[D(\vec{r})=0\big]\le Pr[\epsilon] + Pr[D(\vec{r}=0)\vert \neg\epsilon] = \frac{d-t}{\vert S \vert} + \frac{t}{\vert S \vert} = \frac{d}{\vert S \vert}
\end{equation}
$$</div>
<p><span class="math">\(\Box\)</span></p>
<p>综上,我们证明了当<span class="math">\(P\_1,P\_2\)</span>为多元多项式时,该算法依然能保持<span class="math">\(\frac{d}{\vert S \vert}\)</span>的概率返回错误解,利用独立重复运行的方法,可以将这个错误率进一步减小,因此这就证明了该算法的可行性。</p>
<h1>最小割问题</h1>
<p>现在我们来看另外一个问题——<a href="http://en.wikipedia.org/wiki/Min-cut">最小割问题</a>,<strong>最小割问题</strong>的描述比较复杂,具体问题描述可以从wiki上找到,这里我就不多阐述了,直接来看一下解决这个问题的随机化的算法吧。</p>
<p>首先,我们需要定义一种"合并(contract)"操作,它将图中一条边上的两个定点合并,但是除了这两个点之间的边以外的边均保持不变(有可能因此会形成<strong>平行边</strong>)。</p>
<p>如下图所示,粗边被<code>contract</code>之后就得到右边的图了。</p>
<p>{% asset_img min-cut.png 最小割 %}
<img alt="最小割" src="http://zhouyichu.com/images/min-cut.png"/></p>
<p>在定义了<code>contract</code>操作之后,我们就能够在图<span class="math">\(G(V,E)\)</span>上构造我们随机化的算法了:</p>
<hr/>
<p>RandomContract(Karger 1993)</p>
<p>while <span class="math">\(\vert V \vert > 2\)</span> do:
{</p>
<ul>
<li>随机地从G中选出一条边<span class="math">\(e\)</span></li>
<li>对于<span class="math">\(e\)</span>执行<code>contract</code>操作,G = contract(G,e)</li>
</ul>
<p>}
return E</p>
<hr/>
<p>算法最终返回的是只有两个点的图,而这两点中有着很多的平行边,而此时所有平行边的个数就是我们<strong>最小割</strong>中边的个数。</p>
<p>还是一样的,我们需要分析这个算法的正确性。</p>
<p>首先,我们需要引入两个引理:</p>
<blockquote>
<p>引理1: 如果选取的<span class="math">\(e\)</span>不存在于最小割<span class="math">\(C\)</span>中,则contract(G,e)中的最小割大小不会超过<span class="math">\(G\)</span>中的最小割大小。也即,contract操作不会破坏最小割。</p>
</blockquote>
<p>证明: 因为最小割<span class="math">\(C\)</span>将图分成两部分,假设分别是<span class="math">\(P\)</span>和<span class="math">\(Q\)</span>,则现在只有三种边,分别属于<span class="math">\(C\)</span>,<span class="math">\(P\)</span>和<span class="math">\(Q\)</span>,而我们的前提条件是<span class="math">\(e\not\in C\)</span>,所以<span class="math">\(e\)</span>之能是属于<span class="math">\(P\)</span>或<span class="math">\(Q\)</span>,因此并不会改变原来的<span class="math">\(C\)</span>.<span class="math">\(\Box\)</span></p>
<blockquote>
<p>引理2: 如果<span class="math">\(C\)</span>是<span class="math">\(G(V,E)\)</span>中的最小割,则<span class="math">\(\vert E\vert \ge \frac{\vert V\vert\vert C\vert}{2}\)</span></p>
</blockquote>
<p>证明: 因为<span class="math">\(C\)</span>是<span class="math">\(G(V,E)\)</span>中的一个最小割,则说明<span class="math">\(G\)</span>中所有的点的度都至少为<span class="math">\(C\)</span>,则边集的大小至少为<span class="math">\(\frac{\vert V\vert\vert C\vert}{2}\)</span>,也即<span class="math">\(\vert E\vert \ge \frac{\vert V\vert\vert C\vert}{2}\)</span> <span class="math">\(\Box\)</span></p>
<p>有了这两个引理,我们可以开始对Karger算法进行分析了。</p>
<p>很显然,要该算法返回正确的结果,就必须保证每次随机选择的边<span class="math">\(e\)</span>均不能属于<span class="math">\(C\)</span>,因为一旦<span class="math">\(C\)</span>中的边<code>contract</code>了,则最小割就被破坏了,算法会返回出一个错误的结果。</p>
<p>考虑单次随机选择的情况,假设前面的<span class="math">\(i-1\)</span>次随机选择都没有选取到<span class="math">\(C\)</span>中的边,则第<span class="math">\(i\)</span>次依然没有选取<span class="math">\(C\)</span>中的边的概率为:</p>
<div class="math">$$
\begin{equation}
Pr[e\not\in C] = 1 - \frac{\vert C\vert}{\vert E_{i} \vert}
\end{equation}
$$</div>
<p>其中<span class="math">\(E\_{i}\)</span>表示经过<span class="math">\(i-1\)</span>次选取之后,图中剩余的边集。</p>
<p>而根据<strong>引理2</strong>,我们可以得到:</p>
<div class="math">$$
\begin{equation}
Pr[e\not\in C] = 1 - \frac{\vert C\vert}{\vert E_{i} \vert} \ge 1 - \frac{2}{\vert V_i \vert}
\end{equation}
$$</div>
<p>其中<span class="math">\(V_{i}\)</span>表示经过<span class="math">\(i-1\)</span>次选取之后,图中剩余的点集。而又因为,每一次的<code>contract</code>操作都会减少一个点,因此<span class="math">\(V_i = n-i+1\)</span></p>
<p>令<span class="math">\(\epsilon\)</span>表示事件"在<span class="math">\(n-2\)</span>次选择中,都没有选中<span class="math">\(C\)</span>中的边"</p>
<p>因此在整个算法过程中,<span class="math">\(C\)</span>中没有边被选中的概率为:</p>
<div class="math">$$
\begin{aligned}
Pr[\epsilon] &= \prod\limits_{i=1}^{n-2}Pr[第i次选择没有选中C中的边\vert 前i-1次选择都没有选中C中的边] \\
&\ge \prod\limits_{i=1}^{n-2}\bigg( 1 - \frac{2}{\vert V_{i} \vert} \bigg) \\
&= \prod\limits_{i=1}^{n-2}\bigg(1- \frac{2}{n-i+1} \bigg) \\
&= \prod\limits_{k=3}^{n}\frac{k-2}{k} \\
&= \frac{2}{n(n-1)}
\end{aligned}
$$</div>
<p>这就说明,每一次运行该算法,能够以<span class="math">\(\frac{n(n-1)}{2}\)</span>的概率得到正确的结果,因此,如果我们独立重复执行该算法<span class="math">\(n(n-1)\)</span>次,然后最终返回一个最小的<span class="math">\(C\)</span>,则返回一个正确解的概率是:</p>
<div class="math">$$
\begin{equation}
Pr[得到正确解] = 1-Pr[每一次运行都失败] \ge 1-\bigg( 1- \frac{2}{n(n-1)} \bigg)^{\frac{n(n-1)}{2}} \ge 1-\frac{1}{e}
\end{equation}
$$</div>
<p>这个结果很好,因为它是一个和<span class="math">\(n\)</span>无关的常量!</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>2014年2月阅读书单2014-03-01T00:00:00-07:002014-03-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-03-01:/reading-list/Reading-List-2014-February/<p>2014年2月的阅读书单</p><h1>明朝那些事</h1>
<p>作者:<strong>当年明月</strong></p>
<p>我想应该有很多人都看过这个系列的书吧,全集一共7册,我是在kindle上看完的。书中描述了明朝两百七十多年的历史,各个政治人物依次登场,走马换灯似的出现了又消失了,这也许是因为我一口气连续看完所产生的错觉吧。</p>
<p>总体说来,作者还是以比较中立的态度来写作的,之前看《大秦帝国》,总是觉得作者明显有着主观倾向,将每一个秦国人都描写成了正人君子,而山东六国都是小人当政。相比而言,当年明月还是很客观的,有多故事都是有史实根据的。</p>
<hr/>
<h1>上帝掷骰子吗?量子物理史话</h1>
<p>作者: <strong>曹天元</strong></p>
<p>首先想说的是,这本书确实不错!虽然仅仅是量子物理的<strong>史话</strong>,但是它以通俗易懂的方式向人们诠释了量子物理的基本原理,以及整个近代物理的发展历程。</p>
<p>我们应该感谢每一位科学工作者,正是因为他们的努力,人类才能逐步发展,从刀耕火种的原始时代直到现在的电子信息时代,人类的发展历程很大程度上就是由他们推动的。</p>
<p>书中最让我受到启发的地方是在后半段,量子物理中的量子纠缠现象让人们以全新的角度来看待我们的世界,我不是专业学物理的,只能从直观上,说说从中让我感到很受启发的思想<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>:</p>
<ol>
<li>一个物理量只有在被观测之后才是确定的,在被观测之前是处于无数种可能的情况的叠加状态。</li>
<li>哥本哈根思想: 这个世界不是<strong>独立存在</strong>的,是由我们的"意识"所"决定"的。当我们人类发出疑问:"为什么这个世界是这样的?"的时候,实际上我们就已经在默认这个世界"必须"是这样的,否则我们人类就不可能存在,不可能提出这个疑问了.</li>
<li>平行宇宙思想: 由于量子力学中的不确定性,每当一个电子从叠加状态坍缩成确定性的状态时,每一个可能都构成了一个新的世界,也就是说每一个时刻世界都在发生分裂,分裂成许许多多的平行宇宙。</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>这些思想全是物理学家们对实验现象做出的理论解释,并<strong>不一定</strong>{:.red}都是对的,但是这些思想确实让我重新思考我们的世界。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Web Server 和 Web Framework2014-02-23T00:00:00-07:002014-02-23T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-02-23:/web-developing/Web-Server-Framework/<p>虽然之前做过一些网络的开发,但仅仅停留在表面的,对于web server、web framework全是一知半解的,最近想要自己做一些小应用,本着"系统"学习的原则,在正式开发之前,对现存的各种web架构做了一下调研,理清了web server,web framework等概念,为了巩固知识,现整理成本文。</p><p>虽然之前做过一些网络的开发,但仅仅停留在表面的,对于web server、web framework全是一知半解的,最近想要自己做一些小应用,本着"系统"学习的原则,在正式开发之前,对现存的各种web架构做了一下调研,理清了web server,web framework等概念,为了巩固知识,现整理成本文。</p>
<h1>代理</h1>
<p>在正式说明web架构之前,首先需要谈的的是"代理"的概念,之前在调研的时候,总是看到"反向代理"这个词,一直不知道是什么意思。后来仔细查了一下,终于理解了,现在记录下来。</p>
<h2>正向代理</h2>
<p>所谓<strong>正向代理</strong>,其实就是我们常说的"代理",简单的说,其实它就是一个跳板,利用这个跳板你可以访问一些你原来无法访问的网络地址。也就是说<strong>正向代理</strong>是指:<strong>代理服务器替代访问方去访问目标服务器</strong>{: style="color:red"}</p>
<p>正向代理最主要的应用场景就是在局域网内部访问外网的时候,有些组织内部的局域网是不能直接连接外网的,如果局域网内的用户想要连上外网的话,这就需要通过一台处于局域网内且能连通外网的服务器作为代理,利用这个代理服务器,局域网内的用户就能够连上外网了。</p>
<p>这个过程可以用下图来表示:</p>
<p><img alt="正向代理" src="http://zhouyichu.com/images/forward.png" title="正向代理"/></p>
<p>对于<code>Client A</code>来说,它就是使用了"代理"来连上Internet.</p>
<p>当然,正向代理的应用场景不止是这样,其他主要的应用场景主要有:</p>
<ol>
<li><strong>访问无法访问的服务器</strong>.比如某个服务器A是存在于某个局域网内部的,外网是无法访问,此时如果有另外一台服务器B,它处于和A同样的局域网内,但是却可以和Internet连接,如果B设置了代理服务的话,我们就能够利用代理服务器B从外网访问到A了。</li>
<li><strong>加速访问</strong>.如果用户所在的路由线路的带宽比较低的话,利用一个代理服务器是可以加速网络访问的。但是现在的宽带发展迅猛,这种使用场景已经很少了。</li>
<li><strong>Cache</strong>.代理服务器可以缓存一些之前别人已经浏览过的内容,当你再次访问的时候,就不需要"千里迢迢"地去访问原始地址了,代理服务器就能够把你需要的内容返回给你。</li>
<li><strong>隐藏自己</strong>.现在大家在上网的时候,会留下很多的痕迹。服务器端会如实的记录下每一次访问的IP及其他客户端的信息,但是如果使用代理访问网站的话,那么网站记录的是代理服务器的信息,而不是自己本机的信息,这样就能够隐藏自己的"行踪"了。</li>
</ol>
<h2>反向代理</h2>
<p><strong>反向代理</strong>的概念和<strong>正向代理</strong>正好相反:客户端直接访问服务器S,但是服务器却把用户的请求转发给服务A,由A处理请求,然后再通过服务器S返回给用户。在这个过程中,用户完全不知道服务器A的存在。</p>
<p>如下图所示:</p>
<p><img alt="反向代理" src="http://zhouyichu.com/images/backward.png"/></p>
<ol>
<li><strong>隐藏和保护原始资源服务器</strong>.用户Client始终认为它访问的真正的资源服务器,但利用反向代理技术,它访问的只是反向代理的服务器,这样就很好的隐藏了真正的资源服务器,防止各种千奇百怪的访问请求损害资源服务器。</li>
<li><strong>负载均衡</strong>.当访问连接数非常巨大的时候,单个资源服务器已经无法满足应用需求,那就需要配置成一个服务器集群,而此时反向代理服务器能够平衡各个资源服务器的负载量,优先将请求转发给负载较小的服务器。</li>
</ol>
<h2>总结</h2>
<p>从上面的分析中,可以看到,所谓<strong>正向代理</strong>,是指在Client和目标Server之间加入一个代理服务器,这是Client的主动行为;而所谓<strong>反向代理</strong>,是指在目标Sever之后加入一个代理服务器,用户完全感知不到代理服务器的存在,Client完全是"被"代理的。</p>
<h1>Web架构</h1>
<p>通常来说,web应用一般是三层结构:</p>
<pre><code>:::bash
web server --->web application ---> DB server
</code></pre>
<h2>Web Server</h2>
<p>其中的<strong>web server</strong>就是我之前疑惑的概念之一,其实这里的web server是指通过某种协议使得计算机能够通过网络交换数据的软件系统,通常是主从结构的,也即由Client发起请求,web server接收请求并返回结果。这其中又包括了很多各种各样的协议,其中最常用的就是http协议了,就是我们所说的网站访问了。而<strong>web server</strong>通常就是负责处理接收到的请求的程序。其中比较常见的<strong>web server</strong>主要有:apahce,lighttpd,nginx,IIS,tornado等.</p>
<p>web server主要有以下三个功能:</p>
<ol>
<li><strong>高效地处理静态文件</strong></li>
<li><strong>充当简易的防火墙</strong></li>
<li><strong>处理高并发短连接请求</strong></li>
</ol>
<h2>Web Framework</h2>
<p><strong>Web Server</strong>是负责处理用户发起的请求的,而真正的逻辑处理是由上述的第二层结构<strong>web application</strong>处理的,<strong>web Server</strong>接收到用户发起的请求之后,它会将这个请求转交给<strong>web application</strong>,由<strong>web application</strong>处理数据,进行运算或逻辑处理,然后将计算结果交还给<strong>web server</strong>,<strong>web server</strong>再将数据发回给用户。</p>
<p>而所谓的<strong>web framework</strong>是指用来编写<strong>web application</strong>的工具包。</p>
<p>常见的Web Framework有很多很多,包括:</p>
<ul>
<li>Python的web框架: Django,Bottle,Flask</li>
<li>Ruby的web框架: Rails</li>
<li>java的web框架: Spring,JFinal</li>
<li>PHP的web框架: Yii,ThinkPHP</li>
</ul>
<h2>DB server</h2>
<p><strong>DB server</strong>就是指存储服务,在web开发中通常是mysql,但是现在随着数据量不断增大,很多非关系型的数据库越来越多,如MongDB等。</p>
<h2>总结</h2>
<p>其实这几个概念是非常浅显的,之前之所以有疑惑,是因为现在的很多<strong>web framework</strong>都自己集成了小型的<strong>web server</strong>,比如Django、Bottle等,安装完成之后,直接能开启web服务;而很多的<strong>web server</strong>又集成了<strong>web framework</strong>的功能,能够直接写<strong>web application</strong>,比如tornado等<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。因此,之前刚接触这些框架的时候,不管三七二一能够跑起来就行了,都没有深入去了解其中的原理。现在仔细调研和分析之后,整个web服务的结构就一清二楚了。</p>
<p>虽然现在的很多<strong>web framework</strong>都集成了<strong>web server</strong>(或者<strong>web server</strong>集成了<strong>web framework</strong>),但是最好还是把这两个任务分开处理,这样能使它们"各司其职",不会出现性能的问题。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://lutaf.com/141.htm">全面解读python web 程序的9种部署方式</a></li>
<li><a href="http://bigc.at/reverse-proxy.orz">正向代理与反向代理的区别</a></li>
<li><a href="http://z00w00.blog.51cto.com/515114/1031287">图解正向代理、反向代理、透明代理</a></li>
<li><a href="http://www.zhihu.com/question/20136991">知乎:如何理解 Tornado ?从 web server、web 框架、和异步 I/O 模型的角度,分别与 Nginx、Django 和 Node.js 对比。</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实,可以这么说,<strong>Bottle</strong>是一个<strong>web framework</strong>,顺带了一个开发服务器;<strong>tornado</strong>是一个<strong>web server</strong>,顺带了一个mini框架。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>随机算法学习笔记0-概率空间and计算模型2014-02-20T00:00:00-07:002014-02-20T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-02-20:/randomized-algorithm/Randomized-Algorithm-0/<p>随机算法的学习笔记0,主要说明了概率空间、Monte Carlo Algorithm和Las Vegas Algorithm的概念,接着是两个应用随机算法的例子。</p><p>这学期选修了一门"随机算法"的课程,感觉其中的思想非常有趣和好玩,但是其中的分析过程也是比较复杂和不太好理解的。为了督促自己好好学习这一门课,打算开始记笔记,将自己理解的内容记录下来。</p>
<h1>概率空间</h1>
<p>由于在随机算法的分析过程中,大量使用了概率论中的知识,随机算法很大程度上就是在计算概率,所以首先要给出<strong>概率空间</strong>的定义,下面是<strong>概率空间</strong>形式化的定义.</p>
<p>概率空间是对一个随机过程的建模,可以用一个三元组<span class="math">\((\Omega,\Sigma,Pr)\)</span>来表示,其中:</p>
<ul>
<li><span class="math">\(\Omega\)</span>: <strong>样本空间</strong>,表示随机过程中所有可能的输出结果(<strong>基本事件</strong>)。</li>
<li><span class="math">\(\Sigma\)</span>: <strong>事件集合</strong>,表示所有可能的事件的<strong>集合</strong>,一个事件由0个或多个<strong>基本事件</strong>组成。</li>
<li>Pr: <strong>概率测度</strong>,表示一个从<span class="math">\(\Sigma\)</span>到实数域的函数,<span class="math">\(Pr: \Sigma \mapsto R\)</span>.每一个事件都被此函数赋予一个0和1之间的<strong>概率值</strong>。</li>
</ul>
<p>一个概率空间有如下的五个约束条件:</p>
<ol>
<li><span class="math">\(\Omega\in\Sigma\)</span>且<span class="math">\(\emptyset\in\Sigma\)</span>(分别表示<strong>确定事件</strong>和<strong>不可能事件</strong>都属于<span class="math">\(\Sigma\)</span>)</li>
<li>如果<span class="math">\(A,B\in \Sigma\)</span>,则<span class="math">\(A\cap B,A\cup B,A-B\in\Sigma\)</span>,(事件的交、并、差运算之后仍然是事件).</li>
<li><span class="math">\(Pr(\Omega) = 1\)</span>(所有基本事件的概率和为1)</li>
<li>如果<span class="math">\(A\cap B = \emptyset\)</span>,则<span class="math">\(Pr(A\cup B)=Pr(A) + Pr(B)\)</span></li>
<li>对于一个事件序列:<span class="math">\(A_1\supset A_2\supset\cdots A_n\cdots\)</span>,如果<span class="math">\(\cap_n A_n = \emptyset\)</span>,则<span class="math">\(\lim\limits_{n\rightarrow \infty}Pr(A_n) = 0\)</span></li>
</ol>
<h2>几个结论</h2>
<ol>
<li>令<span class="math">\(\bar{A} = \Omega - A\)</span>.则<span class="math">\(Pr(\bar{A}) = 1 - Pr(A)\)</span></li>
<li>如果<span class="math">\(A \subseteq B\)</span>,则<span class="math">\(Pr(A) \leq Pr(B)\)</span></li>
</ol>
<p><strong>定义</strong>: </p>
<p>两个事件<span class="math">\(\xi_1\)</span>和<span class="math">\(\xi_1\)</span><strong>独立</strong>当且仅当<span class="math">\(Pr(\xi_1\land \xi_2) =Pr(\xi_1)\cdot Pr(\xi_2)\)</span></p>
<p><strong>条件概率</strong></p>
<p>在给定<span class="math">\(\xi_2\)</span>的情况下发生<span class="math">\(\xi_1\)</span>的概率是:<span class="math">\(Pr[\xi_1\vert\xi_2] = \frac{Pr[\xi_1\wedge\xi_2]}{Pr[\xi_2]}\)</span></p>
<p><strong>全概率法则</strong></p>
<p>令<span class="math">\(\xi_1,\xi_2,\cdots,\xi_n\)</span>是互不相交的事件,且<span class="math">\(\mathop{\vee}_{i=1}^n\xi_n = \Omega\)</span>(完备事件组),那么,对于任意一个事件<span class="math">\(\xi\)</span>,有<span class="math">\(Pr[\xi]=\sum\limits_{i=1}^nPr[\xi\vert\xi_i]\cdot Pr[\xi_i]\)</span></p>
<p><strong>链式法则</strong></p>
<p>令<span class="math">\(\xi_1,\xi_2,\cdots,\xi_n\)</span>是任意的n个事件,则<span class="math">\(Pr[\mathop{\wedge}_{i=1}^n] = \prod\limits_{k=1}^nPr[\xi_k\vert \mathop{\wedge}_{i<k}\xi_i]\)</span></p>
<p>上述这些定义和结论,出了<strong>概率空间</strong>的定义比较新以外,其他内容都是概率统计中的基本内容,此处不再深入说明了。</p>
<h1>随机算法举例</h1>
<p>简单介绍完有关概率的内容之后,我们就要来看看神奇的随机算法的例子,下面是两个比较简单的随机算法的例子,刚看完这两个例子的时候,我就觉得随机算法真是神奇。</p>
<h2>矩阵乘法(Checking Matrix Multiplication)</h2>
<p>首先来看一下一个矩阵乘法的例子,对于三个<span class="math">\(n\times n\)</span>的矩阵<span class="math">\(A,B,C\)</span>,我们想要验证<span class="math">\(AB\)</span>是否等于<span class="math">\(C\)</span>,这个问题可以表述成:</p>
<hr/>
<p><strong>input</strong>: 3个<span class="math">\(n\times n\)</span>的矩阵<span class="math">\(A,B,C\)</span></p>
<p><strong>output</strong>: 如果<span class="math">\(AB==C\)</span>则返回<code>Yes</code>,否则返回<code>No</code></p>
<hr/>
<p>面对这样的问题,最朴素的方法就是直接计算两个<span class="math">\(n\times n\)</span>的矩阵乘法,得到<span class="math">\(AB\)</span>的具体结果,但是事实上,要计算两个<span class="math">\(n\times n\)</span>的矩阵时间代价是<span class="math">\(O(n^3)\)</span>,这样的代价是无法忍受的,所以有必要寻找更好的算法。</p>
<p>一种可行的随机化的算法如下所示:</p>
<hr/>
<p><strong>Freivalds Algorithm</strong></p>
<ol>
<li>
<p>从<span class="math">\(\{0,1\}^n\)</span>中以等概率的分布随机选取一个向量<span class="math">\(v\)</span><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
</li>
<li>
<p>计算<span class="math">\(A(Bv)\)</span>与<span class="math">\(Cv\)</span>,如果<span class="math">\(A(Bv)==Cv\)</span>,则返回<code>Yes</code>,否则返回<code>No</code></p>
</li>
</ol>
<hr/>
<p>需要注意的是,在上面的计算过程中,首先需要计算<span class="math">\(Bv\)</span>,然后再计算<span class="math">\(A(Bv)\)</span>,这样做的好处是,将以本来需要计算<span class="math">\(n\times n\)</span>矩阵相乘问题变成<span class="math">\(n\times 1\)</span>的矩阵乘向量的问题,计算代价明显下降了。</p>
<p>但是,很明显这个算法是不能保证每次都能得到正确的结果,我们可以来分析一下:</p>
<p><strong>情况1</strong>: <span class="math">\(AB\)</span>确实和<span class="math">\(C\)</span>是相等的,则不管我随机得到的<span class="math">\(v\)</span>是什么,<span class="math">\(A(Bv)\)</span>与<span class="math">\(Cv\)</span>也总是相等的,所以在这种情况下,<strong>Freivalds Algorithm</strong>确实能得到正确的解。</p>
<p><strong>情况2</strong>: <span class="math">\(AB\)</span>和<span class="math">\(C\)</span>并不相等,则如果我们得到的<span class="math">\(v\)</span>满足<span class="math">\(A(Bv)==Cv\)</span>,那么该算法将会返回一个错误的解。反之,则可以返回一个正确的解。那么,我们不妨可以分析一下,该算法返回一个错误解的概率是多少。</p>
<hr/>
<p>该算法返回出一个错误的解,只有一种情况:原来的<span class="math">\(AB\neq C\)</span>,但是我们随机得到的一个<span class="math">\(v\)</span>,使得<span class="math">\(A(Bv)==Cv\)</span>.</p>
<p>令事件<span class="math">\(\epsilon=\)</span>"<span class="math">\(AB\neq C\)</span>,而<span class="math">\(A(Bv)=Cv\)</span>"</p>
<p>假设<span class="math">\(D=AB-C\neq 0\)</span>,则<span class="math">\(A(Bv)=Cv\)</span>可以表示为<span class="math">\(Dv=0\)</span>,也就是说,<span class="math">\(D\neq 0\wedge Dv=0\)</span>.</p>
<p>因为<span class="math">\(D\neq 0\)</span>,所以,必存在一个<span class="math">\(D_i:D_i\neq 0\)</span>(注意,这里的<span class="math">\(D_i\)</span>是一个<span class="math">\(1\times n\)</span>的向量。);而又因为<span class="math">\(Dv=0\)</span>,所以必定有<span class="math">\(D_i\times v=0\)</span>.</p>
<p>因为<span class="math">\(D_i\neq 0\)</span>,则在<span class="math">\(D_i\)</span>中<strong>至少</strong>有一个<span class="math">\(D_{ij}\neq 0\)</span>,将<span class="math">\(D_i\times v =0\)</span>展开:</p>
<div class="math">$$
\begin{equation}
D_i\times v = D_{i1}\times v_1 + D_{i2}\times v_2 + \dots + D_{ij}\times v_j + \dots + D_{in}\times v_n = 0
\end{equation}
$$</div>
<p>因为<span class="math">\(D_{ij}\neq 0\)</span>,所以<span class="math">\(v_j\)</span>可以被表示成</p>
<div class="math">$$
\begin{equation}
v_j = \frac{\sum\limits_{k=1\wedge k\neq j}^n D_{ik}v_k}{D_{ij}}
\end{equation}
$$</div>
<p>这说明当事件<span class="math">\(\epsilon\)</span>发生时,<span class="math">\(v\)</span>中的<span class="math">\(1\)</span>个元素是由其他<span class="math">\(n-1\)</span>个元素决定的,也就是说,在这种情况下,<span class="math">\(v\)</span>只有<span class="math">\(2^{n-1}\)</span>种可能性。</p>
<p>而<span class="math">\(v\)</span>本身却有<span class="math">\(2^n\)</span>种可能性,所以我们可以说事件<span class="math">\(\epsilon\)</span>发生的可能性<span class="math">\(Pr[\epsilon]\leq\frac{2^{n-1}}{2^n}=\frac{1}{2}\)</span>.</p>
<p>综上,也就说,<strong>Freivalds Algorithm</strong>返回错误解的可能性<strong>最多</strong>为<span class="math">\(\frac{1}{2}\)</span></p>
<p>然后这个结果似乎并不太好,一个返回正确解的概率在<span class="math">\(\frac{1}{2}\)</span>左右的算法没有实用价值。</p>
<p>但是,如果我们把这个算法独立的运行k次呢?只有当<span class="math">\(k\)</span>次运行的结果都是<code>Yes</code>时,才最终返回<code>Yes</code>;否则返回<code>No</code></p>
<p>那么该算法返回错误解的可能性<strong>最多</strong>为<span class="math">\(\frac{1}{2^k}\)</span>,也即返回正确解的可能性<strong>至少</strong>为<span class="math">\(1-\frac{1}{2^k}\)</span></p>
<hr/>
<p>当<span class="math">\(k\)</span>取值比较大的时候,这是一个可以接受的结果,这也就说明了该算法可行性。</p>
<p>并且,在整个计算的过程中,全是<span class="math">\(n\times 1\)</span>的矩阵乘向量的运算,计算代价要小很多。这个例子足以证明随机算法的神奇之处,只以一点点的不确定性,换来了很高的计算效率。</p>
<h2>多项式判定问题(Polynomial Identity Testing,PIT)</h2>
<p>现在再来看一个<strong>随机算法</strong>的例子,这个例子被称为是<strong>多项式判定问题(Polynomial Identity Testing,PIT)</strong>,不过为了简单起见,我们这里暂时只考虑其单元的情况,多元的情况放在以后考虑。</p>
<p>首先这个问题可以表述成:</p>
<hr/>
<ul>
<li>
<p><strong>input</strong>: 定义在数域<span class="math">\(F\)</span>上的度为<span class="math">\(d\)</span>的两个单元多项式<span class="math">\(P_1,P_2\)</span>.</p>
</li>
<li>
<p><strong>output</strong>: 如果<span class="math">\(P_1\equiv P_2\)</span>,则返回<code>Yes</code>,否则返回<code>No</code></p>
</li>
</ul>
<hr/>
<p>解决这个问题的常规方法就是直接去查看<span class="math">\(P_1,P_2\)</span>中的每一项的系数,看它们是否相等,只有当所有项的系数均相等时,<span class="math">\(P_1\equiv P_2\)</span>。但是,如果<span class="math">\(P_1,P_2\)</span>的度非常大,且给定的<span class="math">\(P_1\)</span>并不是标准形式的,比如:</p>
<div class="math">$$
\begin{equation}
P_1 = (x+1)(x-2)(x+3)(x-4)(x+5)\mathop{\equiv}^{?} x^6-7^3+25 = P_2
\end{equation}
$$</div>
<p>要将上面的多项式展开成标准形式,这本身也是一个非常困难的任务。</p>
<p>面对这样的问题,现在就该轮到<strong>随机算法</strong>上场了。</p>
<p>首先,可以令<span class="math">\(Q = P_1 - P_2\)</span>,则原问题可以转化为判断<span class="math">\(Q\equiv 0\)</span>是否成立。</p>
<p>我们可以用如下的随机算法来进行判断</p>
<hr/>
<p>Algorithm for PIT</p>
<ol>
<li>从<span class="math">\(F\)</span>上随机的取出若干个值,形成集合<span class="math">\(S\)</span></li>
<li>从<span class="math">\(S\)</span>中随机取出一个<span class="math">\(x\)</span>,如果<span class="math">\(D(x)=0\)</span>,则返回<code>Yes</code>,否则返回<code>No</code></li>
</ol>
<hr/>
<p>同样的,这个算法也是不能保证得到正确解的,我们同样需要对它进行分析。</p>
<p><strong>情况1</strong>: 如果原来的<span class="math">\(P_1\equiv P_2\)</span>,则我们不管将<span class="math">\(x\)</span>取何值,<span class="math">\(D\)</span>总是等于0的,则该算法能够返回正确的解。</p>
<p><strong>情况2</strong>: 如果原来的<span class="math">\(P_1\not\equiv P_2\)</span>,则假如我们选取的<span class="math">\(x\)</span>恰好是多项式<span class="math">\(D\)</span>的其中一个根,那么该算法将会返回出错误解;否则可以返回出正确的解。</p>
<p>可以看到,这其实是和上一个例子中的算法是非常相似的,同样需要对算法进行分析,以确定其返回错误解的概率是多少,是否在一个可以"容忍"的范围内。</p>
<p>在这里,我们使用到了<a href="http://zh.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86" title="wiki:代数基本定理">代数基本定理</a>,根据<strong>代数基本定理</strong>,<em>任何一个非零的一元n次复系数多项式,都正好有n个复数根</em>,那也就是说在<span class="math">\(S\)</span>中,<strong>最多</strong>只有<span class="math">\(d\)</span>个<span class="math">\(D\)</span>的根,那就是说我们从<span class="math">\(S\)</span>中随机取出一个<span class="math">\(x\)</span>恰好是<span class="math">\(D\)</span>的根的概率是</p>
<div class="math">$$
\begin{equation}
Pr \leq \frac{d}{\vert S\vert}
\end{equation}
$$</div>
<p>这也就是说,该算法执行一次返回出错误解的概率<strong>最多</strong>是<span class="math">\(\frac{d}{\vert S\vert}\)</span>,那我们将其执行<span class="math">\(k\)</span>次:只有当每一次都返回出<code>Yes</code>时,算法才最终返回<code>Yes</code>,否则只要出现一次<code>No</code>,算法就直接返回<code>No</code>.</p>
<p>此时算法发生错误的概率<strong>最多</strong>是<span class="math">\((\frac{d}{\vert S \vert})^k\)</span>,当<span class="math">\(\vert S\ vert\)</span>和<span class="math">\(k\)</span>很大时,这是一个非常小的概率,在可以接受的范围内。</p>
<h1>两种计算模型</h1>
<p>如果仔细观察上面的这两个例子,我们其实可以发现,这两个算法是非常相似的,具有如下的特点:</p>
<ol>
<li>总是能在执行完确定的步骤之后(<span class="math">\(k\)</span>)之后,返回出结果,但是返回的结果的正确性却是不确定的<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>。</li>
<li>都是在一种情况下算法能够<span class="math">\(100\%\)</span>的返回出正确的解,而在另外一种情况下,<strong>至少</strong>以<span class="math">\(\epsilon\)</span>的概率返回出正确的解(在我们的两个例子中,<span class="math">\(\epsilon\)</span>恰好都是<span class="math">\(\frac{1}{2}\)</span>)。</li>
</ol>
<p>事实上,以上的特点可以用来区分不同的<strong>随机算法</strong>,<strong>随机算法</strong>一共分为两种不同的类型,分别称为<strong>蒙特卡洛算法(Monte Carlo algorithm)</strong>和<strong>拉斯维加斯算法(Las Vegas algorithm)</strong></p>
<h2>蒙特卡洛算法</h2>
<p><a href="http://en.wikipedia.org/wiki/Monte_Carlo_algorithm" title="wiki: Monte Carlo algorithm">蒙特卡洛算法</a>是指能够在有限步内得出结果,但是却有可能以非常小的概率得出错误的结果的一类算法。根据上面我们为上面两个例子总结的特点1,这两类应该是属于<strong>蒙特卡洛算法</strong></p>
<p>而将蒙特卡洛算法应用在<strong>判定问题</strong>上时,它又可以分成两种不同的类别,分别是<strong>单边错误(one-sided errors)</strong>和<strong>双边错误(two-sided erros)</strong><sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup></p>
<h3>单边错误</h3>
<p><strong>单边错误</strong>是指,算法只在一个方向上可能出错,这又可以分为两种情况:</p>
<ul>
<li>
<p><strong>False postive</strong>: 如果真实答案是<code>Yes</code>,则算法以概率1返回<code>Yes</code>;如果真实答案是<code>No</code>,则算法<strong>至少</strong>以<span class="math">\(\epsilon\)</span>的概率返回<code>No</code>.</p>
</li>
<li>
<p><strong>False negative</strong>: 如果真实答案是<code>Yes</code>,则算法<strong>至少</strong>以<span class="math">\(\epsilon\)</span>的概率返回<code>Yes</code>;如果真实答案是<code>No</code>,则算法以概率1返回<code>No</code>.</p>
</li>
</ul>
<p>对于<strong>单边错误</strong>来说,算法给出错误答案的概率是<span class="math">\(1-\epsilon\)</span>,而这可以通过重复执行算法来使得错误率进一步降低为<span class="math">\((1-\epsilon)^k\)</span></p>
<h3>双边错误</h3>
<p><strong>双边错误</strong>是指,算法在两个方向都有可能出错。</p>
<p>也就说,当真实答案是<code>Yes</code>的时候,算法至少以<span class="math">\(\frac{1}{2} + \epsilon\)</span>的概率返回<code>Yes</code>;当真实答案是<code>No</code>的时候,算法至少以<span class="math">\(\frac{1}{2} + \epsilon\)</span>的概率返回<code>No</code></p>
<p>同样的,在这种情况,可以通过重复执行算法来使得错误率进一步下降。</p>
<h2>拉斯维加斯算法</h2>
<p><a href="http://en.wikipedia.org/wiki/Las_Vegas_algorithm" title="wiki: Las Vegas algorithm">拉斯维加斯算法</a>是指总是能够得到正确的解,但是算法执行时间却是不确定的一类算法。</p>
<h1>总结</h1>
<p>可以看到,前面举的两个例子都是非常简单的,但是证明其正确性的过程却并不简单,<strong>随机算法</strong>中的很大一部分内容就是在论证算法的正确性,<strong>分析</strong>是非常重要的一步。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Probability_space">wiki:Probability Space</a>·</li>
<li><a href="http://zh.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86" title="wiki:代数基本定理">wiki:代数基本定理</a></li>
<li><a href="http://en.wikipedia.org/wiki/Monte_Carlo_algorithm" title="wiki: Monte Carlo algorithm">wiki:Monte Calo algorithm</a></li>
<li><a href="http://en.wikipedia.org/wiki/Las_Vegas_algorithm" title="wiki: Las Vegas algorithm">wiki:Las Vegas algorithm</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>这里的等概率是指,每次等概率地从<span class="math">\(\{0,1\}\)</span>中取出一个元素(<span class="math">\(0\)</span>或<span class="math">\(1\)</span>),然后重复<span class="math">\(n\)</span>次,形成一个<span class="math">\(n\times 1\)</span>的<span class="math">\(n\)</span>维向量<span class="math">\(v\)</span>。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>在上面的例子中,我们有<span class="math">\(1-\frac{1}{2^k}\)</span>的概率能够得出正确的解,虽然这是一个很接近于1的概率,但是毕竟不能说成<span class="math">\(100\%\)</span> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>这里的单边和双边是我自己翻译的,我没有找到比较正统的翻译,于是只能自己来了。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>判别模型、生成模型和高斯判别模型2014-02-17T00:00:00-07:002014-02-17T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-02-17:/machine-learning/Discriminative-Generative-GDA/<p>本文主要说明了判别式模型和生成式模型的差别,然后介绍了一种生成式模型,高斯判别分析(Gaussian Discriminant Analysis)</p><h1>判别式模型和生成式模型</h1>
<p>对不同的监督学习的模型来说,它们的最终目标总是在给定测试样例<span class="math">\(x\)</span>的情况下,预测出其最有可能的类别<span class="math">\(y\)</span>,也就是说优化目标总是<span class="math">\(\arg\max\limits_{y}p(y\vert x)\)</span>。但是,求解这个<span class="math">\(\arg\max\limits_{y}p(y\vert x)\)</span>的过程却有着各种各样不同的方法,但是总体来来说,根据求解方法的不同,可以将这些模型分成两种类别。</p>
<h2>判别式模型</h2>
<p>其中一种是直接学习得到<span class="math">\(p(y\vert x)\)</span>,更加准确来说,是直接学习得到<span class="math">\(p(y\vert x;\theta)\)</span>,其中<span class="math">\(\theta\)</span>是模型的参数,这种方法被称为是<strong>判别式模型(Discriminant Model)</strong>。属于这种方法的模型有之前的讲过的:</p>
<ul>
<li><a href="http://zhouyichu.com/machine-learning/Gradient-Descent/">线性回归模型</a>,其模型参数就是<span class="math">\(\theta^T X\)</span>中的<span class="math">\(\theta\)</span></li>
<li><a href="http://zhouyichu.com/machine-learning/Logistic-Regression/">Logistic模型</a></li>
<li><a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/">决策树模型</a>,其模型参数是每个节点的分裂属性及其阈值。</li>
</ul>
<p>对于判别式模型来说,就是要从训练数据中学习得到<span class="math">\(p(y\vert x;\theta)\)</span>中的<span class="math">\(\theta\)</span>,从而在预测时候,能够直接根据<span class="math">\(x\)</span>计算出<span class="math">\(y\)</span>。</p>
<h2>生成式模型</h2>
<p>与其相对应的另外一种方法是,利用贝叶斯法则:</p>
<div class="math">$$
\begin{equation}
p(y\vert x) = \frac{p(x\vert y)p(y)}{p(x)}
\end{equation}
$$</div>
<p>将<span class="math">\(\arg\max\limits_{y}p(y\vert x)\)</span>进行如下的代换:</p>
<div class="math">$$
\begin{aligned}
\arg\max\limits_{y}p(y\vert x) &= \arg\max\limits_y\frac{p(x\vert y)p(y)}{p(x)} \\
&= \arg\max\limits_y p(x\vert y)p(y)
\end{aligned}
$$</div>
<p>注意,上述第二个等式之所以成立,是因为在给定测试数据<span class="math">\(x\)</span>的情况下,<span class="math">\(p(x)\)</span>是一个常量,可以不用考虑。因此,模型的求解目标就变成了<span class="math">\(p(x\vert y)\)</span>和<span class="math">\(p(y)\)</span>而不是原来的<span class="math">\(p(y\vert x)\)</span>,这样的方法被称为<strong>生成式模型(Generative Model)</strong>。属于这种模型的有之前讲过的:</p>
<ul>
<li><a href="http://zhouyichu.com/machine-learning/Navie-Bayes/">朴素贝叶斯模型</a>。在贝叶斯模型中,就是利用贝叶斯法则,直接计算<span class="math">\(p(x\vert y)\)</span>和<span class="math">\(p(y)\)</span>.</li>
</ul>
<p>本文的后半部分还会介绍另外一种生成式模型:<strong>高斯判别分析模型</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<h2>举例</h2>
<p>其实,可以看到,这两种分类仅仅是计算的"路径"不同而已,"终点"却是相同的,都是要计算<span class="math">\(\arg\max\limits_{y}p(y\vert x)\)</span>。</p>
<p>举例<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>来说,假设我们要判别一个动物是大象(<span class="math">\(y=1\)</span>)还是狗(<span class="math">\(y=0\)</span>),对于<strong>判别式模型</strong>来说,它会考虑这个动物所有的特征,从中学习特征之间模式(<span class="math">\(p(y\vert x;\theta)\)</span>),从而判定它是大象(<span class="math">\(y=1\)</span>)还是狗(<span class="math">\(y=0\)</span>)。</p>
<p>而对于<strong>生成式模型</strong>来说,它会考察训练数据中所有的大象,学习得到一个模型(<span class="math">\(p(x\vert y=1)\)</span>和<span class="math">\(p(y=1)\)</span>),然后接着考察训练数据中所有的狗,学习得到一个模型(<span class="math">\(p(x\vert y=1)\)</span>和<span class="math">\(p(y=1)\)</span>)。在需要预测时,将待预测的动物分别用这两种模型进行判断,然后选择可能性大的最为最终的预测类别。</p>
<h1>高斯判别分析</h1>
<h2>多变量正态分布</h2>
<p><strong>高斯判别分析模型</strong>是假设<span class="math">\(p(x\vert y)\)</span>服从多变量高斯分布的,因此我们首先需要看一下多变量的高斯分布。</p>
<p>多变量高斯分布<span class="math">\(\cal{N}(\mu,\Sigma)\)</span>的密度函数是:</p>
<div class="math">$$
\begin{equation}
p(x;\mu,\Sigma) = \frac{1}{(2\pi)^{\frac{n}{2}}\big\vert\Sigma\big\vert^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)}
\end{equation}
$$</div>
<p>如果<span class="math">\(X\sim \cal{N}(\mu,\Sigma)\)</span>,则:</p>
<div class="math">$$
\begin{aligned}
E[X] &= \mu \\
Cov(X) &= \Sigma
\end{aligned}
$$</div>
<h2>高斯判别分析模型</h2>
<p><strong>高斯判别分析模型</strong>假设<span class="math">\(p(x\vert y)\)</span>服从多变量高斯分布,而<span class="math">\(y\)</span>本身是服从贝努力分布的,所以我们有:</p>
<div class="math">$$
\begin{aligned}
y &\sim Bernoulli(\phi) \\
x\big\vert y &\sim \cal{N}(\mu_0,\Sigma) \\
x\big\vert y &\sim \cal{N}(\mu_1,\Sigma)
\end{aligned}
$$</div>
<p>将其展开就是:</p>
<div class="math">$$
\begin{aligned}
p(y) &= \phi^y(1-\phi)^{1-y} \\
p(x\vert y = 0) &= \frac{1}{(2\pi)^{\frac{n}{2}}\big\vert\Sigma\big\vert^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu_0)^T\Sigma^{-1}(x-\mu_0)} \\
p(x\vert y = 1) &= \frac{1}{(2\pi)^{\frac{n}{2}}\big\vert\Sigma\big\vert^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu_1)^T\Sigma^{-1}(x-\mu_1)}
\end{aligned}
$$</div>
<p>其中,模型的参数是<span class="math">\(\phi,\Sigma,\mu\_0,\mu\_1\)</span>,对应的对数似然函数可以写成:</p>
<div class="math">$$
\begin{aligned}
\ell(\phi,\mu_0,\mu_1,\Sigma) &= \log\prod\limits_{i=1}^mp(x^{(i)},y^{(i)};\phi,\mu_0,\mu_1,\Sigma) \\
&= \log\prod\limits_{i=1}^mp(x^{(i)}\vert y^{(i)};\phi,\mu_0,\mu_1,\Sigma)p(y^{(i)};\phi)
\end{aligned}
$$</div>
<p>通过极大化这个似然函数<span class="math">\(\ell\)</span>,我们能够求得这个极大似然估计的参数是:</p>
<div class="math">$$
\begin{aligned}
\phi &= \frac{1}{m}1\{y^{(i)}=1\} \\
\mu_0 &= \frac{\sum\limits_{i=1}^m1\{y^{(i)}=0\}x^{(i)}}{\sum\limits_{i=1}^m1\{y^{(i)}=0\}} \\
\mu_1 &= \frac{\sum\limits_{i=1}^m1\{y^{(i)}=1\}x^{(i)}}{\sum\limits_{i=1}^m1\{y^{(i)}=1\}} \\
\Sigma &= \frac{1}{m}\sum\limits_{i-1}^m(x^{(i)} - \mu_{y^{(i)}})(x^{(i)} - \mu_{y^{(i)}})^T
\end{aligned}
$$</div>
<p>上面的公式中,其实<span class="math">\(\mu\_0\)</span>和<span class="math">\(\mu\_1\)</span>分别是反例的平均值和正例的平均值。</p>
<p>在计算出上述的这些参数之后,我们就能够求解<span class="math">\(\arg\max\limits_{y}p(y\vert x)\)</span>了,只需要分别计算<span class="math">\(p(x\vert y=1)p(y=1)\)</span>和<span class="math">\(p(x\vert y=0)p(y=0)\)</span>,取二者中较大的类别作为预测类别。</p>
<h1>参考资料</h1>
<ul>
<li>斯坦福公开课《机器学习》第五集及其配套讲义。</li>
<li><a href="http://blog.csdn.net/stdcoutzyx/article/details/9285001">生成学习、高斯判别、朴素贝叶斯、Laplace平滑——斯坦福ML公开课笔记5</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_b09d46020101dfq0.html">判别模型和生成模型 -- ML Step By Step(4)</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>虽然它名字中有"判别"二字,但它却是地地道道的生成式模型。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这个例子来自于斯坦福公开课《机器学习》第五集 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>另一个角度解释特征值与特征向量2014-02-10T00:00:00-07:002014-02-10T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-02-10:/matrix-theory/Matrix-Eigenvalues/<p>矩阵特征值与特征向量的另外一种解释。</p><p>最早接触特征值和特征向量的概念是在《线性代数》中,当时的定义简直就是<strong>简单粗暴</strong>,上来直接告诉你,满足如下公式的<span class="math">\(\lambda\)</span>和<span class="math">\(v\)</span>分别称为特征值和特征向量,然后告诉你一大堆特征值和特征向量的性质。</p>
<div class="math">$$
\begin{equation}
T(v) = \lambda v
\end{equation}
$$</div>
<p>可是,这是为什么?为什么会出现这个定义?虽然大家都知道特征值和特征向量的概念在整个线性代数中是非常重要的,但是一般的教科书上基本都不给出相应的解释,上来就告诉你定义。(这貌似是所有国内教科书的通病)</p>
<p>这个问题困扰了我很长一段时间,直到后来上矩阵论课的时候,看了一本老外写的《Linear Algebra Done Right》,顿时觉得豁然开朗,所以觉得有必要好好记录一下。</p>
<p>《Linear Algebra Done Right》中是通过一维不变子空间而引出特征值和特征向量的概念的,所以我们要先从不变子空间开始。</p>
<p>假设<span class="math">\(V\)</span>是一个线性空间,而<span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个子空间,且<span class="math">\(T\)</span>是作用在<span class="math">\(V\)</span>上的一个线性算子(operator),如果对于所有的<span class="math">\(\forall u\in U\)</span>都满足<span class="math">\(Tu\in U\)</span>,则我们称<span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个不变子空间。</p>
<p>而特征值和特征向量的定义就从<span class="math">\(V\)</span>的一维不变子空间开始的。</p>
<p>假设<span class="math">\(U\)</span>是<span class="math">\(V\)</span>的一个一维子空间,且存在一个非零向量<span class="math">\(u\in U\)</span>,那么<span class="math">\(U\)</span>就可以写成:</p>
<div class="math">$$
\begin{equation}
U = \{au:a\in F \}
\end{equation}
$$</div>
<p>任意一个一维子空间都可以写成如上的形式。</p>
<p>假设<span class="math">\(U\)</span>是<span class="math">\(V\)</span>上关于<span class="math">\(T\)</span>的一个一维不变子空间,那么根据上述一维子空间的定义,我们能够得到<span class="math">\(Tu \in U\)</span>,根据<span class="math">\(U\)</span>的表示方式,则必存在一个<span class="math">\(\lambda \in F\)</span>满足:</p>
<div class="math">$$
\begin{equation}
Tu = \lambda u , u \neq 0
\end{equation}
$$</div>
<p>而上面这个公式正好就是特征值和特征向量的定义!</p>
<p>这样从线性空间的不变子空间出发,我们自然而然的就得出了特征向量和特征值的概念。</p>
<p>上面的推导说明,<span class="math">\(T\)</span>有一维不变子空间的充分必要条件是:<strong><span class="math">\(T\)</span>有一个特征值</strong>。</p>
<p>从这个角度看,其实特征向量就是<span class="math">\(V\)</span>的一维不变子空间<span class="math">\(U\)</span>中的一个向量,这也就说明了为什么一个特征值对应的特征向量往往有无穷个,且都是线性相关的。</p>
<p>换一个角度来看问题,往往能得到意想不到的新收获。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F">wiki:特征向量</a></li>
<li>《Linear Algebra Done Right》第五章</li>
</ul>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>广义线性模型2014-02-06T00:00:00-07:002014-02-06T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-02-06:/machine-learning/Generalized-Linear-Models/<p>广义线性模型思考与讨论</p><p>之前的几篇文章中,分别介绍了<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归">线性回归</a>和<a href="http://zhouyichu.com/machine-learning/Logistic-Regression/" title="Logistic-Regression">Logistic-Regression</a>,分别用来解决回归问题和分类问题。其实,这两种模型是属于一种更加广义的模型:<strong>广义线性模型(Generalized Linear Models)</strong>,本文将会说明其实上述两种模型都是<strong>广义线性模型</strong>的特殊形式。</p>
<h1>指数分布族</h1>
<p>在说明什么是<strong>广义线性模型</strong>之前,首先需要定义什么是<strong>指数分布族</strong>,我们将具有如下形式的分布称为是<strong>指数分布族</strong>:</p>
<div class="math">$$
\begin{equation}
p(y;\eta) = b(y)e^{\eta^T T(y)-a(\eta)}
\end{equation}
$$</div>
<p>其中,<span class="math">\(\eta\)</span>称为该分布的<strong>自然参数(natural parameter)</strong>,<span class="math">\(T(y)\)</span>称为<strong>充分统计量</strong>,<span class="math">\(a(\eta)\)</span>称为<strong>对数区分函数(log partition function)</strong>。当给定<span class="math">\(a,b,T\)</span>这三个函数时,上述公式就定义了一个概率分布的集合,它以<span class="math">\(\eta\)</span>为参数,当<span class="math">\(\eta\)</span>改变时,我们就得到不同的分布。</p>
<h2>贝努力模型(Bernoulli)</h2>
<p>贝努力模型就是指数分布族中的一种分布情况,我们将贝努力分布进行如下的推导:</p>
<div class="math">$$
\begin{aligned}
p(y;\phi) &= \phi^y(1-\phi)^{1-y} \\
&= e^{\log(\phi^y(1-\phi)^{1-y})}\\
&= e^{y\log\phi + (1-y)\log(1-\phi)} \\
&= e^{\log(\frac{\phi}{1-\phi})\dot y + \log(1-\phi)}
\end{aligned}
$$</div>
<p>对照上面指数分布族的定义,我们可以得到:</p>
<div class="math">$$
\begin{aligned}
\eta &= \log\frac{\phi}{1-\phi}\\
T(y) &= y\\
a(\eta) &= -\log(1-\phi) = log(1+e^{\phi}) \\
b(y) &= 1
\end{aligned}
$$</div>
<p>可以看到,贝努力分布确实可以改写成指数分布族的形式,这一点在广义线性模型的推导中很重要。</p>
<h2>高斯分布</h2>
<p>高斯分布同样是指数分布族中的一员,具体的推导过程如下所示<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>:</p>
<div class="math">$$
\begin{aligned}
p(y;\mu) &= \frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}(y-\mu)^2} \\
&= \frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}y^2}\cdot e^{\mu y - \frac{1}{2}\mu^2}
\end{aligned}
$$</div>
<p>我们得到:</p>
<div class="math">$$
\begin{aligned}
\eta &= \mu \\
T(y) &= y\\
a(\eta) &= \frac{\mu^2}{2} = \frac{\eta^2}{2} \\
b(y) &= \frac{1}{\sqrt{2\pi}}e^{\frac{-y^2}{2}}
\end{aligned}
$$</div>
<p>说明高斯分布也是指数分布族中的一种。事实上,还有许多分布都是指数分布族中的成员,比如:</p>
<ol>
<li>多项式分布(Multinomial): 对有<span class="math">\(K\)</span>个离散结果的事件建模,多类分类。</li>
<li>泊松分布(Poisson): 对计数过程进行建模。</li>
<li>伽马分布(Gamma)和指数分布(exponential): 对有间隔的正数进行建模。</li>
<li><span class="math">\(\beta\)</span>分布: 对小数建模。</li>
<li>Dirichler分布: 对概率分布进行建模。</li>
<li>Wishart分布: 协方差矩阵的分布。</li>
</ol>
<h1>广义线性模型</h1>
<p>当我们遇到一个分类问题或回归问题的时候,首先需要估计分析的问题是满足什么样的分布的,比如线性回归中的我们假设其满足正态分布;在为银行顾客排队建模时,我们假设其满足Poisson分布;在Logistic回归中假设满足贝努力分布(二元分类),那么当我们确定问题的分布时,如何才能正确建模呢?这就要引出<strong>广义线性模型(GLM)</strong>了。</p>
<p>在GLM中,给定x对y进行预测时,我们有三个假设,分别是:</p>
<ol>
<li><span class="math">\(p(y\vert x;\theta)\)</span>满足指数分布族,也就是说,给定<span class="math">\(x\)</span>和<span class="math">\(\theta\)</span>,y的分布情况满足以<span class="math">\(\eta\)</span>为参数的指数分布族的分布。</li>
<li>给定<span class="math">\(x\)</span>,我们的目标是预测<span class="math">\(T(y)\)</span>的期望值,也即<span class="math">\(h_\theta(x)=E[T(y)\vert x]\)</span></li>
<li>自然参数<span class="math">\(\eta\)</span>和输入<span class="math">\(x\)</span>是线性关系:<span class="math">\(\eta=\theta^T x\)</span></li>
</ol>
<p>通过GLM我们能够很快就能推导出不同分布下的优化目标,以线性回归模型和Logidtic回归模型为例:</p>
<h2>线性回归模型</h2>
<p>我们假设线性回归模型是满足高斯分布的,因此根据上面我们对高斯分布的推导,我们可以得到:</p>
<div class="math">$$
\begin{aligned}
h_\theta(x) &= E[y\vert x;\theta]\\
&= \mu \\
&= \eta\\
& = \theta^T x
\end{aligned}
$$</div>
<p>上述公式中的第二个等号是因为GLM的第二个假设,并且高斯分布的期望正是<span class="math">\(\mu\)</span>,第三个等号是因为经过之前高斯分布的推导,对于高斯分布来说,<span class="math">\(\eta=\mu\)</span>,最后一个等号是因为GLM的第三个假设。</p>
<p>可以看到,我们通过高斯分布直接得到了我们的目标函数,这也就能够解释为什么在<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/">线性回归</a> 中要假设成<span class="math">\(h_\theta(x)=\theta_0+\theta_1x\_1+\cdots+\theta_n x_n\)</span>了。</p>
<h2>Logistic回归</h2>
<p>同样的,在<a href="http://zhouyichu.com/machine-learning/Logistic-Regression/">Logistic回归</a>中,奇怪的<span class="math">\(g(z)\)</span>是怎么来的,也能够用GLM来解释:</p>
<div class="math">$$
\begin{aligned}
h_\theta(x) &= E[y\vert x;\theta] \\
&= \phi \\
&= \frac{1}{1+e^{-\eta}} \\
&= \frac{1}{1+e^{-\theta^t x}}
\end{aligned}
$$</div>
<p>从上述的推导中,我们就可以看出,一旦我们确定待分析的问题是满足贝努力分布的,我们就能够自然而然地得出<span class="math">\(h\_\theta(x)= \frac{1}{1+e^{-\theta^t x}}\)</span>的结论了。</p>
<h1>总结</h1>
<p>可以看到,利用GLM,我们能够很快确定我们的目标函数是什么,当我们选取高斯分布的时候,我们就能够得到线性回归模型;当我们选取贝努力分布时,我们就得到Logistic模型。所以,可以把广义线性模型看成是一个关于分布的分布,不同的参数得到不同的分布模型,从而得到不同的目标函数。</p>
<p>最后在斯坦福的公开课《机器学习》中还有一个比较复杂GLM的例子,是对多项式分布进行建模,由于公式推导比较多,这里就不再给出了,感兴趣的朋友可以去找相应的讲义来看看。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://blog.sciencenet.cn/blog-520608-709883.html">广义线性模型</a></li>
<li>斯坦福公开课《机器学习》第四集及其配套讲义</li>
<li><a href="http://blog.csdn.net/stdcoutzyx/article/details/9207047">牛顿方法、指数分布族、广义线性模型、多项式分布——斯坦福ML公开课笔记4</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>此处为了简化我们的推导过程,我们假设高斯分布中的<span class="math">\(\sigma^2=1\)</span>。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>隐马尔科夫模型的来龙去脉2014-01-24T00:00:00-07:002014-01-24T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-01-24:/nlp/Hidden-Markov-Model/<p>自然语言处理中应用广泛的隐马尔科夫模型的详细介绍.</p><p>作为应用广泛的一种统计模型(尤其是在<strong>自然语言处理(NLP)</strong> 中),隐马尔科夫模型是非常值得一说的,本文就隐马尔科夫模型的原理和应用介绍进行说明。由于隐马尔科夫模型有着很多不同的具体算法实现,本文暂时跳过这部分内容,算法部分会另外写成一篇博文。</p>
<h1>马尔科夫链</h1>
<p>在<a href="http://zhouyichu.com/nlp/Language-Model/" title="语言模型及其实现">语言模型及其实现</a>中,我曾经简单地提到过<strong>马尔科夫链</strong>,这里将会全面详细的说明。</p>
<p>其实马尔科夫链是一种离散的随即过程,可以将其看成是一种<a href="http://zh.wikipedia.org/wiki/%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E9%93%BE">有限自动机</a>,但是其状态之间的转移并不是依赖于外界的输入,而是依赖于每个状态之间的转移概率。</p>
<p>如下图所示:</p>
<p><img alt="有限自动机" src="http://zhouyichu.com/images/DFA.png"/></p>
<p>上图中每条边上的权重表示状态转移的概率,对于<span class="math">\(S_1\)</span>来说,用数学语言表达就是:<span class="math">\(P(S_2\vert S_1)=0.5,P(S_4\vert S_1)=0.5\)</span></p>
<p>现在用更加严谨的数学表达来说明:</p>
<p>假设当前系统中一共有<span class="math">\(N\)</span>个状态,而在每个时刻只可能处于一个状态,所有可能的状态集合用<span class="math">\(S=\{S_1,S_2,\cdots,S_N\}\)</span>表示,用<span class="math">\(q_1,q_2,\cdots,q_n\)</span>表示在时刻<span class="math">\(t=1,2,\cdots,n\)</span>时的状态。</p>
<p>马尔科夫链有两个假设条件,分别是:</p>
<ol>
<li>
<p><strong>有限视野</strong>:<strong>当前时刻的状态只与上一个时刻的状态有关。</strong> 用公式表示就是:<span class="math">\(P(q_t\vert q_{t-1}=S_i,q_{t-2}=S_k\cdots)=P(q_t\vert q_{t-1}=S_i)\)</span></p>
</li>
<li>
<p><strong>时间独立性</strong>:<strong>状态转移概率与时间无关。</strong> 用公式表示就是:<span class="math">\(P(q_t=S_j\vert q_{t-1}=S\_i)=P(q_k=S_j\vert q_{k-1}=s_i)\)</span></p>
</li>
</ol>
<h1>隐马尔科夫模型</h1>
<p>而隐马尔科夫模型则是马尔科夫过程的一种扩展,或者说是一种双重的随机过程。隐马尔科夫模型是指,在马尔科夫链中的那些状态<span class="math">\(S=\{S_1,S_2,\cdots,S_N\}\)</span>其实是不可见的,而可见的只是输出的状态<span class="math">\(W=\{W_1,W_2,\cdots,W_T\}\)</span>,而从不可见状态到可见状态的转移也存在着一个概率,那些不可见的状态就被称为是<strong>隐藏状态</strong>,隐马尔科夫模型中的"隐"就是这么来的。</p>
<p>还是先用图来说明吧:</p>
<p><img alt="隐马尔科夫模型" src="http://zhouyichu.com/images/HMM.png"/></p>
<p>上图中的<span class="math">\(w_1,w_2,\cdots,w_n\)</span>就是被观察到的状态(可见状态),<span class="math">\(s_0,s_1,s_2,\cdots,s_n\)</span>就是隐藏状态(不可见状态).</p>
<p>相对于之前的<strong>马尔科夫链</strong>,<strong>隐马尔科夫模型</strong>有以下的不同之处:</p>
<ol>
<li>观察状态与隐藏状态之间存在概率关系</li>
<li>多一个假设条件,<strong>输出独立性</strong>:<strong>可见状态仅与当前状态有关</strong>,用公式说明就是:<span class="math">\(P(W_1,W_2,\cdots,W_n\vert S_1.S_2,\cdots,S_n)=\prod\limits_{n}P(W_i\vert S_i)\)</span></li>
</ol>
<p>隐马尔科夫模型可以用一个五元组来表示:<span class="math">\(\lambda=(S,W,A,B,\pi)\)</span>,其中:</p>
<ul>
<li><span class="math">\(S\)</span>表示隐藏状态集合,<span class="math">\(S=(S_1,S_2,\cdots,S_N)\)</span></li>
<li><span class="math">\(W\)</span>表示观察状态集合,<span class="math">\(W=(W_1,W_2,\cdots,W_N)\)</span></li>
<li>状态序列<span class="math">\(Q=q_1,q_2,\cdots,q_T\)</span>(隐藏),观察序列<span class="math">\(O=o_1,o_2,\cdots,o_T\)</span>(可见)</li>
<li><span class="math">\(A\)</span>是状态转移概率分布<span class="math">\(A=[a_{i,j}],a_{i,j}=P(q_t=s_j\vert q_{t-1}=s_i)\)</span></li>
<li><span class="math">\(B\)</span>是观察值生成的概率分布<span class="math">\(B=[b_j(v_k)],b_j(v_k)=P(o_t=v_k\vert q_t=s_i)\)</span></li>
<li><span class="math">\(\pi\)</span>是初始的状态概率分布,<span class="math">\(\pi=[\pi_i],\pi_i=P(q_1=s_i)\)</span></li>
</ul>
<h1>应用</h1>
<p>到目前为止所说的隐马尔科夫模型都是太抽象了,仅仅知道它是什么还不能帮助我们完全理解它作用,下面就通过两个隐马尔科夫模型的应用,来说明这个模型的强大之处。</p>
<h2>词性标注</h2>
<p>在自然语言处理中,词性标注是一个非常基本的任务,简单来说,每一个词,不管是中文还是英语,它在句子中一定会有一个词性标记<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,比如名词、形容词等等。确定一个句子中每一个词的词性,是一个最基本的任务,它为后续的其他处理提供了基础信息。</p>
<p>在词性标注的任务中,我们可以将一个句子看成是可见状态序列,每一个词都是一个可见的状态(<span class="math">\(o_i\)</span>),而每一个词都对应着一个词性,这个词性就是隐藏状态(<span class="math">\(q_i\)</span>),而整个文本中的所有词汇表就是观察状态的集合(<span class="math">\(W\)</span>),预定义的词性标记集就是隐藏状态集合(<span class="math">\(S\)</span>)。而我们的目标是,在给定一个观察序列<span class="math">\(O\)</span>(句子,或者可以看成是词组的序列)的情况下,寻找其对应的隐藏状态序列<span class="math">\(Q\)</span>(每一个词对应的词性标记)。</p>
<h2>拼音输入法</h2>
<p>隐马尔科夫模型另外一个比较重要的应用就是拼音输入法,目前主流的拼音输入法或多或少地运用到了隐马尔科夫模型。</p>
<p>在输入法的应用中,我们可以将用户输入的拼音序列看成是可见的状态序列,而拼音所对应的汉语词语就是不可见的隐藏状态,我们的目标是就是在给定拼音序列的情况下,寻找概率最大的隐藏状态序列。如下图所示:</p>
<p><img alt="词性标注" src="http://zhouyichu.com/images/pos-tagging.png"/></p>
<p>其中,<span class="math">\(y_1,y_2,\cdots,y_N\)</span>表示用户输入的拼音串(可见状态),<span class="math">\(w_{11},w_{12},w_{13}\)</span>表示第一个拼音<span class="math">\(y_1\)</span>的候选汉字,其他的依次类推。</p>
<h1>总结</h1>
<p>在本篇文章中,只是着重介绍了马尔科夫过程和隐马尔科夫模型及其应用,具体的算法实现全部略过了,这是因为其实现算法中也包含了很多的内容,因此我打算将算法部分单独写成一篇博文,本篇文章中就没有涉及算法部分的内容了。</p>
<p>这里可以做一下简单的说明,隐马尔科夫模型的实现过程,主要有两大步骤:</p>
<ol>
<li>
<p>模型参数的学习,也即要学习获得隐马尔科夫模型5个要素中的转移概率矩阵<span class="math">\(A\)</span>和<span class="math">\(B\)</span>.这个过程主要有两种方法,分别是基于监督方法的极大似然估计和基于非监督方法的EM算法。</p>
</li>
<li>
<p>模型解码,也即在给定转移矩阵和可见转台序列的情况下,如何寻找到最有的隐藏状态序列,这个过程可以利用基于动态规划思想的Viterbi算法来解决。</p>
</li>
</ol>
<h1>参考资料</h1>
<ul>
<li><a href="http://zh.wikipedia.org/wiki/%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E9%93%BE">Wiki:马尔科夫链</a></li>
<li><a href="http://blog.csdn.net/stdcoutzyx/article/details/8522078">隐马尔科夫模型(HMM)及其扩展</a></li>
<li>《数学之美》-吴军</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>同一个词在不同的句子中,可能具有不同的词性标记。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>语言模型及其实现2014-01-14T00:00:00-07:002014-01-14T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-01-14:/nlp/Language-Model/<p>自然语言处理中(NLP)中最简洁也最优美的模型——语言模型(Language Model),本文对其进行分析,并给出一个简单的实现方式。</p><h1>缘起</h1>
<p>在现在的<strong>自然语言处理(Natural Language Processing)</strong> 中,一个句子通常是被看成一系列词语的全排列,这些词语能够形成各种不同的组合状态,比如:</p>
<hr/>
<ul>
<li>我 在 北京 天安门</li>
<li>在 我 北京 天安门</li>
<li>北京 我 在 天安门</li>
<li>北京 在 我 天安门</li>
<li>...</li>
</ul>
<hr/>
<p>在这些所有可能的排列的情况中,只有很少一部分(<strong>由于语言的多样性,不一定只有一种可能是合法</strong>)是可以被人理解的,那么该如何衡量一个词语序列是否是可被理解,或者说怎样的词语序列是合法的?自然语言处理大师<strong>贾里尼克(Fred Jelinek)</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>帮我们给出了答案,他用一个非常漂亮的统计数学模型来描述一个自然语言的句子,从而解决了上面的疑问,而这个模型就是本文的主角<strong>语言模型(Language Model)</strong>。</p>
<p><strong>语言模型</strong>在自然语言处理的各项任务中占有极其重要的地位,尤其在基于统计模型的语音识别、机器翻译、句法分析、短语识别、词性标注、手写体识别和拼写纠错等相关研究中得到了广泛应用。</p>
<h1>语言模型</h1>
<h2>概率表示</h2>
<p>其实,<strong>贾里尼克</strong>给出的方法是非常简单的,他给每一个句子赋予一个概率,合法的句子得到概率比较大,而不合法的句子得到的概率比较小,这样只需要从所有可能的情况中选取概率最大的那种组合,我们就能够得到合法的句子了。那么这个概率该如何赋予呢?如何保证合法的就能够得到大概率,不合法的就是小概率呢?这就需要我们从数学角度来看待这个问题了。</p>
<p>假设<span class="math">\(S\)</span>表示一个有意义(合法)的句子,我们可以将其表示成<span class="math">\(S=w_1,w_2,\cdots,w_n\)</span>,其中<span class="math">\(w_i\)</span>表示第<span class="math">\(i\)</span>个词语。用<span class="math">\(P(S)\)</span>来表示这个句子出现的概率,那么根据我们就可以做一下简单的展开:</p>
<div class="math">$$
\begin{equation}
P(S) = P(w_1,w_2,\cdots,w_n)
\end{equation}
$$</div>
<p>利用简单条件概率公式,我们可以进行如下的推导:</p>
<div class="math">$$
\begin{equation}
P(S) = P(w_1,w_2,\cdots,w_n) = P(w_1) \cdot P(w_2\vert w_1) \cdot P(w_3\vert w_1,w_2)\cdots P(w_n\vert w_1,w_2,\dots,w_{n-1})
\end{equation}
$$</div>
<p>其中<span class="math">\(P(w_1)\)</span>表示第一个词语是<span class="math">\(w_1\)</span>的概率,<span class="math">\(P(w_2\vert w_1)\)</span>表示在给定第一个词<span class="math">\(w_1\)</span>的情况下,<span class="math">\(w_2\)</span>出现的概率,后面的以此类推。其实可以看到,第<span class="math">\(i\)</span>个词语出现的概率是由其前面的<span class="math">\(i-1\)</span>个单词所决定的。</p>
<p>从计算角度来说,<span class="math">\(P(w_1)\)</span>和<span class="math">\(P(w_2\vert w_1)\)</span>比较容易计算的,但是<span class="math">\(P(w_3\vert w_1,w_2)\)</span>就会变得比较难计算,因为它已经涉及到了3个变量,再往后的话,需要考虑的变量个数将越来越多,会变得复杂无比,难以计算。</p>
<h2>马尔科夫假设</h2>
<p>为了解决太过复杂而难以计算的问题,我们需要引入<strong>马尔科夫假设</strong>,<strong>马尔科夫假设</strong>中最重要的一点就是<strong>有限视野假设</strong>,也就是说,每一个状态只和它前面的<span class="math">\(n-1\)</span>个状态有关,这被称为n阶<a href="http://zh.wikipedia.org/wiki/马尔科夫链">马尔科夫链</a>。当应用在我们的语言模型中时,就是指每一个词语的概率只由其前面的<span class="math">\(n-1\)</span>个词语所决定,这被称为<span class="math">\(n\)</span>元语言模型。 当<span class="math">\(n=2\)</span>时,相应的语言模型就被称为是<strong>二元模型</strong>,以二元模型为例,我们可以将上面的展开式改写成:</p>
<div class="math">$$
\begin{equation}
P(S) = P(w_1,w_2,\cdots,w_n) = P(w_1) \cdot P(w_2\vert w_1) \cdot P(w_3\vert w_2) \cdots P(w_n\vert w_{n-1})
\end{equation}
$$</div>
<p>经过<strong>马尔科夫假设</strong>的简化,在二元模型中,我们每次只需要考虑两个变量,而在三元模型中,我们每次只需要考虑3个变量,变量越少,计算越是简便,当然这也说明模型简单,不能很好地模拟实际情况。</p>
<p>其实这也是一个需要平衡的过程,n越大越能反映出真实的分布情况,但是相应地也带来很大的计算代价;n越小,虽然计算方便,但是模型就越简单,不能很好的反映出实际的概率分布。</p>
<p>目前来说,最常用是的二元、三元模型,而google的翻译系统使用的是五元模型<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,这在《Beautiful Data》的第十四章中有所论述,有兴趣的朋友可以去看看。</p>
<h1>概率估计</h1>
<p>到目前为止,我们知道了:</p>
<ol>
<li>一个句子可以看成是一系列词语的全排列</li>
<li>每一种排列情况都能够通过条件概率公式计算得到一个表示这个句子合理性的概率</li>
<li>通过引入<strong>马尔科夫假设</strong>,简化了句子概率的计算过程。</li>
</ol>
<p>现在的问题是,如何估计这些词语出现的概率呢?以二元语言模型为例,我们如何获得<span class="math">\(P(w_i\vert w_{i-1})\)</span>呢?从概率统计中我们知道,<span class="math">\(P(w_i\vert w_{i-1}) = \frac{P(w_i,w_{i-1})}{P(w_{i-1})}\)</span></p>
<p>这就为我们计算<span class="math">\(P(w_i\vert w_{i-1})\)</span>提供了一种方法,在拥有大语料的情况下,我们可以直接统计<span class="math">\((w_{i-1},w_i)\)</span>这对词在语料中的出现次数,同时也能统计<span class="math">\(w_{i-1}\)</span>出现的次数,这样当语料库足够大时,根据大数定理,相对频度就能近似概率,也即:</p>
<div class="math">$$
\begin{equation}
P(w_i\vert w_{i-1}) = \frac{P(w_i,w_{i-1})}{P(w_{i-1})} = \frac{\frac{ \# (x_{i-1},x_i)}{ \# }}{\frac{ \# w_{i-1}}{ \# }} = \frac{ \#(x_{i-1},x_i)}{ \# w_{i-1}}
\end{equation}
$$</div>
<p>其中<span class="math">\( \#(x_{i-1},x_i), \#w_{i-1}, \#\)</span>分别表示词对<span class="math">\((w_{i-1},w_i)\)</span>在语料中出现的次数,<span class="math">\(w_{i-1}\)</span>在语料中出现的次数和语料库的大小。</p>
<h1>模型训练&零概率</h1>
<p>语言模型中需要知道的所有的条件概率,我们称之为模型的参数,从语料中获得这些概率的过程就是模型学习的过程。</p>
<p>根据上一节所说的内容,训练的过程其实就是在语料库中统计词频的过程,但是也去会出现这样的情况:<span class="math">\(\#(x_{i-1},x_i)=0\)</span>,即两个词语同现的次数为0,那根据我们的计算就应该是<span class="math">\(P(w_i\vert w_{i-1})=0\)</span>,反过来,如果<span class="math">\(\#(w_{i-1},w_i)\)</span>和<span class="math">\(\#w_{i-1}\)</span>都只出现了一次,那么<span class="math">\(P(w_i\vert w_{i-1})=1\)</span>,这显然是不合理的。</p>
<p>概率值出现为0的这种情况我们称之为<strong>不平滑</strong>,相应的需要进行<strong>平滑操作</strong>.</p>
<p>事实上,自然语言处理方向上的各位前驱学者已经为我们设计了很多的平滑方法,主要包括有:</p>
<ul>
<li><strong>加法平滑</strong></li>
<li><strong>古德-图灵(Good-Turing)估计法</strong></li>
<li><strong>Katz平滑方法</strong></li>
<li><strong>Jelinek-Mercer平滑方法</strong></li>
<li><strong>Witten-Bell平滑方法</strong></li>
<li><strong>绝对减值法</strong></li>
<li><strong>Kneser-Ney平滑方法</strong></li>
</ul>
<p>鉴于上述的这些方法我也不是全部都能理解,这里只能对最简单的<strong>加法平滑</strong>做一下简单的介绍。</p>
<p><strong>加法平滑</strong>的思想其实是非常简单的,它假设每一个词对/词都至少在语料中出现过<span class="math">\(\lambda\)</span>次,这样就能避免出现零概率的情况了。还是用二元语言模型来举例,经过平滑后的计算公式就变为:</p>
<div class="math">$$
\begin{equation}
P(w_i\vert w_{i-1}) = \frac{ \#(w_i,w_{i-1}) + \lambda}{ \#w_{i-1} + \lambda\vert V \vert}
\end{equation}
$$</div>
<p>其中,<span class="math">\(\vert V \vert\)</span>表示词库的大小,之所以要在分母上同时加上一个<span class="math">\(\lambda\vert V\vert\)</span>,是为了保证概率之和为1的条件.</p>
<p>在实际使用中,<span class="math">\(\lambda\)</span>通常取为1.</p>
<h1>具体实现</h1>
<pre><code>#!python
#coding:utf-8
"""
Program: 语言模型的简单实现
Description: 简单实现一个N元的语言模型,其中N是可以进行设置的参数.
Author: Flyaway - flyaway1217@gmail.com
Date: 2014-01-16 19:23:29
Last modified: 2014-01-16 21:54:08
Python release: 3.2.3
"""
import math
class LM:
def __init__(self,train_path,step=2,lam=1):
#punctuations need to be removed
self.punctuation = set([",","、","。","?","“","”","!",";","‘","’","《","》","%"])
self.step = step
self.lam = lam
self.words = []
self.freq = {}
#read the train data and remove the punctuation
with open(train_path) as f:
unique = set()
for line in f:
s = line.strip().split()
#remove the punctuation
s = [item.strip() for item in s if item not in self.punctuation]
#gather the unique word
for r in s:
unique.add(r)
#add the start/end symbol
s.insert(0,'<s>')
s.append('</s>')
self.words.append(s)
self.size = len(unique)
def getNgram(self,sentence):
for e in range(1,len(sentence)-1):
if e > self.step: s = e - self.step + 1
else: s = 0
words = sentence[s:e+1]
words.insert(-1,'|')
words = ','.join(words)
words = words.replace(',|,','|')
yield words
def train(self):
for sentence in self.words:
for words in self.getNgram(sentence):
s = words.split('|')
cond = s[0]
w = s[1]
if cond not in self.freq:
self.freq[cond]={}
self.freq[cond][w] = 1
else:
self.freq[cond][w] = self.freq[cond].get(w,0) + 1
def getProb(self,word,condition):
cond = condition
cond_num = 0
w_num = 0
if cond in self.freq:
for key in self.freq[cond]:
cond_num += self.freq[cond][key]
w_num = self.freq[cond].get(word,0)
#smooth
w_num = w_num + self.lam
cond_num += (self.size * self.lam)
return float(w_num/cond_num)
def sentenceProb(self,sentence):
mysentence = sentence.strip().split()
mysentence.insert(0,'<s>')
mysentence.append('</s>')
result = 0
for words in self.getNgram(mysentence):
s = words.split('|')
cond = s[0]
w = s[1]
result += math.log(self.getProb(w,cond),2)
return result
if __name__ == '__main__':
inpath = './Data/train.in'
print('Reading data...')
lm = LM(inpath,2)
print('Start training...')
lm.train()
s1 = '我 在 北京 天安门'
s2 = '在 我 北京 天安门'
s3 = '北京 我 在 天安门'
s4 = '北京 在 我 天安门'
for s in [s1,s2,s3,s4]:
print(s,end=":")
print(lm.sentenceProb(s))
</code></pre>
<p>上述代码的运行结果如下图所示:</p>
<p>二元模型:
<img alt="二元模型" src="http://zhouyichu.com/images/two-gram.png"/></p>
<p>三元模型:
<img alt="三元模型" src="http://zhouyichu.com/images/three-gram.png"/></p>
<p>从结果中就可以看到,正确的句子得到的值总是最大的,这就说明了<strong>语言模型</strong>的强大威力。</p>
<p>需要注意的是,这里的输出值并不是其相应的概率,从代码中可以看到,我使用了一个<code>math.log</code>对数函数,这是因为如果直接用概率连乘计算的话,概率值会变得非常小,很容易就会造成溢出,因此这里使用了对数函数,将连乘变成了累加,避免了溢出的情况,同时由于对数函数的单调性,所以概率值的相对大小是不会改变的,这也算是一个技巧吧。</p>
<h1>参考资料</h1>
<ul>
<li>《统计自然语言处理》宗成庆</li>
<li><a href="http://www.52nlp.cn">我爱自然语言处理</a></li>
<li>《数学之美》吴军</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>自然语言处理的大师贾里尼克先生已经在2010去世,Google Reseach Blog上有一篇<a href="http://googleresearch.blogspot.com/2010/09/remembering-fred-jelinek.html">文章</a>是专门来缅怀这位逝去的大师。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>是的,google的翻译系统中使用的就是语言模型,当然应该说不止是语言模型,还有一些其他的数学模型,但是语言模型在其中扮演着非常重要的角色。其实很多时候,复杂东西中蕴含的其实非常简单的原理,这就是所谓的<strong>奥卡姆剃刀原理</strong>。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>朴素贝叶斯分类器2014-01-12T00:00:00-07:002014-01-12T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-01-12:/machine-learning/Navie-Bayes/<p>本文分析了朴素贝叶斯分类器的基本原理及其实现方式。</p><h1>朴素贝叶斯</h1>
<p>在经典的分类器模型中,<strong>Naive Bayes Classifier</strong>应该是比较简单的一种了,比之前的<a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/" title="决策树">决策树</a> 要简单得多,但是它虽然简单,但是一点都不简约,在很多情况下它往往能得到比较好的分类效果。</p>
<p>通常的分类问题中,每一个实例都可以用一个特征向量<span class="math">\(x_i\)</span>来表示的,其相应的类别用<span class="math">\(y_i\)</span>来表示,且<span class="math">\(x_i\in X\)</span>,<span class="math">\(y_i\in Y=\{c_1,c_2,\dots,c_k\}\)</span>。其中<span class="math">\(X\)</span>表示样本集合,<span class="math">\(Y\)</span>表示类标记集合。</p>
<p><strong>朴素贝叶斯模型</strong>的基本思想就是,通过直接从样本中学习得到<strong>条件概率分布</strong><span class="math">\(P(Y\vert X)\)</span>,对此,我们可以做如下的推导:</p>
<div class="math">$$
\begin{equation}
P(Y\vert X) = \frac{P(X,Y)}{P(X)} = \frac{P(X\vert Y)\cdot P(Y)}{P(X)}
\end{equation}
$$</div>
<p>当我们需要判断一个未知实例<span class="math">\(x\)</span>的类别时,利用如下的优化公式:</p>
<div class="math">$$
\begin{equation}
\begin{aligned}
y &= \mathop{\arg\max}\limits_{c_k\in Y}\frac{P(X=x\vert Y=c_k)\cdot P(Y = c_k)}{P(X=x)} \\
&= \mathop{\arg\max}\limits_{c_k\in Y}P(X=x\vert Y=c_k)\cdot P(Y = c_k)
\end{aligned}
\end{equation}
$$</div>
<p>上面的第二个等号之所以成立,是因为<span class="math">\(P(X=x)\)</span>对于<span class="math">\(c_k\)</span>来说是一个常数,因此在这里可以直接省略。</p>
<p>在上面的最后一个等式中,<span class="math">\(P(X=x\vert Y=c_k)\)</span>称为<strong>后验概率</strong>,而<span class="math">\(P(Y = c_k)\)</span>称为<strong>先验概率</strong>,贝叶斯模型的学习过程就是从数据集上获得这两个概率分布的过程。</p>
<p>对于<strong>后验概率</strong>来说,我们可以将其展开:</p>
<div class="math">$$
\begin{equation}
P(X=x\vert Y=c_k) = P(x^{1}=f^{1},\dots,x^{n}=f^{n}\vert Y=c_k)
\end{equation}
$$</div>
<p>上式中的<span class="math">\(x^j=f^j\)</span>表示,实例<span class="math">\(x\)</span>的第<span class="math">\(j\)</span>个属性取值为<span class="math">\(f^j\)</span>。</p>
<p>上式中的等号是<strong>严格成立</strong>的,但是不幸的是,如果根据上述的公式直接计算<strong>后验概率</strong>,那么空间复杂度是呈指数增长的,真实计算时是完全不可行的。假设<span class="math">\(x^j\)</span>可能的取值有<span class="math">\(S_j\)</span>个,<span class="math">\(y\)</span>可以取的值有<span class="math">\(K\)</span>个,那么需要估计的参数总数将会是<span class="math">\(K\prod\limits_{j=1}^{n}S_j\)</span>.</p>
<p>为了解决计算复杂度的问题,<strong>朴素贝叶斯模型</strong>对条件概率分布作了<strong>条件独立性的假设</strong>,因为这是一个很强的假设,<strong>朴素贝叶斯</strong>也是因此而得名的。条件独立性假设是指:</p>
<div class="math">$$
\begin{equation}
\begin{aligned}
P(X=x\vert Y=c_k) &= P(x^{1}=f^{1},\dots,x^{n}=f^{n}\vert Y=c_k) \\
&= \prod\limits_{j=1}^{n}P(x^j=f^j\vert Y=c_k)
\end{aligned}
\end{equation}
$$</div>
<p>上述公式中的第二个公式是<strong>朴素贝叶斯</strong>中最重要的核心部分,它是指<strong>每个属性在给定分类结果的条件下是相互独立的</strong></p>
<p>经过<strong>条件独立性的假设</strong>的化简,原来的优化目标就可以写成:</p>
<div class="math">$$
\begin{equation}
y = \mathop{\arg\max}\limits_{c_k\in Y}P(Y=c_k)\prod\limits_jP(x^j=f^j\vert Y=c_k)
\end{equation}
$$</div>
<p>经过这样的化简之后,我们需要学习的参数个数就变成了<span class="math">\(K\sum\limits_{j=1}^nS_j\)</span>,这和原来的<span class="math">\(K\prod\limits_{j=1}^{n}S_j\)</span>相比,已经大大化简了。</p>
<p><strong>朴素贝叶斯法</strong>实际上学习到生成数据的机制,所以属于<strong>生成模型</strong>。<strong>条件独立假设</strong>等于是说用于分类的特征在雷确定的条件下都是条件独立的,这一假设使得<strong>朴素贝叶斯</strong>变得简单,但有时会牺牲一定的分类准确率.</p>
<h1>参数估计</h1>
<p>经过上面的分析,我们现在需要从数据中学习的分布有以下两个:</p>
<ul>
<li><span class="math">\(P(Y=c_k)\)</span> 先验概率分布</li>
<li><span class="math">\(P(X=x\vert Y=y)=\prod\limits_{j=1}^nP(x^j=f^j\vert Y=c_k)\)</span>后验概率分布</li>
</ul>
<h2>极大似然估计</h2>
<p>利用<strong>极大似然估计</strong>是比较容易从数据中学习上述两个概率分布的。</p>
<p>先验概率<span class="math">\(P(y=c_k)\)</span>的极大似然估计是:</p>
<div class="math">$$
\begin{equation}
P(Y=c_k) = \frac{\sum\limits_{i=1}^{N}I(y_i=c_k)}{N},k = 1,2,\dots,K
\end{equation}
$$</div>
<p>其中<span class="math">\(N\)</span>表示训练实例的个数,<span class="math">\(\sum\limits_{i=1}^{N}I(y_i=c\_k)\)</span>表示在训练集中标记为<span class="math">\(c_k\)</span>的实例的个数.</p>
<p>设<span class="math">\(x^j\)</span>可能取值的集合为<span class="math">\(\{f_{j1},f_{j2},\dots,f_{jS_{j}}\}\)</span>,条件概率<span class="math">\(P(x^j=f_{jl}\vert Y=c_k)\)</span>的极大似然估计是:</p>
<div class="math">$$
\begin{equation}
P(x^j=f_{jl}\vert Y=c_k) = \frac{\sum\limits_{i=1}^NI(x_i^j=f_{jl},y=c_k)}{\sum\limits_{i=1}^{N}I(y_i=c_k)} \\
j=1,2,\dots,n;l=1,2,\dots,S_j,k=1,2,\dots,K
\end{equation}
$$</div>
<p>其中,<span class="math">\(x\_i^j\)</span>是第<span class="math">\(i\)</span>个样本的第<span class="math">\(j\)</span>个特征,<span class="math">\(f\_{jl}\)</span>是第<span class="math">\(j\)</span>特征可能取的第<span class="math">\(l\)</span>个值。</p>
<h2>贝叶斯估计</h2>
<p>但是,从上面的估计方法中,我们可以发现,其实<strong>极大似然估计</strong>还是有一些问题的,如果<span class="math">\(x_j^i=f_{jl},y_i=c_k\)</span>的情况在训练数据中完全没有出现的话,那么整个估计就将变为0,这显然是不合理的,因此我们要对<strong>极大似然估计</strong>做出一点修改,修改之后的估计方法称为<strong>贝叶斯估计</strong>,后验概率的贝叶斯估计是:</p>
<div class="math">$$
\begin{equation}
P_\lambda (x^j=f_{jl}\vert Y=c_k) = \frac{\sum\limits_{i=1}^NI(x_i^j=f_{jl},y=c_k)+\lambda}{\sum\limits_{i=1}^{N}I(y_i=c_k)+S_j\lambda}
\end{equation}
$$</div>
<p>上式中的<span class="math">\(\lambda \geq 0\)</span>,当<span class="math">\(\lambda = 0\)</span>时,就退化为<strong>极大似然估计</strong>;通常情况下<span class="math">\(\lambda=1\)</span>,这时称为<strong>拉普拉斯平滑</strong></p>
<p>同样,先验概率的贝叶斯估计是:</p>
<div class="math">$$
\begin{equation}
P_\lambda(Y=c_k) = \frac{\sum\limits_{i=1}^{N}I(y_i=c_k)+\lambda}{N+K\lambda}
\end{equation}
$$</div>
<h1>具体实现</h1>
<p>朴素贝叶斯算法的Python简单实现如下:</p>
<pre><code>#!python
#coding:utf-8
"""
Program: Naive Bayes Algorithm
Description:
Author: Flyaway - flyaway1217@gmail.com
Date: 2014-01-13 20:30:29
Last modified: 2014-01-13 21:58:27
Python release: 3.2.3
"""
from collections import Counter
class NaiveBayes:
def __init__(self,dataset,labels,lam = 1):
self.dataset = dataset
self.labels = labels
self.instance_num = len(dataset)
self.lam = lam #lambda
self.count = {}
self.prior = {}
def getPrior(self,cla):
'''
get the prior probability
'''
member = self.prior[cla] + self.lam
denominator = self.instance_num + len(self.prior) * self.lam
return float(member/denominator)
def train(self):
self.prior={}
m = Counter(self.labels).most_common()
for item in m:
self.prior[item[0]] = item[1]
for i,vector in enumerate(self.dataset):
cla = self.labels[i]
if cla not in self.count:
self.count[cla] = [{}] * len(vector)
for j,feat in enumerate(vector):
self.count[cla][j][feat] = self.count[cla][j].get(feat,0) + 1
def getPost(self,cla,index,feat):
'''
get the post probability
'''
member = self.count[cla][index].get(feat,0) + self.lam
Sj = len(self.count[cla][index])
denominator = self.prior[cla] + self.lam * Sj
return float(member / denominator)
def predict(self,testdata):
result = []
for vector in testdata:
mP = 0.0
mCla = None
for cla in self.count:
p = self.getPrior(cla)
for i,feat in enumerate(vector):
p *= self.getPost(cla,i,feat)
if p > mP:
mP = p
mCla = cla
result.append(mCla)
return result
if __name__ == '__main__':
import Read
path = './Data/breast-cancer.data'
trainset,trainlabels = Read.Open(path)
index = int(len(trainset)/5)
testset = trainset[:index]
testlabels = trainlabels[:index]
trainset = trainset[index:]
trainlabels = trainlabels[index:]
nb = NaiveBayes(trainset,trainlabels,1)
nb.train()
result = nb.predict(testset)
print(result)
print(testlabels)
right = len([i for i in range(len(result)) if result[i] == testlabels[i]])
print('Precision = ' + str(right/len(result)))
</code></pre>
<h1>总结</h1>
<p>真是没想到要将<strong>朴素贝叶斯模型</strong>表述出来,竟然会有这么多的公式,但是请读者千万不要被这些公式给吓住了,其实<strong>朴素贝叶斯</strong>的方法是非常简单的,只有一点统计的基础,上述的这些公式都应该看得懂。</p>
<p>其实学习就是这么一回事,在你理解之前觉得是“高端大气上档次”,但是当你真正理解之后,你就会觉得也就是"just so so",所以,还请静下心来,好好理解一下<strong>朴素贝叶斯模型</strong>.</p>
<h1>参考资料</h1>
<ol>
<li><统计机器学习>——李航</li>
<li><a href="http://blog.csdn.net/xceman1997/article/details/7951513">【朴素贝叶斯】实战朴素贝叶斯_基本原理</a></li>
<li><a href="http://zh.wikipedia.org/wiki/朴素贝叶斯分类器">Wiki:朴素贝叶斯分类器</a></li>
</ol>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>决策树2-ID3,C4.5,CART2014-01-11T00:00:00-07:002014-01-11T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-01-11:/machine-learning/Decision-Tree-2/<p>机器学习中的经典分类方法——决策树的分析与实现。</p><p>在之前的<a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/" title="决策树0-基本模型">决策树0-基本模型</a>和<a href="http://zhouyichu.com/machine-learning/Decision-Tree-1/" title="决策树1-建模过程">决策树1-建模过程</a> 中分别分析了什么是<strong>决策树模型</strong>和<strong>决策树的建模过程</strong>,但是这两篇文章都是在比较抽象的层次上介绍<strong>决策树</strong>的,本篇文章聚焦于决策树模型的具体<strong>代码实现</strong>,本篇文章将会主要分析决策树模型的三个经典实现算法,分别是<strong>ID3</strong>,<strong>C4.5</strong>和<strong>CART</strong>(决策树模型的具体算法实现还有很多不同的版本,绝不仅仅这里列出的这三种,这三种算法是最为经典的。),这三个方法各有利弊,针对不同的问题可以选择不同的算法。</p>
<h1>ID3算法</h1>
<h2>主要过程</h2>
<p>ID3算法是一种比较简单的决策树实现方式,它使用的是<strong>信息增益</strong>作为节点的分裂指标,并且没有剪枝操作。</p>
<p>关于<strong>信息增益</strong>和节点的<strong>分裂标准</strong>的概念已经在<a href="http://zhouyichu.com/machine-learning/Decision-Tree-1/" title="决策树1-建模过程">决策树1-建模过程</a>中说明了,这里就不再重复了,直接给出<strong>信息增益</strong>的表达式:</p>
<div class="math">$$
\begin{equation}
g(D,A) = H(D) - H(D\big\vert A)
\end{equation}
$$</div>
<p>其中<span class="math">\(H(D)\)</span>表示当前数据集的<strong>信息熵</strong>,<span class="math">\(H(D\big\vert A)\)</span>表示<span class="math">\(D\)</span>在选择特征<span class="math">\(A\)</span>的情况下的<strong>条件熵</strong>.</p>
<p><strong>ID3</strong>算法的主要过程如下:</p>
<hr/>
<ul>
<li><strong>输入</strong>:训练数据集<span class="math">\(D\)</span>,特征集<span class="math">\(A\)</span>,阈值<span class="math">\(\epsilon\)</span></li>
<li>
<p><strong>输出</strong>:决策树<span class="math">\(T\)</span></p>
</li>
<li>
<p>若D中的所有实例属于同一类<span class="math">\(C_k\)</span>,则<span class="math">\(T\)</span>为单节点树,并将类<span class="math">\(C_k\)</span>作为该节点的类标记,返回T</p>
</li>
<li>若<span class="math">\(A = \varnothing\)</span>,则<span class="math">\(T\)</span>为单节点数,并将<span class="math">\(D\)</span>中实例数最大的类<span class="math">\(C_k\)</span>作为该节点类标记,返回<span class="math">\(T\)</span></li>
<li>否则,逐个计算<span class="math">\(A\)</span>中的各个特征对<span class="math">\(D\)</span>的信息增益,选择信息增益最大的特征<span class="math">\(A_g\)</span></li>
<li>如果<span class="math">\(A_g\)</span>的信息增益小于阈值<span class="math">\(\epsilon\)</span>,则置<span class="math">\(T\)</span>为单节点树,并将<span class="math">\(D\)</span>中实例数最大的类<span class="math">\(C_k\)</span>作为该节点的类标记,返回<span class="math">\(T\)</span></li>
<li>否则,对<span class="math">\(A_g\)</span>的每一个可能值<span class="math">\(a_i\)</span>,依<span class="math">\(A_g=a\_i\)</span>将<span class="math">\(D\)</span>分割为若干非空子集<span class="math">\(D_i\)</span>,构建子节点,由当前节点及其子节点构成树<span class="math">\(T\)</span>,返回<span class="math">\(T\)</span></li>
<li>对第<span class="math">\(i\)</span>个子节点,以<span class="math">\(D_i\)</span>为训练集,以<span class="math">\(A-\{A_g\}\)</span>为特征集,递归的调用1-5步,得到子树<span class="math">\(T_i\)</span>,返回<span class="math">\(T_i\)</span></li>
</ul>
<hr/>
<h2>细节</h2>
<p>在具体实现ID3的时候,其实并不一定要按照其递归的过程来进行的,个人觉得虽然递归过程非常通俗易懂,但是却很难调试,而且效率也很低。其实在具体实现的时候,可以利用广度遍历代替深度遍历,即使用迭代来代替递归。用迭代代替递归的好处之一就是方便在编码的时候跟踪调试程序,而且当树的层次很深时,可能直接会出现栈溢出的情况。</p>
<p>另外一个需要注意的问题是,不仅仅要给叶子节点设置其标记,还要给每一个非叶节点设置相应的标记,这是因为,在实际的数据中,可能会出现这样的情况:<strong>某个属性值只在测试集中出现,而没有在训练集中出现。</strong>虽然这种情况是非常少见的,但并不是没有可能,如果在预测的时候遇到这种情况,可以直接将当前非叶结点的标记作为最终的类别标记返回。</p>
<p>关键的节点分裂代码如下所示:</p>
<pre><code>#!python
def split(self):
if self.isLeaf == True: return None
index = [i for i in range(self.feat_num) if self.isvisited[i] == False]
bestFeat = -1
bestChildren = {}
bestinforGain = 0.0
for i in index:
values = set([vector[i] for vector in self.dataset])
children = {}
newEntropy = 0.0
for value in values:
subset,sublabels = self.getSubSet(i,value)
isvisited = self.isvisited[:]
isvisited[i] = True
children[value] = ID3Node(subset,sublabels,isvisited)
for key in children:
child = children[key]
prob = float(len(child) / self.instance_num)
newEntropy += (prob * child.getEntropy())
inforGain = self.entropy - newEntropy
#inforGain = inforGain / self.entropy
if inforGain >= bestinforGain:
bestinforGain = inforGain
bestFeat = i
bestChildren = children
self.selectFeat = bestFeat
return bestChildren
</code></pre>
<p>树的非递归生长过程如下:</p>
<pre><code>#!python
def train(self):
Q = queue.Queue()
Q.enqueue(self.root)
while not Q.isEmpty():
node = Q.dequeue()
if node.isLeaf == False:
children = node.split()
node.children = children
for key in children:
Q.enqueue(children[key])
</code></pre>
<p>预测过程如下:</p>
<pre><code>#!python
def predict(self,testdata):
if self.isLeaf == True:
return self.classlabel
else:
value = testdata[self.selectFeat]
if value not in self.children:
return self.classlabel
return self.children[value].predict(testdata)
</code></pre>
<h2>评价</h2>
<p>从上述的分析中可以看到,其实ID3算法还是有很多的局限性的:</p>
<ol>
<li>只能处理特征值是离散值的情况</li>
<li>使用<strong>信息增益</strong>作为节点的分裂标准,实际上并不合理,会倾向于选择取值较多的属性。</li>
<li>并没有剪枝操作,容易发生过拟合的现象<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</li>
<li>无法处理缺失值</li>
</ol>
<p>基于上述的这些缺点,C4.5算法被提出来了,它克服上述ID3算法的部分缺点。</p>
<h1>C4.5算法</h1>
<h2>主要过程</h2>
<p>C.45算法的整体过程是和ID3很相似的,只是在具体细节的地方有少许不同。</p>
<p>首先为了更加合理的分裂节点,C4.5算法中不再使用<strong>信息增益</strong>作为分裂标准,而是使用<strong>信息增益比</strong>作为分裂标准,相关概念也已经在<a href="http://zhouyichu.com/machine-learning/Decision-Tree-1/" title="决策树1-建模过程">决策树1-建模过程</a>中说明了,此处直接给出计算公式:</p>
<div class="math">$$
\begin{equation}
g_R(D,A) = \frac{g(D,A)}{H(D)}
\end{equation}
$$</div>
<p>其次为了解决只能处理离散值的情况,C4.5算法中增加了对连续数值的处理过程,当一个属性是离散值时,处理方式和ID3一样;当属性值是连续的时候,采用如下的步骤计算其<strong>信息增益比</strong>:</p>
<hr/>
<ul>
<li><strong>输入</strong>: 连续值的属性A</li>
<li>
<p><strong>输出</strong>: 该属性的最佳分裂点以及相应的信息增益比</p>
</li>
<li>
<p>将该节点上的A属性值进行升序排列,得到属性值序列<span class="math">\(\{A_1,A_2,\dots A_n\}\)</span></p>
</li>
<li>计算出<span class="math">\(n-1\)</span>个分裂点,每一个分裂点<span class="math">\(B_i=A_{i+1} - A_i\)</span></li>
<li>遍历上述所有的分裂点<span class="math">\(B_i\)</span>,每一个分裂点都将数据分成两个子集,计算每个分裂点分割之后的信息增益比</li>
<li>选择使得信息增益最大的那个<span class="math">\(B_k\)</span>作为最终的分裂点,返回<span class="math">\(B_k\)</span>及其相应的信息增益比。</li>
</ul>
<hr/>
<p>从上述的过程可以看出,其实对于连续值的处理,C4.5算法是进行二分处理的,在二分的前提下寻找最优的分裂点。</p>
<p>最后,C4.5算法中是进行后剪枝操作的,但是这部分剪枝的算法也是一个很复杂的过程,我还没能完全理解,这部分内容只能留待后补了。</p>
<h2>评价</h2>
<p>C4.5算法在一定程度上改进了ID3算法本身固有的一些缺点,事实上,C4.5是决策树实现算法中<strong>最常用</strong>的一种算法.</p>
<h1>CART算</h1>
<p><strong>CART</strong>算法的全称是Classification And Regression Tree,从它的名字上我们就可以知道,CART不仅仅可以用来处理分类问题,还能够处理回归问题。这在<a href="http://zhouyichu.com/machine-learning/Decision-Tree-1/" title="决策树1-建模过程">决策树1-建模过程</a>中也有所提及,决策树不仅仅可以处理分类问题,只需要将分裂标准改成该节点中所有数据的方差最小,并且把节点的标记改成当前节点中所有数据的平均值,而不是类别。</p>
<p><strong>CART</strong>中采用的是<strong>Gini指数</strong>作为分裂标准,同时它也是包含后剪枝操作的</p>
<h1>参考资料</h1>
<ol>
<li><a href="http://isilic.iteye.com/blog/1841339">Decision Tree:Analysis</a></li>
<li><统计机器学习>——李航</li>
<li><a href="http://wenku.baidu.com/view/415c3cc19ec3d5bbfd0a7464.html">决策树-上-ID3 C4.5 CART及剪枝</a></li>
<li><a href="http://blog.sina.com/s/blog_68ffc7a40100urn3.html">C4.5决策树</a></li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实在算法中设置阈值<span class="math">\(\epsilon\)</span>就是一种预剪枝的过程,但是此处所说的剪枝过程通常是指后剪枝。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>决策树1-建模过程2014-01-06T23:30:30-07:002014-01-06T23:30:30-07:00Flyawaytag:zhouyichu.com,2014-01-06:/machine-learning/Decision-Tree-1/<p>机器学习中的经典分类方法——决策树的分析与实现。</p><p>在<a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/" title="上一篇文章">上一篇文章</a> 中说明了什么是<strong>决策树</strong>模型,以及它的优缺点。本篇文章主要是用来说明决策树模型是如何建模的,回顾<a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/" title="上一篇文章">上一篇文章</a>中的内容,决策树的学习过程主要分为以下3个部分:</p>
<ul>
<li>
<p><strong>特征选择</strong></p>
</li>
<li>
<p><strong>决策树生成</strong></p>
</li>
<li>
<p><strong>剪枝操作</strong></p>
</li>
</ul>
<p>本文的重点在于说明以上三个步骤是如何操作的,但是并不会给出具体的代码,只是从原理上进行分析,代码实现部分会在下一篇博文中给出。</p>
<h1>特征选择</h1>
<p>特征选择可以说是整个决策树生长过程中最重要的一个部分,如果特征选择的好,决策树的性能就会很好,相反如果特征选择的不好,则性能就可能不理想。</p>
<p>目前来说,主要的选择标准是<strong>信息增益</strong>,<strong>信息增益比</strong>,<strong>Gini指数</strong>,针对不同的实现算法,采用不同的选择标准。在具体说明这三个概念之前,首先需要说明几个重要的概念:</p>
<h2>信息熵</h2>
<p>在概率论中,<a href="http://zh.wikipedia.org/wiki/信息熵">熵(entropy)</a><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>是用来衡量随机变量不确定性的。假设<span class="math">\(X\)</span>是一个取有限值的离散随机变量,其概率分布为:</p>
<div class="math">$$
\begin{equation}
P(X=x_i) = p_i, i=1,2,\cdots,n
\end{equation}
$$</div>
<p>
则随机变量<span class="math">\(X\)</span>的<strong>熵</strong>定义为:
</p>
<div class="math">$$
\begin{equation}
H(X) = -\sum_{i=1}^{n}p_i\log p_i
\end{equation}
$$</div>
<p>熵越大,随机变量的不确定就越大,从定义中可知:</p>
<div class="math">$$
\begin{equation}
0\leq H(X)\leq \log n
\end{equation}
$$</div>
<p>当随机变量只取两个值时,即<span class="math">\(X\)</span>的分布为
</p>
<div class="math">$$
\begin{equation}
P(X=1)=p,X(X=0)=1-p, 0\leq p \leq 1
\end{equation}
$$</div>
<p>则熵为</p>
<div class="math">$$
\begin{equation}
H(X) = -p\log_2p-(1-p)log_2(1-p)
\end{equation}
$$</div>
<p>此时,熵<span class="math">\(H(X)\)</span>随概率<span class="math">\(p\)</span>变化的曲线如下图所示:</p>
<p><img alt="熵" src="http://zhouyichu.com/images/entropy.jpg"/></p>
<p>根据上面的公式,我们可以看到当<span class="math">\(p_i=0\)</span>或<span class="math">\(p_i=1\)</span>时,<span class="math">\(H(X)=0\)</span>,从直观上很好理解,当某个事件出现的概率是0或1时,则我们认为这是一个确定事件,其中并不包含不确定性,因此其信息熵为0.</p>
<h2>条件熵</h2>
<p>假设有随机变量<span class="math">\((X,Y)\)</span>,其联合概率分布为:</p>
<div class="math">$$
\begin{equation}
P(X=x_i,Y=y_i) = p_{ij},i=1,2,\cdots,n; j=1,2,\cdots,m
\end{equation}
$$</div>
<p>则<strong>条件熵(<span class="math">\(H(Y\big\vert X)\)</span>)</strong>表示在已知随机变量<span class="math">\(X\)</span>的条件下随机变量<span class="math">\(Y\)</span>的不确定性,其定义为<span class="math">\(X\)</span>在给定条件下<span class="math">\(Y\)</span>的条件概率分布的熵对<span class="math">\(X\)</span>的数学期望:</p>
<div class="math">$$
\begin{equation}
H(Y\big\vert X) = \sum_{i=1}^{n}p_iH(Y\big\vert X=x_i)
\end{equation}
$$</div>
<h2>信息增益</h2>
<p>信息增益(information gain)表示得知特征<span class="math">\(X\)</span>的信息后,而使得<span class="math">\(Y\)</span>的不确定性减少的程度。定义为:</p>
<div class="math">$$
\begin{equation}
g(D,A) = H(D) - H(D\big\vert A)
\end{equation}
$$</div>
<p>上面说明了那么多,终于到了这个关键概念了,在决策树节点分裂的过程中,算法会遍历所有的特征,从中选择使得当前节点的<strong>信息增益</strong>最大的那一维特征进行分裂。</p>
<h2>信息增益比</h2>
<p>可以看到,上面的<strong>信息增益</strong>是基于绝对数值的,当数据集本身的<strong>信息熵</strong>很大的时候,<strong>信息增益</strong>就会偏大。为了解决这个问题,我们可以使用<strong>信息增益比(information gain)</strong>来解决这个问题,<strong>信息增益比</strong>的定义如下:</p>
<div class="math">$$
\begin{equation}
g_R(D,A) = \frac{g(D,A)}{H(D)}
\end{equation}
$$</div>
<h2>Gini指数</h2>
<p>除了使用信息熵相关的概念来作为节点的分裂标准,有些算法还使用了其他的标准。比如<strong>Gini指数</strong>,其定义如下:</p>
<div class="math">$$
\begin{equation}
Gini(X) = \sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^K p_k^2
\end{equation}
$$</div>
<p>Gini指数和熵的概念类似,也是用来表示一个随机变量的不确定性的,但是它和熵又有少许差别,如下图所示:</p>
<p><img alt="Gini指数" src="http://zhouyichu.com/images/gini.jpg"/></p>
<p>从上图中可以看出,Gini指数与信息熵的图像很相似,只是收敛速度不同而已。</p>
<h2>总结</h2>
<p>上面提到的三个概念<strong>信息增益</strong>,<strong>信息增益比</strong>和<strong>Gini指数</strong>都是可以用来作为节点分裂的标准,针对不同的算法,采用不同的标准:</p>
<ul>
<li>
<p><strong>ID3</strong>: 信息增益最大</p>
</li>
<li>
<p><strong>C4.5</strong>: 信息增益比最大</p>
</li>
<li>
<p><strong>CART</strong>: Gini指数最小</p>
</li>
</ul>
<p>上面三种算法是决策树实现中最经典的算法,也各有利弊,具体对这三个算法的分析,将会在下一篇博文中说明。</p>
<p>但是还有一些特殊情况,如果需要解决的问题是一个回归问题,而不是分类问题,那么上述三种分裂标准将没有计算意义,在这种情况下,可以选择是用<strong>方差最小</strong>的标准来选择最优的分裂特征。</p>
<p>最后需要强调的是,上面各个公式中的概率<span class="math">\(p\)</span>都是可以从训练数据中利用<strong>极大似然估计</strong>得到,因此每一个节点的信息熵及其对每一维特征的条件熵都是比较容易计算的。具体计算的例子请参阅李航老师的《统计学习方法》决策树一章,此处不再给出。</p>
<h1>决策树生成</h1>
<p><a href="http://zhouyichu.com/machine-learning/Decision-Tree-0/" title="之前">之前</a>提到过,寻找一棵最优的决策树是一个<strong>NP难题</strong>,因此只能采用一种基于启发式的贪心策略来寻找最优决策树。</p>
<p>决策树的生长过程主要有如下几步(假设训练数据集为<span class="math">\(D\)</span>,特征集为<span class="math">\(A\)</span>):</p>
<ol>
<li>若<span class="math">\(D\)</span>中所有实例都属于同一个类别(或方差小于预设阈值),则停止生长,返回决策树T.</li>
<li>若<span class="math">\(A = \varnothing\)</span>,则将<span class="math">\(D\)</span>中数量最多的类别(平均值)作为该节点的标记,返回T.</li>
<li>若<span class="math">\(A\neq \varnothing\)</span>,则从<span class="math">\(A\)</span>中选择一个最优的特征<span class="math">\(A_i\)</span>进行子节点的分裂(利用上面所说的分裂标准).分裂得到<span class="math">\(n\)</span>个子节点,用<span class="math">\(D_i\)</span>表示。</li>
<li>遍历每一个子节点,将<span class="math">\(D_i\)</span>作为新的<span class="math">\(D\)</span>,从第一步开始重复上述操作。</li>
</ol>
<p>上面的算法过程是我自己理解的,这篇文章主要关注点是模型本身,因此这里的算法比较抽象,和原始论文中的算法应该有些出入,但是基本思想还是一致的。</p>
<h1>剪枝操作</h1>
<p>决策树在生长过程中是很有可能发生<strong>过拟合</strong>的,因为决策树长得越大(层次越深)说明它分类分得越细,在训练数据上能够取得非常好的效果,但是对于未知的数据来说,就缺泛化性了,导致<strong>过拟合</strong>的现象。</p>
<p>解决这个问题的方法是通过<strong>剪枝操作</strong>,<strong>剪枝操作</strong>又分为<strong>预剪枝</strong>和<strong>后剪枝</strong>。</p>
<p><strong>预剪枝</strong>是指在树的生长过程中就做好预防措施,防止树长得过于庞大。比如设定树的最深层次(max-depth)、节点停止分裂的阈值等。</p>
<p><strong>后剪枝</strong>是指在树完全生长之后,对树进行修剪操作,也就是说将决策树的学习过程分成两部分:1. 尽可能的生长树 2.对完全生长的树进行剪枝。</p>
<p>常见的<strong>后剪枝</strong>操作主要有:</p>
<ul>
<li>
<p><strong>降低错误剪枝(REP:Reduced Error Pruning)</strong></p>
</li>
<li>
<p><strong>悲观错误剪枝(PEP:Pessimistic Error Pruning)</strong></p>
</li>
<li>
<p><strong>基于错误剪枝(EBP:Error-Based Pruning)</strong></p>
</li>
<li>
<p><strong>代价-复杂度剪枝(CCP:Cost-Complexity Pruning)</strong></p>
</li>
</ul>
<p>这里虽然列出了很多的<strong>后剪枝</strong>方法,但是我并不是全部理解的,这里只能选择最简单的一种操作来进行说明。</p>
<h2>降低错误剪枝(REP:Reduced Error Pruning)</h2>
<p>在剪枝操作开始之前,我们首先需要判断一棵决策树是好的还是不好的,也就是说是否会发生过拟合现象。通常来说,我们可以用一个损失函数来表征一棵树的好坏。假设一棵树<span class="math">\(T\)</span>的叶节点个数为<span class="math">\(\vert T\vert\)</span>,<span class="math">\(t\)</span>是<span class="math">\(T\)</span>的叶节点,且该节点有<span class="math">\(N\_t\)</span>个样本</p>
<div class="math">$$
\begin{equation}
C_{\alpha}(T) = C(T) + \alpha\vert T \vert = \sum_{i=1}^{\vert T \vert}N_tH_t(T) + \alpha\vert T \vert
\end{equation}
$$</div>
<p>其中<span class="math">\(H_t(T)\)</span>表示节点<span class="math">\(t\)</span>所包含的信息熵。</p>
<p>在上面的损失函数中,<span class="math">\(C(T)\)</span>表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,而后面的一项<span class="math">\(\alpha \vert T\vert\)</span>表示模型本身的复杂程度,参数<span class="math">\(\alpha\)</span>是用来控制两者之间的影响力的。<span class="math">\(\alpha\)</span>比较大的时候,会导致比较简单的树,而当<span class="math">\(\alpha=0\)</span>时,表示不考虑模型本身的复杂度。</p>
<p>我们的目标是在剪枝的过程中,使得上述的损失函数<span class="math">\(C_{\alpha}(T)\)</span>取得最小值。</p>
<p>具体的剪枝过程如下:</p>
<ol>
<li>自底向上的遍历每一个非叶节点(除了根节点),将当前的非叶节点从树中减去,其下所有的叶节点合并成一个节点,代替原来被剪掉的节点。</li>
<li>计算剪去节点前后的损失函数,如果剪去节点之后损失函数变小了,则说明该节点是可以剪去的,并将其剪去;如果发现损失函数并没有减少,说明该节点不可剪去,则将树还原成未剪去之前的状态。</li>
<li>重复上述过程,直到所有的非叶节点(除了根节点)都被尝试了。</li>
</ol>
<h1>写在最后</h1>
<p>本文主要对决策树模型的三个步骤进行了一些说明,但是真正的关于决策树的内容还有很多,比如在节点进行分裂的时候,不一定是只看一个特征的,可以由多个个特征共同决定如何分裂,这就是所谓的<strong>多变量决策树</strong>。</p>
<p>另外,决策树的具体算也不止<strong>ID3</strong>、<strong>C4.5</strong>和<strong>CART</strong>这三种,还有很多其他的变种算法,比如:</p>
<ul>
<li>
<p><strong>Quest(Quick unbiased efficient statistical tree)</strong></p>
</li>
<li>
<p><strong>SLIQ(Supervised Learning In Quest)</strong></p>
</li>
<li>
<p><strong>SPRINT(Scalable Parallelizable Induction of Classification Tree)</strong></p>
</li>
<li>
<p><strong>PUBLIC(Pruning and Building Integrated in Classification)</strong></p>
</li>
<li>
<p><strong>CHAID(Chi-squard Automatic Interaction Detector)</strong></p>
</li>
</ul>
<p>有兴趣深入研究的朋友可以找找相关的论文学习一下。</p>
<h1>参考资料</h1>
<ol>
<li>July大神的<a href="http://blog.csdn.net/v_july_v/article/details/7577684#t3"><从决策树学习谈到贝叶斯分类算法、EM、HMM></a></li>
<li><a href="http://isilic.iteye.com/blog/1841339">Decision Tree:Analysis</a></li>
<li><统计机器学习>——李航</li>
<li><a href="http://wenku.baidu.com/view/415c3cc19ec3d5bbfd0a7464.html">决策树-上-ID3 C4.5 CART及剪枝</a></li>
<li><a href="http://blog.sina.com/s/blog_68ffc7a40100urn3.html">C4.5决策树</a></li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>熵在信息论中是一个非常重要的概念,很多机器学习的算法都会利用到这个概念。它首次是由香农在1948年从物理学中引入到信息论中,信息熵给了我们一种度量不确定性的方式。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>决策树0-基本模型2014-01-06T00:00:00-07:002014-01-06T00:00:00-07:00Flyawaytag:zhouyichu.com,2014-01-06:/machine-learning/Decision-Tree-0/<p>机器学习中的经典分类方法——决策树的分析与实现。</p><h1>什么是决策树</h1>
<p>其实网络上有着很多说明决策树的文章,比如参考资料中的1和2,主要是因为这个机器学习的方法实在太经典了,有着很多不同的算法实现,包括最早的由Quinlan在1986年提出的ID3算法、1993年同样是Quinlan提出的C4.5算法以及由Braiman等人在1984年提出的CART算法。</p>
<p>尽管这个模型如此的"尽人皆知",但是此处还是要说明一下,到底什么才是决策树。</p>
<p><strong>决策树模型其实是一种描述决策过程的树形结构,既可以用来分类也可以进行回归分析。</strong>一个决策树就是一个树结构,它是由<strong>节点</strong>和<strong>有向边</strong>组成的。其中的节点又分为两类:<strong>叶节点</strong>和<strong>非叶节点</strong>。叶节点表示一个候选的类别,非叶节点表示一次属性的判断,该节点的每一个后继分支都对应于该属性的一个可能值。</p>
<p>预测的过程就是一个从根节点开始的寻找路径的过程(也可以说是一个决策的序列),从根节点开始,根据样本中的每一个属性值,在非叶结点中选择一个分支往下走,直至到达叶节点,此时叶节点所代表的类别就是该样本预测的类别。如下图所示:</p>
<p><img alt="决策树" src="http://zhouyichu.com/images/batch-descent.png"/></p>
<p>根据决策树的预测过程,其实我们可以将决策树看成是一个if-else的规则集合,每一条从根节点到叶节点的路径都对应着一条if-else规则,但是需要注意的是,此处有一个重要的性质:</p>
<p><strong>互斥完备性: 每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则覆盖</strong></p>
<h1>决策树的优点和缺点</h1>
<p>首先我们来看一下决策树模型具有哪些优点:</p>
<ol>
<li>学习和预测过程简单明了,对于学习到的模型方便解释。</li>
<li>数据预处理少,不需要进行正规化等数据预处理操作。</li>
<li>能够处理任意的数据类型(实数值和离散值)。</li>
<li>没有过强的假设条件,比如在朴素贝叶斯模型中有属性之间是条件独立的假设,而在决策树中没有预设的假设,该模型仅仅依靠观测到的数据。</li>
</ol>
<p>当然,任何一个模型都不会只有优点而没有缺点的,决策树的缺点有如下几点:</p>
<ol>
<li>寻找一个最优的决策树其实是一个<strong>NP难题</strong>,目前所用的决策树生成算法都是一种基于启发式的贪心算法,每一个节点根据某种预设的判定规则进行节点的分裂,最终得到的决策树不能保证是<strong>全局最优</strong>的,只能说是<strong>局部最优</strong>。</li>
<li>容易发生过拟合的情况,尤其当树生长层次特别深的时候,往往都会发生过拟合现象。(这个问题可以通过进行剪枝技术来解决。)</li>
</ol>
<h1>决策树的学习过程</h1>
<p>一棵决策树的生成过程主要分为以下3个部分:</p>
<ul>
<li>
<p><strong>特征选择</strong>: 特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同的标准,常用的有:<strong>信息增益</strong>、<strong>信息增益比</strong>和<strong>Gini指数</strong>。</p>
</li>
<li>
<p><strong>决策树生成</strong>: 根据选择的节点分裂标准,从上至下递归地生成子节点<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,直到某个节点不满足分裂的标准,则停止决策树停止生长。</p>
</li>
<li>
<p><strong>剪枝</strong>: 由于决策树存在着过拟合的风险,所以一般来说需要对生成的决策树进行剪枝操作,缩小树结构的规模,缓解过拟合的现象。其实这个过程并不是必须的,比如在最早的ID3算法中,就没有剪枝的过程,但是在实际分析数据的时候,往往都会出现过拟合的现象,所以通常在生成树结构之后会进行剪枝操作。</p>
</li>
</ul>
<h1>参考资料</h1>
<ol>
<li>July大神的<a href="http://blog.csdn.net/v_july_v/article/details/7577684#t3"><从决策树学习谈到贝叶斯分类算法、EM、HMM></a></li>
<li><a href="http://isilic.iteye.com/blog/1841339">Decision Tree:Analysis</a></li>
<li><统计机器学习>——李航</li>
<li><机器学习>Tom M.Mitchell</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实具体代码实现的时候,不一定就是递归的,但是此处对于树结构来说,递归结构是最容易理解的方式。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>矩阵论学习笔记8-赋范线性空间与范数2013-12-09T00:00:00-07:002013-12-09T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-12-09:/matrix-theory/Theory-of-Matrices-8/<p>矩阵论学习课程笔记</p><h1>向量范数</h1>
<h2>定义</h2>
<p><strong>定义:</strong> 如果<span class="math">\(V\)</span>是数域<span class="math">\(F\)</span>上的线性空间,且对于<span class="math">\(V\)</span>中任意一向量<span class="math">\(x\)</span>,对应着一个实值函数<span class="math">\(\Vert x \Vert\)</span>,它满足下面三个条件:</p>
<ol>
<li><span class="math">\(\Vert x \Vert\geq 0;\Vert x \Vert = 0 \Leftrightarrow x=0\)</span> <strong>正定性</strong></li>
<li><span class="math">\(\Vert\alpha x \Vert = \vert\alpha\vert \cdot \Vert x \Vert\)</span>,对<span class="math">\(\forall\alpha\in F\)</span> <strong>齐次性</strong></li>
<li><span class="math">\(\Vert x+y \Vert\leq \Vert x\Vert + \Vert y \Vert\)</span> <strong>三角不等式</strong></li>
</ol>
<p>则称<span class="math">\(\Vert x \Vert\)</span>为<span class="math">\(V\)</span>上向量<span class="math">\(x\)</span>的<strong>范数(norm)</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<p><strong>定义:</strong> 定义了向量范数<span class="math">\(\Vert . \Vert\)</span>的线性空间<span class="math">\(V^n\)</span>就称为<strong>赋范空间</strong>,这里的<span class="math">\(\Vert . \Vert\)</span>表示泛指的任何一种范数。</p>
<h2>常用向量范数</h2>
<ol>
<li><span class="math">\(x\)</span>的1范数: <span class="math">\(\Vert x \Vert_1 = \vert x_1\vert + \vert x_2\vert +\cdots +\vert x_n\vert\)</span></li>
<li><span class="math">\(x\)</span>的2范数(欧式范数): {% math %}\Vert x \Vert_2 = (\vert x_1\vert^2 + \vert x_2\vert^2 +\cdots +\vert x_n\vert^2)^{\frac{1}{2}}{% endmath %}</li>
<li><span class="math">\(x\)</span>的<span class="math">\(\infty\)</span>范数(最大范数): <span class="math">\(\Vert x \Vert\_{\infty} = \max\_{1\leq i\leq n}\vert x\_i\vert\)</span></li>
<li><span class="math">\(x\)</span>的<span class="math">\(p\)</span>范数(<span class="math">\(p \geq 1\)</span>): {% math %}\Vert x \Vert_p = (\vert x_1\vert^p + \vert x_2\vert^p +\cdots +\vert x_n\vert^p)^{\frac{1}{p}}{% endmath %}</li>
</ol>
<h2>向量范数的几何意义</h2>
<p>其实常用的几个范数在直观上是有几何意义的,如下所示:</p>
<ul>
<li><span class="math">\(\Vert x\Vert_{\infty} = \max(\vert x_2-x_1\vert,\vert y_2-y_1\vert)\)</span> <strong>长的直角边</strong></li>
<li><span class="math">\(\Vert x\Vert_1 = \vert x_2-x_1\vert + \vert y_2-y_1\vert\)</span> <strong>两直角边之和</strong></li>
<li>{% math %}\Vert x\Vert_2 = \sqrt{(y_2-y_1)^2+(x_2-x_1)^2}{% endmath %} <strong>斜边</strong></li>
</ul>
<p><img alt="向量范数" src="http://zhouyichu.com/images/vector-number.png"/></p>
<h2>向量范数之间的关系</h2>
<p><strong>定义:</strong> 设<span class="math">\(\Vert x\Vert_{\alpha}\)</span>与<span class="math">\(\Vert x \Vert_{\beta}\)</span>是<span class="math">\(n\)</span>维线性空间<span class="math">\(V^n\)</span>上定义的任意两种范数,若存在两个与<span class="math">\(x\)</span>无关的正常数<span class="math">\(c_1,c_2\)</span>,使得:</p>
<div class="math">$$
\begin{equation}
c_1\Vert x\Vert_{\beta}\leq \Vert x \Vert_{\alpha}\leq c_2\Vert x \Vert_{\beta}, \forall x \in V^n
\end{equation}
$$</div>
<p>则称<span class="math">\(\Vert x\Vert\_{\alpha}\)</span>与<span class="math">\(\Vert x\Vert_{\beta}\)</span>是<strong>等价的</strong></p>
<p><strong>定理:</strong> 同一个有限维线性空间上不同的范数是等价的。</p>
<h1>矩阵范数</h1>
<h2>定义</h2>
<p><strong>定义:</strong> 设<span class="math">\(A\)</span>为<span class="math">\(n\times n\)</span>的方阵矩阵,<span class="math">\(\Vert \bullet \Vert\)</span>是以<span class="math">\(A\)</span>为自变量的的实值函数,且满足条件:</p>
<ol>
<li><strong>非负性</strong>: <span class="math">\(\Vert A \Vert\geq 0\)</span>,且<span class="math">\(\Vert A \Vert=0\)</span>当前仅当<span class="math">\(A=0\)</span></li>
<li><strong>齐次性</strong>: <span class="math">\(\Vert\alpha A\Vert=\vert \alpha \vert \Vert A \Vert,\alpha\in R\)</span></li>
<li><strong>三角不等式</strong>: <span class="math">\(\Vert A+B \Vert\leq \Vert A\Vert + \Vert B\Vert\)</span></li>
<li><strong>相容性</strong>: <span class="math">\(\Vert AB \Vert\leq \Vert A\Vert\Vert B\Vert\)</span></li>
</ol>
<p>则称<span class="math">\(\Vert A\Vert\)</span>为矩阵<span class="math">\(A\)</span>的<strong>范数</strong></p>
<h2>常用矩阵范数</h2>
<ol>
<li><span class="math">\(\Vert A \Vert_1 = \max_{1\leq j\leq n}\sum\_{i=1}^n\vert a_{ij}\vert\)</span> <span class="math">\(A\)</span>的每列绝对值之和的最大值,称为<strong>{% math %}A{% endmath %}的列范数</strong> .</li>
<li><span class="math">\(\Vert A \Vert_{\infty} = \max_{1\leq i\leq n}\sum_{j=1}^n\vert a_{ij}\vert\)</span> <span class="math">\(A\)</span>的每行绝对值之和的最大值,称为<strong><span class="math">\(A\)</span>的行范数</strong> .</li>
<li><span class="math">\(\Vert A\Vert_{2}=\sqrt{\lambda_{max}(A^TA)}\)</span> 称为<strong><span class="math">\(A\)</span>的2范数</strong> ,其中<span class="math">\(\lambda_{max}(A^TA)\)</span>为<span class="math">\(A^TA\)</span>的特征值的绝对值的最大值</li>
<li><span class="math">\(\Vert A \Vert_{F}=\sqrt{\sum_{i=1}^{n}\sum_{j=1}^{n}\vert a_{i,j}\vert^2}\)</span> 称为<strong>Frobenius范数</strong> .</li>
</ol>
<p>| <span class="math">\(\Vert A \Vert_1\)</span>,<span class="math">\(\Vert A \Vert_{\infty}\)</span> | <span class="math">\(\Vert A\Vert_{2}\)</span> | <span class="math">\(\Vert A \Vert_{F}\)</span> |
| 容易计算,<strong>使用最广泛</strong> | 计算较复杂 对<strong>矩阵元素比较敏感,性质较好,使用比较广泛</strong> | 较少使用 |</p>
<hr/>
<h2>谱半径</h2>
<p><strong>定义:</strong> 设<span class="math">\(A\in R^{n\times n}\)</span>的特征值为<span class="math">\(\lambda_1,\lambda_2,\cdots,\lambda_n\)</span>称</p>
<div class="math">$$
\begin{equation}
\rho(A) = \max\{\vert\lambda_1\vert,\vert\lambda_2\vert,\cdots,\vert\lambda_n\vert\}
\end{equation}
$$</div>
<p>为矩阵<span class="math">\(A\)</span>的<strong>谱半径</strong><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>
<p><strong>定理:</strong> 设<span class="math">\(A\)</span>为<span class="math">\(n\)</span>阶方阵,则对任意算子范数<span class="math">\(\Vert \cdot \Vert\)</span>有</p>
<div class="math">$$
\begin{equation}
\rho(A) \leq \Vert A\Vert
\end{equation}
$$</div>
<p>证明:</p>
<p>根据算子范数的相容性,得到<span class="math">\(\Vert Ax\Vert\leq\Vert A\Vert\cdot\Vert x\Vert\)</span></p>
<p>将任意一个特征根<span class="math">\(\lambda\)</span>所对应的特征向量<span class="math">\(u\)</span>代入</p>
<div class="math">$$
\begin{equation}
\vert \lambda \vert\cdot\Vert u\Vert = \Vert \lambda u\Vert = \Vert Au \Vert \leq \Vert A \Vert\cdot\Vert u\Vert
\end{equation}
$$</div>
<p>即<span class="math">\(\vert\lambda\vert\leq\Vert A\Vert\)</span>,所以<span class="math">\(\rho(A) \leq \Vert A\Vert\)</span></p>
<p>这个定理说明:<strong>矩阵A的谱半径不超过矩阵的任何一种算子范数</strong></p>
<hr/>
<p><strong>定理:</strong> 若<span class="math">\(A\)</span>对称,则有<span class="math">\(\Vert A\Vert_2=\rho(A)\)</span></p>
<p>证明:</p>
<p><span class="math">\(\Vert A\Vert_{2}=\sqrt{\lambda_{max}(A^TA)}=\sqrt{\lambda_{max}(A^2)}\)</span></p>
<p>又因为:若<span class="math">\(\lambda\)</span>是<span class="math">\(A\)</span>的一个特征根,则<span class="math">\(\lambda^2\)</span>必是<span class="math">\(A^2\)</span>的特征根.</p>
<p>所以,<span class="math">\(A\)</span>中特征根绝对值最大的<span class="math">\(\vert \lambda\vert_{max}\)</span>必满足:<span class="math">\(\vert \lambda\vert_{max}^2 = \lambda_{max}(A^2)\)</span></p>
<p>代入上式中,得到:</p>
<div class="math">$$
\begin{equation}
\Vert A\Vert_{2}=\sqrt{\lambda_{max}(A^TA)}=\sqrt{\lambda_{max}(A^2)}=\sqrt{\vert \lambda\vert_{max}^2}=\vert \lambda\vert_{max}
\end{equation}
$$</div>
<p>根据<span class="math">\(\rho(A)\)</span>的定义,即得到<span class="math">\(\Vert A\Vert_{2} = \rho(A)\)</span></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>证明一个实值函数是一个范数,就是需要证明这个函数满足上述3个条件。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>根据定义,显然有<span class="math">\(\Vert A\Vert_{2}=\sqrt{\lambda_{max}(A^TA)}=\sqrt{\rho(A^TA)}\)</span> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>C语言中的内存管理那些事3-类型限定词2013-12-02T00:00:00-07:002013-12-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-12-02:/programming-language/C-Memory-Management-3/<p>本文仔细分析了C语言中的各种变量的生存期、作用域及其内存管理机制</p><h1>类型限定词</h1>
<p>在本系列的<a href="http://zhouyichu.com/programming-language/C-Memory-Management-1/" title="第二篇文章">第二篇文章</a> 中,我曾经提到说,在C语言中,一个变量所包含的的属性信息并不仅仅是之前说到四种属性(<strong>类型信息</strong>、<strong>存储时期</strong>、<strong>作用域</strong>和<strong>链接</strong>),它还有着其他的属性,本文主要就是分析一下变量的这些其他属性信息:</p>
<ul>
<li><strong>不变性(constancy)</strong></li>
<li><strong>易变性(volatility)</strong></li>
</ul>
<p>这两个属性是通过关键字<code>const</code>和<code>volatile</code>来声明的,通过这两个关键字的修饰就产生了<strong>受限类型(qualified type)</strong>。</p>
<p>另外,C语言中还有第三个限定词<code>restrict</code>,这个限定词是用来进行编译器优化的。</p>
<p>最后想要说明的是,这三个类型限定词是<strong>幂等(idempotent)</strong>的,也就是说,可以在一个声明中不止一次地使用<strong>同一个</strong>限定词,多余的限定词将被忽略掉。</p>
<h1>const</h1>
<p>被<code>const</code>修饰的变量是不能通过赋值、增量或减量运算来修改该变量的值,这样的变量的值只能在声明的时候被定义,此后在任何情况下都不能被修改了。简单来说,被<code>const</code>修饰的变量就是一个<strong>常量</strong>。</p>
<p>粗略来看,C语言中的<strong>宏定义</strong>也可以作为常量来使用,对于这一点我印象比较深刻,记得当时老师讲到这一部分的时候,强调说,在程序需要用到常量时,应该尽量使用<code>const</code>而不是宏定义,这是因为宏定义只是简单的替换操作,如果在程序多次引用定义的宏的话,会在内存中出现多个具有相同值的内存空间,会造成内存浪费;而使用<code>const</code>的话,数据是保存在<strong>符号表</strong>中的,作为常量来处理,并不会占用堆栈区中的内存空间,这样就避免了多次访问内存,同时又能被多次引用了。很明显这要比使用宏定义来得优越。</p>
<h2>指针的const</h2>
<p>记得当时学习的时候,用<code>const</code>来修饰指针的时候,是最让人头晕的,因为<code>const</code>放置位置的不同,它会修饰不同的数据。</p>
<pre><code>#!c
const float * pf //pf指向一个常量浮点数数值
float * const pt //pt是一个常量指针
const float * const ptr
</code></pre>
<p>上述代码中的<code>const</code>,修饰的是不同的数据,第一行的声明,说明了指针<code>pf</code>指向的数据是一个常量,而指针<code>pf</code>本身<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>是可以改变的。与此相反的是,第二行的声明,说明了指针<code>pt</code>本身是一个常量,是不可变的,只能指向同一个内存地址,但是它所指向的内存地址中的数据却是可以改变的。 第三行的声明就比较好理解了,它说明了指针<code>ptr</code>本身是不可变的,被它所指向的地址中的数据也是不可变的。</p>
<p>另外,还有一种写法:</p>
<pre><code>:::c
float const * pfc //等同于 const float * pfc
</code></pre>
<p>上述的写法等同于<code>const float * pfc</code>。</p>
<p>每当这时候,总会觉得很混乱,<code>const</code>的不同用法该如何去记忆,其实有一条简单的规则就能搞定一切:</p>
<p><strong>位于<code>*</code>左边任意位置的<code>const</code>使得数据成为一个常量,而一个位于<code>*</code>右边的<code>const</code>使得指针自身成为一个常量。</strong></p>
<h1>volatile</h1>
<p>一般来说,编译器为了加速的程序的执行,会对程序进行一些优化操作,最常用的方式就是: <strong>将内存变量放入到寄存器中,调整指令顺序,充分使用CPU的流水线。</strong> 大部分情况下,这些优化操作是非常有效的,但是在一些少数情况下,这样的优化方法会导致程序错误,这时,就需要用<code>volatile</code>关键字来显示地告诉编译器,被<code>volatile</code>修饰的变量不需要这样的优化,<strong>每次都需要从内存中读取数据</strong></p>
<p>那么,什么样的情况下,编译器的优化操作是失效了,可以设想一下,在一个多线程的程序中,某个变量是被多个线程共享的,假设线程A引用这个变量时,这个共享变量就被加载到寄存器中缓存起来了,但是另外一个线程B却修改了其在内存中的数值,当线程A再次引用这个变量时,它引用的 是寄存器中被修改之前的数据,这就会引起程序的错误。<code>volatile</code>关键字就是告诉编译器,这个变量是"易变"的,随时可能被其他外部程序所修改,所以不应该进行寄存器缓存的优化操作。</p>
<p>被<code>volatile</code>修饰的变量每次被引用时,<strong>系统总是会到其内存地址中重新读取数据。</strong></p>
<h1>restrict</h1>
<p>关键字<code>restrict</code>主要也是用来方便编译器进行优化的,它只能使用于<strong>指针</strong>变量,并且表明该指针是访问一个数据对象<strong>唯一且初始</strong>的方式。</p>
<p>在不适用<code>restrict</code>的情况一下,一个指针指向的地址也有可能被其他指针所指向,因此编译器不能确定该快内存地址中的数据是否被改变了,也就不能进行一些优化操作。比如下面的例子:</p>
<pre><code>#!c
int ar[10];
int * restrict restar = (int *)malloc(10 * sizeof(int));
int * par = ar;
int i;
for (i = 0;i < 10;++i)
{
par[i] += 5;
restar[i] += 5;
ar[i] *= 2;
par[i] += 3;
restar[i] += 3;
}
</code></pre>
<p>在上述的代码中,<code>restar</code>被指定为访问它所指向的内存块的唯一初始方式,此时编译器就可以用同样效果的一条语句来替换关于<code>restar</code>的两条语句:</p>
<pre><code>:::c
restar[i] += 8;
</code></pre>
<p>而<code>ar</code>却无法进行这样的优化,因为指向它所指向的内存空间的指针不只一个,编译器不能保证内存块中的数据没有被修改过。使用了<code>restrict</code>关键字之后,编译器就可以放心地寻找计算的捷径了。</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>指针本身也是变量,只不过它存储的是内存地址。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>矩阵论学习笔记7-SVD奇异值分解2013-12-02T00:00:00-07:002013-12-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-12-02:/matrix-theory/Theory-of-Matrices-7/<p>矩阵论学习课程笔记</p><h1>奇异值</h1>
<p><strong>定义</strong>: 设<span class="math">\(A\in C^{m\times n}\)</span>,如果存在非负实数<span class="math">\(\sigma\)</span>和非零向量<span class="math">\(u\in C^n,v\in C^m\)</span>使得:</p>
<div class="math">$$
\begin{equation}
Au = \sigma v,A^Hv = \sigma u
\end{equation}
$$</div>
<p>则称<span class="math">\(\sigma\)</span>为<span class="math">\(A\)</span>的<strong>奇异值</strong>,<span class="math">\(u\)</span>和<span class="math">\(v\)</span>分别称为<span class="math">\(A\)</span>对应于<strong>奇异值</strong>的<strong>右奇异向量</strong>和<strong>左奇异向量</strong></p>
<p>根据上述定义,可以得到:</p>
<div class="math">$$
\begin{equation}
A^HAu = \sigma A^Hv = \sigma^2u\\
A^HAv = \sigma A^Hu = \sigma^2v
\end{equation}
$$</div>
<p>因此<span class="math">\(\sigma^2\)</span>就是<span class="math">\(A^HA\)</span>的特征值,也是<span class="math">\(AA^H\)</span>的特征值,而<span class="math">\(u\)</span>和<span class="math">\(v\)</span>分别是<span class="math">\(A^HA\)</span>和<span class="math">\(AA^H\)</span>对应于特征值<span class="math">\(\sigma^2\)</span>的特征向量。</p>
<h1>实矩阵的奇异值分解(SVD)</h1>
<p><strong>定理</strong>: 设<span class="math">\(A\in R^{m\times n},r = rank(A)\)</span>,则一定存在正交矩阵<span class="math">\(U\in R^{m\times m},V\in R^{n\times n}\)</span>和对角矩阵</p>
<div class="math">$$
\begin{equation}
\Sigma = diag(\sigma_1,\sigma_2,\cdots,\sigma_r,0,\cdots,0)\in R^{m\times n}
\end{equation}
$$</div>
<p>使得<span class="math">\(A=U\Sigma V^T\)</span></p>
<p><span class="math">\(A=U\Sigma V^T\)</span>称为矩阵<span class="math">\(A\)</span>的<strong>奇异值分解</strong>,其中<span class="math">\(\sigma_1\ge\sigma_2\ge\cdots\ge\sigma_r>0,(i=1,2,\cdots,r)\)</span>称为<span class="math">\(A\)</span>的<strong>奇异值</strong>。</p>
<h1>SVD的性质</h1>
<p><strong>性质1:</strong> <span class="math">\(A\)</span>的非零奇异值的个数<span class="math">\(r\)</span>就是A的秩</p>
<p><strong>性质2:</strong> 如果<span class="math">\(A\)</span>是<span class="math">\(n\)</span>阶方阵,则<span class="math">\(\vert det(A)\vert = \prod_{i=1}^n\sigma_i\)</span></p>
<p><strong>性质3:</strong> <span class="math">\(\sigma_1\ge\sigma_2\ge\cdots\ge\sigma_r\)</span>,是<span class="math">\(A^TA\)</span>或<span class="math">\(AA^T\)</span>的特征值的开方</p>
<p><strong>性质4:</strong> 设<span class="math">\(U=[u_1,u_2,\cdots,u_m]\)</span>,<span class="math">\(V=[v_1,v_2,\cdots,v_n]\)</span>,则<span class="math">\(u_1u_2\cdots u_m\)</span>是<span class="math">\(AA^T\)</span>的特征向量,<span class="math">\(v_1v_2\cdots v_n\)</span>是<span class="math">\(A^TA\)</span>的特征向量</p>
<p><strong>性质5:</strong> <span class="math">\(A\)</span>可以表示成<span class="math">\(r\)</span>个秩为1的矩阵的和。</p>
<div class="math">$$
\begin{equation}
A = U\Sigma V^T = U_r\Sigma_rV_t^T = \sigma_1u_1v_1^T+\sigma_2u_2v_2^T\cdots+\sigma_ru_rv_r^T
\end{equation}
$$</div>
<p>这是A的<strong>奇异值分解的紧凑形式</strong></p>
<h1>总结</h1>
<p>其实和<strong>SVD</strong>有关的数学内容是非常多的,这里只是简单记录了一下<strong>奇异值分解</strong>在数学上的相关定义,还有很多内容没有这里没有给出。</p>
<p><strong>奇异值分解</strong>在矩阵论中是一个非常重要的概念,在很多工程问题中都需要用到SVD,以后可能会单独写一些关于<strong>SVD</strong>具体应用的博文。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>C语言中的内存管理那些事2-内存分配2013-12-01T00:00:00-07:002013-12-01T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-12-01:/programming-language/C-Memory-Management-2/<p>本文仔细分析了C语言中的各种变量的生存期、作用域及其内存管理机制</p><h1>内存分配</h1>
<p>在<a href="http://zhouyichu.com/programming-language/C-Memory-Management-1/" title="上一篇文章">上一篇文章</a>我们分析了C语言中的五种<strong>存储类(Storage Class)</strong>,其实五种不同的<strong>存储类(Storage Class)</strong> 就代表着C语言中五种不同的内存管理规则,除了这五种"内置"的内存管理规则,C语言还允许由程序员来管理内存,而不是采用这种预先规定好的内存规则,这给程序员带来了很大的自由度,使得程序员能够直接操纵内存的分配和管理。</p>
<p>但是C语言中的这种高度自由也有着隐患,一旦程序员在内存管理上出现了问题,那么整个程序就会出现问题,所以在对内存进行管理的时候,要尤其小心。</p>
<p>通常情况下,每当定义一个变量(只可能是五种<strong>存储类</strong>中的一种),系统就会为这个变量分配内存空间,同时用这个变量名来标识内存中的数据,这个变量所占用的空间是由系统来维护的,你不需要在意它是否被回收(事实上它一定会在某个时间点被回收)。</p>
<p>除了上述由系统维护的内存,C语言还可以直接申请和管理内存,主要是通过<code>malloc</code>和<code>free</code>库函数来完成的。</p>
<h1>malloc函数</h1>
<p>malloc函数的原型为:</p>
<pre><code>:::c
void *malloc(long NumBytes);
</code></pre>
<p><code>malloc</code>函数的参数<code>NumBytes</code>指明了向系统请求的内存字节数,<code>malloc</code>函数接受参数之后,会自动在内存中寻找一块满足申请大小的连续区域块,但是由于并没有一个变量来标识这块内存块,因此<code>malloc</code>找到合适的内存块之后,就会返回这块内存块的起始地址,也即第一个字节的地址。因此,需要一个指针类型的变量来接受(存储)这个内存块的起始地址。</p>
<p>在上述的函数原型中,可以看到,<code>malloc</code>函数返回值的类型是一个<code>void</code>类型的指针,这是因为C语言它并不知道申请的这片内存将会用来做什么,它不能确定其类型信息,而<code>void</code>类型的指针<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>可以通过<strong>强制类型转换</strong>将其转成任意类型的指针,这就能够避免不必要的类型转换问题了。</p>
<p>通常在实际使用的时候,都会显示地对<code>void</code>指针进行类型转换,以增加程序的可读性,如下所示:</p>
<pre><code>:::c
double * ptd;
ptd = (double *)malloc(30 * sizeof(double))
</code></pre>
<p>上述代码中的<strong>强制类型转换</strong><code>(double *)</code>在C语言中并不是必须的,但是在C++ 中却是必须的,因此使用显式的<strong>强制类型转换</strong>,既可以增加程序的可读性,还使得程序移植到C++ 更容易。</p>
<p>如果<code>malloc</code>没有找到合适的内存块,则将会返回一个空指针。</p>
<p>需要注意的是,由<code>malloc</code>分配的内存空间是不遵循之前分析的五种<strong>存储类(Storage Class)</strong>的内存管理规则的,一旦通过<code>malloc</code>分配得到了内存空间,这段内存空间除非通过<code>free</code>函数进行释放,否则这段内存空间将会一直被占用。但是,用来存储这段内存空间的首地址的指针却是一个普通的变量,这个指针变量必定属于五种<strong>存储类(Storage Class)</strong>中的一种,因此如果在函数内部使用<code>malloc</code>函数分配得到了一片内存空间,它的首地址存放在指针变量<code>ptd</code>中,此时,如果程序员忘记在函数结束前用<code>free</code>函数释放这一段内存空间且<code>ptd</code>是属于的<strong>自动存储类</strong>的话,那么函数一旦结束,<code>ptd</code>变量也就消失了,但是之前申请的那段内存空间还是存在的,一直处于被占用的状态,而<code>ptd</code>变量存储的是那块内存空间的首地址,因此<code>ptd</code>一旦消失,我们就"丢失"了那段内存空间,虽然它一直存在,但是我们永远不能访问到它了,因为我们已经丢失了这段内存的首地址。这就是所谓的<strong>内存泄露</strong>。</p>
<h1>free函数</h1>
<p>一般来说,对应于每个<code>malloc</code>函数的调用,都应该调用一次<code>free</code>函数来将其占用的内存空间释放掉。</p>
<p><code>free</code>函数的原型为:</p>
<pre><code>:::c
void free(void *FirstByte)
</code></pre>
<p><code>free</code>接受一个指针参数,这个指针指向了需要被释放的内存空间的首地址。</p>
<p>需要注意的是,<code>free</code>函数释放的是参数指针指向的<strong>内存空间而不是指针变量本身</strong>,因此,调用了<code>free</code>函数之后,原来的指针还是指向着原来的内存空间的首地址,但此时内存中的数据是未定义的,是垃圾数据,因此,在实践中一个比较好的习惯是,将已经被释放了空间的指针赋值为<code>NULL</code>,防止引用到错误的内存空间。</p>
<h1>calloc函数</h1>
<p><code>calloc</code>函数也是用来申请内存空间的,函数原型为:</p>
<pre><code>:::c
void *calloc(unsigned n, unsigned size);
</code></pre>
<p>它的功能几乎和<code>malloc</code>函数一样,但是细节部分有所不同:它接受两个参数<code>n</code>和<code>size</code>,分别代表所需要内存单元的数目和每个单元以字节计的大小。另外它和<code>malloc</code>还有一个区别是,<code>calloc</code>会自动为申请的内存空间自动填充为0,而<code>malloc</code>不会,<code>malloc</code>申请得到的内存空间中都是一些垃圾数据。</p>
<h1>总结</h1>
<p>之前分析过的五种<strong>存储类(Storage Class)</strong>再加上我们今天分析的<code>malloc</code>函数,也许有人会被搞糊涂了,这里我们总结一下C语言中的内存模型,我们可以将程序的可用内存分成三个独立的部分:</p>
<ol>
<li>具有静态存储时期的变量空间,所有具有静态存储时期的变量都属于这部分空间,这些变量从定义开始就一直存在,直到程序结束。</li>
<li>自动变量存在的变量空间(<strong>栈空间</strong>),<strong>栈空间</strong>中的变量都是定义在代码块中的,当代码块结束时,变量也就被清除。C语言是用一个栈结构来管理这些变量,所以当消除自动变量时,是按照定义这些变量的顺序的反序进行的。</li>
<li>动态分配的内存空间(<strong>堆空间</strong>),<strong>堆空间</strong>是提供给<code>malloc</code>函数使用的,所有通过<code>malloc</code>获得的内存空间都是来自这一部分,只有当调用<code>free</code>函数时,这部分内存才会被释放,否则将会一直存在。</li>
</ol>
<p>尽管<code>malloc</code>和<code>free</code>函数给程序员在内存管理上带来的极大的便利,但它还是存在隐患的,这里的隐患并不是指之前提到的<strong>内存泄露</strong>,<strong>内存泄露</strong>是由于程序员的粗心大意才导致的,是程序上的错误,但是我这里想说的隐患其实是程序员无法控制的。这个隐患就是,当大量使用<code>malloc</code>和<code>free</code>函数之后,堆内存空间中会产生大量碎片区域,当你下一次申请的内存空间大小大于每一个碎片的大小,但是又小于这些碎片的总和时,即使内存中总的空闲空间是足够的,但是你并不能获得这些空间,因为这些空间是呈碎片状分布在内存中的,这就造成了内存空间的极大浪费。</p>
<p>解决内存碎片的技巧有很多,但是都不能完全解决这个问题,只能在很大程度上缓解这个问题。比较常用的方式是,在程序一开始就申请一块很大的空间,这个空间称为<strong>内存池</strong>,之后程序中所有需要的内存空间都从这个<strong>内存池</strong>中获取,这就在很大程度上避免了多次的<code>malloc</code>和<code>free</code>,这也使得内存碎片出现的概率降低了。但是这种技巧需要很强的内存操纵经验,一不小心就会出现内存错误。</p>
<h1>参考资料</h1>
<ul>
<li>《C Primer Plus》</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><code>void</code>类型的指针可以理解为一种"通用指针" <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>C语言中的内存管理那些事1-存储类2013-11-30T23:30:20-07:002013-11-30T23:30:20-07:00Flyawaytag:zhouyichu.com,2013-11-30:/programming-language/C-Memory-Management-1/<p>本文仔细分析了C语言中的各种变量的生存期、作用域及其内存管理机制</p><h1>存储类(storage class)</h1>
<p><a href="http://zhouyichu.com/programming-language/C-Memory-Management-0/" title="上一篇文章">上一篇文章</a> 中,分析了C语言中一个变量所具有的属性,这里再强调一下,一个变量的属性不仅仅是它的类型信息,一个变量应该具有的属性如下所示(需要注意的是,其实这里列出的属性并不完整,一个变量还有一些其他的属性信息,但是一个变量的存储模型主要是以下面这几个属性决定的,所以这里暂时先讨论这几个属性,其他的属性信息将在以后的文章中分析):</p>
<ul>
<li><strong>类型</strong></li>
<li><strong>存储时期</strong></li>
<li><strong>作用域</strong></li>
<li><strong>链接</strong></li>
</ul>
<p>这些属性的不同组合方式形成了变量的不同的<strong>存储模型(Storage Models)</strong>或称为<strong>存储类(Storage Class)</strong>,C语言中一共有5种合法的不同<strong>存储类</strong>,如下图所示:</p>
<p><img alt="存储类" src="http://zhouyichu.com/images/storage-class.png"/></p>
<h1>自动变量</h1>
<p><strong>自动存储类</strong>变量的具有的属性是:</p>
<ul>
<li><strong>自动存储时期</strong></li>
<li><strong>代码块作用域</strong></li>
<li><strong>空链接</strong></li>
</ul>
<p>默认情况下,在代码块或函数中定义的任意变量都属于自动存储类的变量,也可以使用<code>auto</code>来显示的说明一个变量是<strong>自动存储类</strong>的变量。</p>
<p><strong>自动存储类</strong>的变量可以理解为局部变量,只有程序执行到代码块内的定义时,变量才会被分配空间,当程序离开代码块时,分配的空间会被回收,变量也就消失了。</p>
<p>关于<strong>自动存储类</strong>变量,唯一需要注意的是,<strong>必须显示的进行初始化,否则变量的初始值可能是任意值。</strong></p>
<h1>寄存器变量</h1>
<p><strong>寄存器类</strong>变量具有的属性几乎和<strong>自动存储类</strong>是一样的:</p>
<ul>
<li><strong>自动存储时期</strong></li>
<li><strong>代码块作用域</strong></li>
<li><strong>空链接</strong></li>
</ul>
<p>它和<strong>自动存储类</strong>在形式上唯一的区别是<strong>寄存器类</strong>变量是用关键字<code>register</code>修饰的,如下所示</p>
<pre><code>:::c
int main(void)
{
register int quick;
}
</code></pre>
<p><strong>寄存器类</strong>变量其实是一种优化方式,它声明了一个请求,请求编译器将这个变量存放在寄存器中,从而加速这个变量的访问速度,对于一些高频访问的变量来说,这是很有用的优化方案。</p>
<p>但是,需要注意的是,<code>register</code>仅仅是一个请求而已,编译器需要根据当时上下文的情况决定是否将这个变量放入寄存器,因此,当这个变量没有被放入到寄存器中时,它和<strong>自动存储类</strong>具有相同的属性信息。但是,由于它被声明为一个<strong>寄存器类</strong>变量,寄存器是没有地址,<strong>因此不管是否真的被加载到寄存器中,都不能对寄存器类变量使用地址运算符。</strong></p>
<h1>具有代码块作用域的静态变量</h1>
<p>这里的"静态"是指变量的存储时期是<strong>静态存储时期</strong>的,这类变量具有如下的属性:</p>
<ul>
<li><strong>静态存储时期</strong></li>
<li><strong>代码块作用域</strong></li>
<li><strong>空链接</strong></li>
</ul>
<p>之前说过,在默认情况下,代码块或函数中定义的变量都是属于<strong>自动存储类</strong>的变量,这里就出现了非默认情况,当一个<strong>自动存储类</strong>的变量被关键字<code>static</code>修饰的时候,这个变量就具有了<strong>静态存储时期</strong>,但仍然保持<strong>代码块作用域</strong>和<strong>空链接</strong>的属性。</p>
<p><a href="http://zhouyichu.com/programming-language/C-Memory-Management-0/" title="上一篇文章">上一篇文章</a>中曾经提到<code>static</code>第一种用法,这里是它的第二种用法,这里在对一个具有<strong>代码块作用域</strong>的变量用<code>static</code>修饰的时候,<code>static</code>改变的是这个变量的<strong>存储时期</strong>。</p>
<pre><code>:::c
void trystat(void)
{
int fade = 1;
static int stay = 1;
printf("fade= %d and stay = %d\n",fade++,stay++);
}
</code></pre>
<p>在上述代码中,<code>trystat</code>每次执行的时候,都会重新分配一块内存给<code>fade</code>变量,同时将其初始化为1,但是对于<code>stay</code>来说,它在一旦被创建,之后就永远不会被回收,之后每一次运行<code>trystat</code>函数,都不会为<code>stay</code>重新分配新的内存空间,因为它一直就存在着,它所占用的空间从没被回收过(<strong>静态存储时期</strong>的作用),但是这个<code>stay</code>变量只能在<code>trystat</code>函数中被访问 (<strong>代码块作用域</strong>的作用)。</p>
<p>最后需要注意的是,其实<code>static int stay = 1;</code>这一句代码并不是在函数执行时被运行的,它并不是函数的一部分,当程序进入函数时,<code>stay</code>就已经就位了,把这个语句放在函数中,只是为了告诉编译器,它的<strong>代码作用域</strong>只存在于<code>trystat</code>函数中。</p>
<h1>具有外部链接的静态变量</h1>
<p>具有文件作用域的变量自动(也是必须)具有静态存储时期,但是却可以有用不同的链接。</p>
<p><strong>具有外部链接的静态变量</strong>(也称为<strong>外部存储类</strong>)具有如下的属性:</p>
<ul>
<li><strong>静态存储时期</strong></li>
<li><strong>文件作用域</strong></li>
<li><strong>外部链接</strong></li>
</ul>
<p>把一个变量的定义放在所有函数之外,就创建了一个<strong>外部存储类</strong>变量,为了是程序更加清晰,可以在使用<strong>外部存储类</strong>变量的函数中通过<code>extern</code>关键字来再次声明它。如果变量是在别的文件中定义的,那就必须使用<code>extern</code>来声明该变量。如下面代码所示:</p>
<pre><code>:::c
int Errupt; //外部存储类的变量
double Up[100]; //外部存储类的变量
extern char Coal; //必须声明,说明Coal的定义是在其他文件中
void next(void);
int main(void)
{
extern in Errupt; //可选声明
extern double Up[]; //可选声明
...
}
void next(void)
{
...
}
</code></pre>
<p>需要注意的是,如果没有对一个<strong>外部存储类</strong>的变量进行初始化的话,它将会自动被赋值为0,这一点和<strong>自动存储类</strong>的变量是不同的,而且如果要对一个<strong>外部存储类的变量</strong>进行初始化,那么只能使用常量来初始化,而不能是一个变量。</p>
<pre><code>:::c
int x = 10; //正确
int y = 3 + 20 //正确
size_t z = sizeof(int); //正确
int x2 = 2 * x; //不正确,x是一个变量
</code></pre>
<h1>具有内部链接的静态变量</h1>
<p>这一类的<strong>存储类</strong>具有如下的属性:</p>
<ul>
<li><strong>静态存储时期</strong></li>
<li><strong>文件作用域</strong></li>
<li><strong>内部链接</strong></li>
</ul>
<p>一个<strong>具有内部链接的静态变量</strong>是通过<code>static</code>变量进行声明的,当一个具有<strong>文件作用域</strong>的变量被使用<code>static</code>修饰时,这个变量就具有了内部链接,此处<code>static</code>关键字改变是变量的链接属性信息。</p>
<p>普通的<strong>外部存储类</strong>的变量可以被程序中任一文件中所包含的函数使用,而具有<strong>内部链接的静态变量</strong>只可以被与它在同一个文件中的函数所使用。</p>
<h1>存储类说明符</h1>
<p>C语言中一共有5个作为存储类说明符的关键字,它们是:</p>
<ul>
<li><code>auto</code></li>
<li><code>register</code></li>
<li><code>static</code></li>
<li><code>extern</code></li>
<li><code>typedef</code></li>
</ul>
<p>其中,关键字<code>typedef</code>与内存存储无关,只是语法的原因被归入此类。需要注意的是,<strong>这些说明符是不能同时出现在一个声明中的</strong></p>
<p>说明符<code>auto</code>表明一个变量具有<strong>自动存储时期</strong>,只能作用于具有<strong>代码块作用域</strong>的变量,由于具有<strong>代码块作用域</strong>的变量默认都是<strong>自动存储时期</strong>的,因此这个关键字主要是用来明确程序员的意图的。</p>
<p>说明符<code>register</code>也只能用于具有<strong>代码块作用域</strong>的变量。它建议编译器将该变量归入寄存器。</p>
<p>说明符<code>static</code>比较复杂,它的作用根据上下文有所不同,如果它作用的变量具有<strong>代码块作用域</strong>,则被它作用的变量将会具有<strong>静态存储时期</strong>,改变的是变量的<strong>存储时期</strong>;如果被它作用的变量具有<strong>文件作用域</strong>,那么被它作用的变量将具有内部的链接,此时它改变的是变量的<strong>链接属性</strong>。</p>
<p>说明符<code>extern</code>表明这是一个引用声明,具体的变量定义在其他文件中。</p>
<h1>参考资料</h1>
<ul>
<li>《C Primer Plus》</li>
</ul>C语言中的内存管理那些事0-基本概念2013-11-30T00:00:00-07:002013-11-30T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-11-30:/programming-language/C-Memory-Management-0/<p>本文仔细分析了C语言中的各种变量的生存期、作用域及其内存管理机制</p><h1>前言</h1>
<p>最近一直在看Python的源码剖析,Python源码是用C写的,在阅读源码过程中,发现Guido van Rossum大量使用了C语言中的<strong>宏定义</strong>、<strong>static</strong>、<strong>extern</strong>、<strong>register</strong>等关键字,虽然可以说C语言是我的第一门编程语言,但是那也是一件挺久远的事情了,很多基本概念已经模糊了,这个几个关键字大体知道是干什么的,但是具体细节已经不记得了。为了能够更好地分析Python源代码,于是翻出了那本已经蒙上一层灰的《C Primer Plus》,找到内存管理的那一章,又好好啃了一遍,再加上网上的一些分析文章,现在将学习到的内容记录下来,防止又被遗忘了。</p>
<h1>需要明确的几个概念</h1>
<p>关于编程语言中的变量,首先重要的当然是它的类型,不管是像Python、Ruby这种的动态弱类型脚本语言还是像C\C++、Java这种强类型语言,每一个变量都是有类型的,差别只是在于:</p>
<p>是在<strong>编译时</strong>进行类型检查还是在<strong>运行时</strong>进行类型检查。</p>
<p>所以,对于任何一个变量来说,类型信息可以理解成是它的属性信息,但是,需要强调的一点是:<strong>类型信息并不是变量的唯一属性信息</strong>,尤其是在C\C++语言中,一个变量还有很多其他信息,包括:</p>
<ul>
<li><strong>存储时期(storage duration)</strong></li>
<li><strong>作用域(scope)</strong></li>
<li><strong>链接(linkpage)</strong></li>
</ul>
<p>虽然这几个概念在不同的语言中可能实现的方式不同,但是基本思想应该还是一致的。由于C语言是可以直接操控内存的,所以这几个概念尤为重要。</p>
<h1>存储时期(sotrage duration)</h1>
<p>《C Primer Plus》中的原文是如此描述的:</p>
<blockquote>
<p>in terms of its sotrage duration, which is how long it stays in memory.</p>
</blockquote>
<p>看定义是非常好理解的,<strong>存储时期(storage duration)</strong>就是指变量在内存中的保留时间,需要注意的是,<strong>变量在内存中存在,并不代表你就可以访问它</strong>。</p>
<p><strong>存储时期(storage duration)</strong>一共分为两种情况,分别是</p>
<ul>
<li><strong>静态存储时期(static storage duration)</strong>:在程序执行过程中一直存在,通常来说,任何不在代码块内定义的变量都具有静态存储时期,但是并不是任何的具有静态存储时期的变量都不在代码块内,比如<code>malloc</code>申请的内存块和<code>static</code>关键字,<code>malloc</code>可以出现在任何位置,<code>malloc</code>函数后面会深入分析。</li>
<li><strong>自动存储时期(automatic storage duration)</strong>:除了静态存储时期以外的变量都是自动存储时期的,这有点废话……其实,可以理解成只要是在代码块内定义的变量<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>都是自动存储时期的,当程序执行到该代码块时,内存会为其变量分配内存,当程序执行完成当前代码块以后,分配的内存就将被释放。这些自动存储时期的变量的生命周期只存在与这段代码块之中。</li>
</ul>
<h1>作用域(scope)</h1>
<p>《C Primer Plus》中的原文:</p>
<blockquote>
<p>Scope describes the region or regions of a program that can access an identifier.\
Its scope and its linkpage,which together indicate which parts of a program can use it by name.</p>
</blockquote>
<p><strong>作用域(scope)</strong>,简单来说,就是指<strong>变量在程序的哪些部分可以被引用。</strong></p>
<p>这里需要和存储时期的概念区分开来,存储时期用来表示<strong>变量在内存中的存在时间</strong>,而作用域用来表示<strong>变量可以被引用的范围</strong>。</p>
<p>在C语言中,一共有3种作用域:</p>
<ul>
<li><strong>代码块作用域(block scope)</strong>: 所有在一对花括号之间出现的代码都是一个代码块,在代码块中的定义的变量都具有代码块作用域。从这个变量定义地方开始,到这个代码块结束,该变量均是可见的。需要注意的,函数的<strong>形式参数</strong>也是具有代码块作用域的。</li>
<li><strong>函数原型作用域(function prototype scope)</strong>: 出现在函数原型中的变量,都具有函数原型作用域,函数原型作用域从变量定义处一直到原型申明的末尾。</li>
<li><strong>文件作用域(file scope)</strong>: 一个在所有函数之外定义的变量具有文件作用域,具有文件作用域的变量从它的定义处到包含该定义的文件结尾处都是可见的。</li>
</ul>
<h1>链接(linkpage)</h1>
<p>链接也是用来表示<strong>变量可以被引用的范围</strong>的,链接和作用域的共同作用下,决定了一个变量可以被引用的范围。链接的主要作用是在程序具有多个文件时,可以实现跨文件共享变量。</p>
<p>C语言中一共有三种不同的链接:</p>
<ul>
<li><strong>外部链接(external linkpage)</strong>: 具有外部链接的变量可以在多文件的程序中任何位置使用。</li>
<li><strong>内部链接(internal linkpage)</strong>: 具有内部链接的变量可以在定义它的文件中的任何位置使用。</li>
<li><strong>空链接(no linkpage)</strong>: 只是被当前代码块所私有,不能被程序的其他部分所引用。</li>
</ul>
<p>具有代码作用域和函数原型作用域的变量都具有空链接,因为它们是由其所在的代码块或函数原型所私有的。</p>
<p>具有文件作用域的变量可以是外部链接也可以是内部链接,通过关键字<code>static</code><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>来指明。</p>
<pre><code>:::c
int giants = 5; //文件作用域,外部链接
static int dodgers = 3; //文件作用于 内部链接
int main()
{
...
}
...
</code></pre>
<p>上述的代码定义了两个具有<strong>静态存储时期</strong>、<strong>文件作用域</strong>的变量的,所不同的是<code>giants</code>没有用<code>static</code>来修饰,因此具有<strong>外部链接</strong>,而<code>dodgers</code>通过<code>static</code>的修饰,具有了<strong>内部链接</strong>。可以看到,具有文件作用域的变量默认是<strong>外部链接</strong>。</p>
<p>对上述代码所在文件来说,<code>giants</code>和<code>dodgers</code>在该文件内部的任何位置都是可见的,但是对于其他文件来说, 具<strong>内部链接</strong>的<code>dodgers</code>是不可见的,而具有<strong>外部链接</strong>的<code>giants</code>却是可见的,只要在需要引用这个变量的外部文件中存在以下的声明:</p>
<pre><code>:::c
extern int giants
</code></pre>
<p>上述代码中的<code>extern</code>关键字告诉编译器,这不是一个定义,而只是一个<strong>声明</strong>,它告诉编译器这个变量是在其他文件中的。注意:<strong>不要用<code>extern</code>关键字进行外部定义,它只是用来引用一个已经存在的外部定义。</strong><sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup></p>
<p>关键字<code>extern</code>只是一个引用申明,而不是定义申明。</p>
<h1>总结</h1>
<p>从上述说明可以看到,在C语言中,一个变量的属性信息不仅仅是其<strong>类型</strong>,还包括了<strong>存储时期</strong>、<strong>作用域</strong>和<strong>链接</strong>。这些属性的不同组合方式呈现了变量的不同表现,这些属性的不同组合是如何决定变量的表现的将会在一篇文章中说明。</p>
<h1>参考资料</h1>
<ul>
<li>《C Primer Plus》</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实这里这么说,有些不太准确,因为在一个代码块内,可以通过<code>static</code>关键字来申明一个具有静态存储时期但是却是在代码块内定义的变量。<code>static</code>关键字后面会进行说明。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这里是<code>static</code>的第一个用法,它改变了变量的链接,后面还会看到<code>static</code>的第二种用法,用来改变变量的存储时期。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>以前常犯这个错误,像<code>extern int giants=1</code>的代码是错误的。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>矩阵论学习笔记6-矩阵分解2013-11-25T00:00:00-07:002013-11-25T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-11-25:/matrix-theory/Theory-of-Matrices-6/<p>矩阵论学习课程笔记</p><h1>初等矩阵</h1>
<p><strong>定义</strong>: 设<span class="math">\(u,v\in C^n\)</span>,<span class="math">\(\sigma\)</span>为一复数,形式为<span class="math">\(E(u,v,\sigma)=I-\sigma uv^H\)</span>的矩阵,称为初等矩阵。</p>
<p>第一次看到这个定义的时候,有点蒙……仔细研究了一下,觉得这里有几点需要强调一下:</p>
<ul>
<li>这的<span class="math">\(C\)</span>是复数域符号,以前不太接触复数域,所以一上来这个符号有点没反应过来,所以<span class="math">\(C^n\)</span>是指复数域上的向量</li>
<li><span class="math">\(H\)</span>是复数域上的一种矩阵运算符号,称为<a href="http://zh.wikipedia.org/wiki/%E5%85%B1%E8%BD%AD%E8%BD%AC%E7%BD%AE">共轭转置</a>,在实数域中就可以被认为是转置操作(<span class="math">\(T\)</span>)</li>
</ul>
<h2>初等矩阵的性质</h2>
<ol>
<li><span class="math">\(det(E(u,v,\sigma))=1-\sigma v^Hu\)</span></li>
<li>如果<span class="math">\(\sigma V^Hu\neq 1\)</span>,则<span class="math">\(E(u,v,\sigma)\)</span>可逆,并且其逆矩阵也是初等矩阵<span class="math">\(E(u,v,\sigma)^{-1}=E(u,v,\tau)\)</span>,其中<span class="math">\(\tau = \frac{\sigma}{\sigma v^Hu-1}\)</span></li>
<li>对任意的非零向量<span class="math">\(a,b\in C^n\)</span>,可适当选取<span class="math">\(u,v\)</span>和<span class="math">\(\sigma\)</span>使得<span class="math">\(E(u,v,\sigma)a=b\)</span></li>
</ol>
<h2>两种比较重要的初等矩阵</h2>
<p><strong>初等下三角矩阵</strong></p>
<p>令<span class="math">\(u=l_i=(0,\cdots,0,l_{i+1,i},\cdots,l_{ni})\)</span>,<span class="math">\(v=e_i\)</span>,<span class="math">\(\sigma=1\)</span>则<span class="math">\(L_i=L_i(l_i)=E(l_i,e_i,1)\)</span>称为<strong>初等下三角矩阵</strong>,即</p>
<div class="math">$$
\begin{equation}
L_i=L_i(l_i)=I-l_ie_i^T=
\begin{bmatrix}
1 & & & & & & 0 \\
& \ddots & & & \\
& & 1 & \\
& & -l_{i+1,i} & 1 \\
& & \vdots & & \ddots\\
0 & & \vdots & 0 & & \ddots\\
& & -l_{n,i} & & & & 1
\end{bmatrix}
\end{equation}
$$</div>
<p>其中<span class="math">\(e_i=(\underbrace{0,\cdots,1}_\text{i},0,\cdots,0)\)</span></p>
<p><strong>HouseHolder变换</strong></p>
<p>在初等矩阵<span class="math">\(E(u,v,\sigma)=I-\sigma uv^t\)</span>中取<span class="math">\(u=v=\omega,\sigma=2\)</span>,并且<span class="math">\(\omega\)</span>是单位向量,即<span class="math">\(\Vert\omega\Vert=1\)</span>,初等矩阵</p>
<div class="math">$$
\begin{equation}
H(\omega)=E(\omega,\omega,2)=I-2\omega\omega^H
\end{equation}
$$</div>
<p>称为<strong>HouseHolder矩阵</strong>或<strong>初等Hermit矩阵</strong></p>
<p><strong>HouseHolder矩阵的性质</strong></p>
<ol>
<li>HouseHolder矩阵是对称的</li>
<li>HouseHolder矩阵是正交矩阵</li>
<li>HouseHolder矩阵的保范性,即对向量<span class="math">\(x,y\)</span>,总有<span class="math">\((Hx,Hy)=(x,y)\)</span>(<strong>不改变内积</strong>)</li>
</ol>
<p><strong>定理</strong>: 设向量<span class="math">\(x\)</span>和<span class="math">\(y\)</span>满足<span class="math">\(\Vert x\Vert=\Vert y\Vert\)</span>,于是取向量<span class="math">\(\omega=y-x\)</span>,构造HouseHolder矩阵{% math %}H=I-2\omega\omega^T/\omega^T\omega{% endmath %},就能使得<span class="math">\(Hx=y\)</span></p>
<p><strong>HouseHolder变换的一个基本作用是使被选定的矩阵或向量的某些元素消为零。HouseHolder矩阵能在保持向量二范数和内积不变的情况,将一些元素消成零。</strong></p>
<h1>矩阵的满秩分解</h1>
<p><strong>满秩分解定理</strong>: 设<span class="math">\(m\times n\)</span>矩阵<span class="math">\(A\)</span>的秩为<span class="math">\(r>0\)</span>,则存在<span class="math">\(m\times r\)</span>矩阵<span class="math">\(B\)</span>和<span class="math">\(r\times n\)</span>矩阵<span class="math">\(C\)</span>使得</p>
<div class="math">$$
\begin{equation}
A=BC
\end{equation}
$$</div>
<p>并且<span class="math">\(rank(B)=rank(C)=r\)</span></p>
<p>证明:</p>
<p>假设<span class="math">\(A\in R^{m\times n}\)</span>,且<span class="math">\(rank(A)=r\le\min(m,n)\)</span>,则总存在<span class="math">\(m\)</span>阶矩阵<span class="math">\(P\)</span>和<span class="math">\(n\)</span>阶矩阵<span class="math">\(Q\)</span>,使得<span class="math">\(A=P<div class="math">\begin{bmatrix}I_r & 0 \\\\ 0 & 0\end{bmatrix}</div>Q\)</span></p>
<p>又因为<span class="math">\(<div class="math">\begin{bmatrix}I_r & 0 \\\\ 0 & 0\end{bmatrix}</div>=<div class="math">\begin{bmatrix}I_r \\\\ 0\end{bmatrix}</div><div class="math">\begin{bmatrix}I_r 0\end{bmatrix}</div>\)</span></p>
<p>所以令<span class="math">\(B=P<div class="math">\begin{bmatrix}I_r \\\\ 0\end{bmatrix}</div>\)</span>,<span class="math">\(C=<div class="math">\begin{bmatrix}I_r 0\end{bmatrix}</div>Q\)</span></p>
<p>即<span class="math">\(A=BC\)</span></p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>矩阵论学习笔记5-特征值与特征向量2013-10-28T00:00:00-06:002013-10-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-10-28:/matrix-theory/Theory-of-Matrices-5/<p>矩阵论学习课程笔记</p><h1>特征值和特征向量之间的关系</h1>
<p><a href="http://zhouyichu.com/matrix-theory/Theory-of-Matrices-4/" title="上一篇">上一篇</a>的矩阵论笔记中,说明了如何计算一个<strong>线性变换</strong>的特征向量和特征值,今天主要是记录特征值和特征向量之间的关系。</p>
<p>首先根据<a href="http://zh.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86">代数基本定理</a>:<strong>n次代数方程在复数域内有且仅有n个根</strong>,因此n阶矩阵A在复数域内有且仅有n个特征值。设<span class="math">\(\lambda_1,\lambda_2,\cdots,\lambda_r\)</span>是A的相异特征值,他们的重数分别为<span class="math">\(m_1,m_2,\cdots,m_r\)</span>,则称<span class="math">\(m_i\)</span>是<span class="math">\(\lambda_i\)</span>的<strong>代数重数</strong>。很显然,对于<strong>代数重数</strong>来说,一定满足<span class="math">\(\sum_{i=1}^r m_i=n\)</span></p>
<p>对于线性空间<span class="math">\(V\)</span>上线性变换<span class="math">\(T\)</span>,属于特征值<span class="math">\(\lambda_i\)</span>的全部特征向量再加上零向量所组成的集合,记为<span class="math">\(V_{\lambda_i}\)</span>,即</p>
<div class="math">$$
\begin{equation}
V_{\lambda_i} = \{\alpha \big| T(\alpha) = \lambda_i\alpha, \alpha \in V\}
\end{equation}
$$</div>
<p>对于矩阵<span class="math">\(A\in C^{n\times n}\)</span>,<span class="math">\(\lambda_i\)</span>是<span class="math">\(A\)</span>的一个特征值,也记为<span class="math">\(V_{\lambda_i}\)</span>:</p>
<div class="math">$$
\begin{equation}
V_{\lambda_i} = \{x \big| Ax = \lambda_ix, x \in C^n \}
\end{equation}
$$</div>
<p>则<span class="math">\(V_{\lambda_i}\)</span>是<span class="math">\(C^{n\times n}\)</span>的一个子空间,称<span class="math">\(V_{\lambda_i}\)</span>是矩阵<span class="math">\(A\)</span><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>的对应于<span class="math">\(\lambda_i\)</span>的<strong>特征子空间</strong></p>
<p>显然<strong>特征子空间</strong>的维数<span class="math">\(dim(V_{\lambda_i})\)</span>就是对应<span class="math">\(\lambda_i\)</span>的线性无关特征向量的最大个数,我们称<span class="math">\(dim(V_{\lambda_i})\)</span>为特征值<span class="math">\(\lambda_i\)</span>的<strong>几何重数</strong></p>
<p>关于<span class="math">\(\lambda_i\)</span>的<strong>代数重数</strong>和<strong>几何重数</strong>的关系有如下定理:</p>
<ol>
<li>矩阵<span class="math">\(A\)</span>的任一特征值的几何重数不大于它的代数重数</li>
<li>如果<span class="math">\(\lambda\_0\)</span>的代数重数是1,则它的几何重数<span class="math">\(dim(V_{\lambda\_0})=1\)</span></li>
</ol>
<h1>相异特征值对应的特征向量之间的关系</h1>
<p><strong>定理</strong>: 设<span class="math">\(\lambda_i\)</span>,<span class="math">\(\lambda_j\)</span>是矩阵<span class="math">\(A\)</span>的两个互异特征值,<span class="math">\(x_i\)</span>,<span class="math">\(x_j\)</span>是对应的特征向量,则<span class="math">\(x_i\)</span>,<span class="math">\(x_j\)</span>是线性无关的。</p>
<p><strong>证明</strong>: 设有<span class="math">\(k_1 x_i + k_2 x_j = 0\)</span>,等式两边同时右乘<span class="math">\((\lambda_{i}I-A)\)</span>,得到<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>:<span class="math">\(k_2(\lambda_iI-A)x_j=0\Rightarrow k_2(\lambda_i-\lambda_j)x\_j=0\)</span><sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>.又因为<span class="math">\(\lambda_i\neq\lambda_j\)</span>,<span class="math">\(x_j\neq 0\)</span>,所以<span class="math">\(k_2=0\)</span>,同理推得<span class="math">\(k_i=0\)</span>,所以<span class="math">\(x_i\)</span>和<span class="math">\(x_j\)</span>是线性无关的。</p>
<p><strong>推论</strong>: <span class="math">\(n\)</span>阶矩阵<span class="math">\(A\)</span>若有<span class="math">\(n\)</span>个不同特征值,则<span class="math">\(A\)</span>一定有<span class="math">\(n\)</span>个线性无关的特征向量</p>
<p><strong>推论</strong>: <span class="math">\(n\)</span>阶矩阵<span class="math">\(A\)</span>的每一个特征值的代数重数等于几何重数,则<span class="math">\(A\)</span>一定有<span class="math">\(n\)</span>个线性无关的特征向量</p>
<h1>对角矩阵与线性变换</h1>
<p><strong>定义</strong>: 设<span class="math">\(T\)</span>是数域<span class="math">\(F\)</span>上的<span class="math">\(n\)</span>维线性空间<span class="math">\(V^{n}\)</span>上的一个线性变换,如果<span class="math">\(V^{n}\)</span>中存在一组基使得<span class="math">\(T\)</span>在这组基下的矩阵表示是对角矩阵,则称<span class="math">\(T\)</span>是<strong>可对角化</strong>的。</p>
<p><strong>定理</strong>: 数域<span class="math">\(F\)</span>上的<span class="math">\(n\)</span>维线性空间<span class="math">\(V^{n}\)</span>的一个线性变换,T可对角化的充要条件是:<strong>T有n个线性无关的特征向量</strong></p>
<p><strong>定义</strong>: 如果n阶矩阵A与对角矩阵相似,则称矩阵A是<strong>可对角化</strong>的。</p>
<p><strong>定理</strong>: n阶矩阵A可对角化的充要条件是:<strong>A有n个线性无关的特征向量</strong></p>
<p><strong>定义</strong>: 当n阶矩阵A有n个线性无关的特征向量时,则称矩阵A有<strong>完备的特征向量系</strong>,否则就称A为<strong>亏损矩阵</strong></p>
<h1>不变子空间</h1>
<p><strong>定义</strong>: 设<span class="math">\(V^n\)</span>是数域上F上的一个n维线性空间,T是<span class="math">\(V^n\)</span>上的线性变换,<span class="math">\(V_1\subseteq V^n\)</span>的子空间,如果对于任何<span class="math">\(\xi\in V_1\)</span>恒有<span class="math">\(T(\xi)\in V_1\)</span>,则称<span class="math">\(V_1\)</span>是关于T的<strong>不变子空间</strong></p>
<p>从上面这个定义可以看出,整个线性空间V和零子空间对于每个线性变换T来说都是其<strong>不变子空间</strong></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>也即线性变换<span class="math">\(T\)</span> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>根据特征向量的定义:<span class="math">\((\lambda_iI-A)x_i=0\)</span> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>因为<span class="math">\(Ax_j = \lambda_jx\_j\)</span>,所以<span class="math">\((\lambda_iI-A)x_j=(\lambda_i-\lambda_j)x_j\)</span> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>神器Pandoc的安装与使用2013-10-21T00:00:00-06:002013-10-21T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-10-21:/misc/Pandoc/<p>传说中Makrdown的瑞士军刀——Pandoc,本文简要说明了作者Pandoc的配置过程。</p><h1>前言</h1>
<p>其实很早就知道Pandoc这个东西了,只是一直没有什么需求促使我去使用它。平时写博客虽然也是用Markdown,但是由于Jekyll并不支持Pandoc,所以也没有特别去研究它(目前博客使用的是<a href="http://kramdown.rubyforge.org/" title="Kramdown">Kramdown</a>渲染器,它在很多扩展语法都是借鉴Pandoc的。)。可是时过境迁,现在平时需要写一些非正式报告和总结,每次使用word的时候总觉得不舒服,有次为了调整一个段落的行距搞了1个多小时,虽然可以说是我自己没有学好word的基本操作,但是每次为了寻找一个功能"翻箱倒柜"地在网上找方法,彻底破坏了写作的情绪,这实在让我很难受。因此我选择markdown来进行平时的写作,为了达到这个目的,必须要选择一个markdown的渲染器,网上有着各式各样的渲染器,还有一些可以直接在线渲染的网站。但是平时在本地编辑的时候,总要开个浏览器,这实在让人接受不了。在众多渲染器中,最先映入眼帘的就是Pandoc了,号称为文本格式转换的<strong>瑞士军刀</strong>,既然有了这个称号,说明其功能是非常不错的。后来查了一下,发现果然是一个<strong>神器</strong>,它甚至可以生成pdf和docs!</p>
<p>Pandoc的官网在<a href="http://johnmacfarlane.net/pandoc/" title="Pandoc">这里</a>,网上有很多具体介绍Pandoc的文章,其中质量比较高的有:</p>
<ul>
<li><a href="http://www.yangzhiping.com/tech/pandoc.html" title="Markdown写作进阶:Pandoc入门浅谈]">Markdown写作进阶:Pandoc入门浅谈</a></li>
<li><a href="http://iout.in/archives/454.html" title="Markdown+Pandoc 最佳写作拍档">Markdown+Pandoc 最佳写作拍档</a></li>
<li><a href="http://stdio.tumblr.com/lightdoc" title="轻量级文档写作">轻量级文档写作</a></li>
</ul>
<p>本文就不再赘述上面文章提到过的一些基本概念和操作了,如果读者还不知道Markdown和Pandoc是什么的话,请阅读上述文章。</p>
<h1>配置</h1>
<p>具体的安装过程上述文章和Pandoc的官网上都有,此处不再细说了,这里主要说明一些在安装过程遇到的问题和解决方法(以windows7为例)。</p>
<h2>系统路径</h2>
<p>在Windows下Pandoc安装的时候,默认是安装在用户主目录下的,以win7为例,就是<code>C:\Users\USERNAME\AppData\Local\Pandoc</code>,照理来说安装程序是应该会把这个目录添加到Path中去的,但是我发现并没有自动添加,因此首先要将这个目录手动加入到Path中,这样才能在任何的目录下进行调用。</p>
<h2>生成HTML</h2>
<p>就我自己而言,我使用Pandoc最主要的功能就是利用它来生成HTML和PDF文件,本节先讨论HTML的配置方法,下一节再来说明pdf的配置。</p>
<p>其实将markdown生成html,是Pandoc最基本的一个功能,使用起来也是非常简单的,打开cmd,切换到makrdown文本所在的目录,写入如下代码<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>:</p>
<pre><code>:::bash
pandoc in.md -o out.html
</code></pre>
<p>程序运行之后,就会在当前目录下生成一个相应的out.html文件。</p>
<h3>CSS样式</h3>
<p>上面这是最基本的用法了,但是这还不能满足我的日常需求,单纯的html文件太过单调了,只有配上相应的CSS样式,才能使得文本以更加优美的方式展现出来。</p>
<p>可喜的是pandoc完全支持加入css一起渲染,利用如下的命令:</p>
<pre><code>:::bash
pandoc in.md -c style.css out.html
</code></pre>
<p>其中style.css是为生成的html文件编写的样式文件,但是这个style.css应该放在哪呢?放在当前目录下,当然没问题,但是每次编写markdown的时候,都要将这个css文件复制到当前目录下,那岂不是很麻烦?因此我要想办法把它放在一个固定的地方,每次直接调用就可以了。</p>
<p>这就引出了pandoc的<strong>默认目录</strong>了,可以通过<code>pandoc --version</code>命令来查看pandoc当前的默认目录,还是以windows7为例,它的默认目录是<code>C:\Users\USERNAME\AppData\Roaming\pandoc</code> ,只需要将这个style.css文件放入到这个目录下,那么在任意目录使用pandoc时,都能自动读取到这个文件,而且,如果需要一些特殊的css样式,可以在当前目录编写,pandoc会自动使用当前目录下的style.css替代默认目录中的style.css文件。</p>
<h3>生成独立HTML</h3>
<p>通常来说,写作的目的是写给别人来看的,但是如果是使用html文件的格式的话,那么每次传输都需要传送整个目录文件,因为会有很多图片或css文件需要一起被传送,否则html会无法正确显示。这显然是很麻烦的,有没有办法让pandoc在生成的时候,自动把style.css中样式代码直接嵌入到html中呢?办法当然是有的,主要是参考了这篇<a href="http://devilgate.org/blog/2012/07/02/tip-using-pandoc-to-create-truly-standalone-html-files/" title="using Pandoc to create truly standalone HTML files">文章</a>。主要有两种方法:</p>
<p>第一种是使用方法是使用如下的命令:</p>
<pre><code>:::bash
pandoc -s -H style.css in.md -o out.html
</code></pre>
<p>但是当我试用这种方式的时候,发现style.css文件必须放在当前目录下,这个命令才能正常执行,否则会报错说找不到style.css文件。</p>
<p>另外一种更加好的方式使用<code>--self-contained</code>参数:</p>
<pre><code>:::bash
pandoc -s --self-contained -c style.css in.md -o out.html
</code></pre>
<p>这个命令不但会把css文件嵌入到html中,它会把所有外部文件全部压缩进单个html文件中,包括图片、视屏、音乐等。这是何等强大的功能!!</p>
<p>利用上述这个命令,就能将markdown文档轻易地生成一个真正独立的html文件,不需要任何其他外部文件支持,这就非常方便传递了。</p>
<h2>生成pdf</h2>
<p>生成一个pdf文件也是pandoc的主要功能之一,但是它要依赖于latex,如果需要使用pandoc来生成pdf文件,那么需要另外安装Latex,pandoc官方推荐安装<a href="http://miktex.org/" title="MiKTeX">MiKTeX</a>,具体安装过程也不说了,非常简单。安装好MikTex之后,可以利用如下的命令来生成pdf:</p>
<pre><code>:::bash
pandoc in.md -o out.pdf
</code></pre>
<p>但是这样命令会出现这样的错误</p>
<blockquote>
<p>! Package inputenc Error: Unicode char \u8:鍒?not set up for use with LaTex. pandoc: Error producing PDF from Tex source. See the inputsnc package documentation for explanation. ...</p>
</blockquote>
<p>原因是pandoc默认选择的pdf引擎是pdflatex,而pdflatex是不支持中文的,因此会发生上述错误。因此在使用pandoc的时候,可以手动指明Latex引擎为xelatex,这是完全支持中文显示的。这样我们的命令就变成了:</p>
<pre><code>:::bash
pandoc in.md -o out.pdf --latex-engine=xelatex
</code></pre>
<p>使用这个命令能够正常的编译出pdf文件,但是当你打开编译出来的pdf文件时,会发现其中的中文部分全是空白,这是字体的问题,因为Latex的默认字体是不支持中文的,因此我们可以继续修改命令:</p>
<pre><code>:::bash
pandoc in.md -o out.pdf --latex-engine=xelatex -V mainfont=SimSun
</code></pre>
<p>其中<code>mainfont</code>参数是用来指明所使用的字体,<code>SinSun</code>表示的是宋体,你可以选择其他支持中文的字体。</p>
<p>但是这个命令还是有问题的,打开生成的pdf,你会发现其中的中文完全是没有断行的,这是因为pandoc本身对中文支持不够,但这不是说我们没有解决方案,解决方案是使用网友编辑好的latex模板来生成pdf,这里用到的是<a href="https://github.com/tzengyuxio/pages/tree/gh-pages/pandoc">tzengyuxio</a>提供的pm-template.latex4。 下载模板后将其中的LiHei Pro字体替换成系统中安装有的中文字体即可,然后编译命令改为</p>
<pre><code>:::bash
pandoc in.md -o out.pdf --latex-engine=xelatex --template=pm-template.latex
</code></pre>
<p>这时就能生成一个比较完美的pdf文件了。</p>
<h1>Vim与Pandoc</h1>
<p>既然现在有了panodc这个神器,那么大部分的文本编辑操作我就可以在Vim中进行了,而不需要去使用那个无比臃肿的word了,配合Vim强大的定制功能,我就能配置出一个功能完善的pandoc写作环境了。</p>
<p>这显然又是一个很深的话题,这里我只是稍微写一下配置过程,因为我自己本身也还在研究当中。</p>
<p>首先可以为markdown文件映射几个命令,使得可以快捷的生成html,在Vim的_vimrc文件中加入如下代码:</p>
<pre><code>:::vim
function! ToHtml()
exec 'w'
exec "!pandoc -s -S --self-contained -c style.css % -o %<.html "
endfunction
function! ToPdf()
exec 'w'
exec "!pandoc % -o %<.pdf --latex-engine=xelatex --template=pm-template.latex"
endfunction
:nmap <silent> <F5> :call ToHtml()<CR>
:nmap <silent> <F6> :call ToPdf()<CR>
</code></pre>
<p>上述的代码中,我首先定义了两个函数,分别是用来调用pandoc来生成html和pdf文件的,然后映射了两个快捷键<code><F5></code>和<code><F6></code>去调用这两个函数,这样就实现了直接在Vim中调用pandoc生成html或pdf,而不再需要通过命令行来调用。</p>
<p>最后推荐一个比较好的pandoc插件:<a href="https://github.com/vim-pandoc/vim-pandoc" title="vim-pandoc">vim-pandoc</a>,这个插件我也是刚刚开始使用,感觉还不错,值得推荐。</p>
<h1>参考资料</h1>
<ul>
<li><a href="http://www.yangzhiping.com/tech/pandoc.html" title="Markdown写作进阶:Pandoc入门浅谈]">Markdown写作进阶:Pandoc入门浅谈</a></li>
<li><a href="http://iout.in/archives/454.html" title="Markdown+Pandoc 最佳写作拍档">Markdown+Pandoc 最佳写作拍档</a></li>
<li><a href="http://stdio.tumblr.com/lightdoc" title="轻量级文档写作">轻量级文档写作</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_5ee56d450101dah2.html" title="利用Pandoc将markdown文件转化为pdf">利用Pandoc将markdown文件转化为pdf</a></li>
<li><a href="http://afoo.me/2013-07-10-how-to-transform-chinese-pdf-with-pandoc.html" title="pandoc中文pdf转换攻略">pandoc中文pdf转换攻略</a></li>
<li><a href="http://johnmacfarlane.net/pandoc/README.html" title="pandoc官方User Guide">pandoc官方User Guide</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>如果发现没有pandoc命令,说明还没有将安装目录添加到系统Path中,请查看上一节内容。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>矩阵论学习笔记4-线性变换的特征值2013-10-13T00:00:00-06:002013-10-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-10-13:/matrix-theory/Theory-of-Matrices-4/<p>矩阵论学习课程笔记</p><h1>线性变换的特征值问题</h1>
<p><strong>定义1</strong>: 设<span class="math">\(T\)</span>是数域<span class="math">\(F\)</span>上线性空间<span class="math">\(V^n\)</span>的一个线性变换,如果存在<span class="math">\(\lambda\in F\)</span>以及非零向量<span class="math">\(\xi\in V^n\)</span>使得</p>
<div class="math">$$
\begin{equation}
T(\xi)=\lambda\xi \label{eigen value}
\end{equation}
$$</div>
<p>则称<span class="math">\(\lambda\)</span>为<span class="math">\(T\)</span>的<strong>特征值</strong>,并称<span class="math">\(\xi\)</span>为<span class="math">\(T\)</span>对应于特征值<span class="math">\(\lambda\)</span>的<strong>特征向量</strong></p>
<p>此处的 <strong>线性变换</strong>是指从线性空间<strong>自己到自己</strong>的线性算子<span class="math">\(T:V^n\rightarrow V^n\)</span></p>
<p>这里的 <strong>特征值</strong>和<strong>特征向量</strong>都是非常抽象的概念,联想到之前的几篇笔记中曾经将抽象的线性空间中的元素用具体的坐标来表示,用具体的数字矩阵来表示线性算子,那么,我们不经要问,有没有办法用具体的数来表示线性空间中抽象的<strong>特征值</strong>和<strong>特征向量</strong>概念呢?很显然,答案是肯定的,推导过程如下:</p>
<p>假设<span class="math">\(\alpha_1,\alpha_2,\cdots,\alpha_n\)</span>是<span class="math">\(n\)</span>维线性空间<span class="math">\(V^n\)</span>的一组基,线性变换<span class="math">\(T\)</span>在该基底下的矩阵表示为<span class="math">\(A\)</span>,如果<span class="math">\(\lambda\)</span>是<span class="math">\(T\)</span>的特征值,<span class="math">\(x\)</span>是相应的特征向量,则<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<div class="math">$$
\begin{equation}
\xi = (\alpha_1,\alpha_2,\cdots,\alpha_n)\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
\end{equation}
$$</div>
<p>根据<a href="http://zhouyichu.com/matrix-theory/Theory-of-Matrices-3/" title="上一篇笔记">上一篇笔记</a>中的线性算子的矩阵表示说明,我们可以得到如下的等式:</p>
<div class="math">$$
\begin{equation}
T[(\alpha_1,\alpha_2,\cdots,\alpha_n)]\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
=(\alpha_1,\alpha_2,\cdots,\alpha_n)A\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
\end{equation}
$$</div>
<p>又根据式子<span class="math">\(\ref{eigen value}\)</span>,我们可以得到:</p>
<div class="math">$$
\begin{equation}
T[(\alpha_1,\alpha_2,\cdots,\alpha_n)]\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
=(\alpha_1,\alpha_2,\cdots,\alpha_n)\lambda\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
\end{equation}
$$</div>
<p>联合上述两个等式,我们得到:</p>
<div class="math">$$
\begin{equation}
(\alpha_1,\alpha_2,\cdots,\alpha_n)A\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
=
(\alpha_1,\alpha_2,\cdots,\alpha_n)\lambda\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
\end{equation}
$$</div>
<p>因为<span class="math">\(\alpha_1,\alpha_2,\cdots,\alpha_n\)</span>是<span class="math">\(V^n\)</span>中的基底,所以<span class="math">\(\alpha_1,\alpha_2,\cdots,\alpha_n\)</span>是线性无关的,因此最终我们得到:</p>
<div class="math">$$
\begin{equation}
A\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
=
\lambda\left[
\begin{array}{ccc}
x_1 \\ x_2 \\ \vdots \\ x_n
\end{array}
\right]
\end{equation}
$$</div>
<p>而上述的等式,就是矩阵 <strong>特征值</strong>和<strong>特征向量</strong>的定义,所以,我们可以得出这样的结论:<strong>线性变换<span class="math">\(T\)</span>的特征值<span class="math">\(\lambda\)</span>也是A的特征值</strong></p>
<p>仔细想想,根据上面这条结论其实是有些问题的,因为一个线性空间有多个不同的基底,根据不同的基底,线性变换<span class="math">\(T\)</span>就会有不同的矩阵表示<span class="math">\(A\)</span>,那就是说线性变换<span class="math">\(T\)</span>会有多组不同的特征值?其实线性变化<span class="math">\(T\)</span>的特征值是确定的,不存在多组不同的值,存在以下几个结论,能够保证不会出现上述的情况:</p>
<ol>
<li><strong>同一线性变换在<span class="math">\(V^n\)</span>的不同基底下的矩阵表示是相似的</strong></li>
<li><strong>相似矩阵有相同的特征多项式</strong></li>
<li><strong>相似矩阵有相同的特征值</strong></li>
</ol>
<p>关于<span class="math">\(n\)</span>阶矩阵及其特征值<span class="math">\(\lambda\)</span>,还有如下的结论:</p>
<ol>
<li><span class="math">\(n\)</span>阶矩阵<span class="math">\(\mu A\)</span>有特征值<span class="math">\(\mu\lambda\)</span>,对应的特征向量仍为x(<span class="math">\(\mu\)</span>为任意常数)</li>
<li>矩阵<span class="math">\(A^{m}\)</span>有特征值<span class="math">\(\lambda^{m}\)</span>,对应的特征向量仍为<span class="math">\(x\)</span>(<span class="math">\(m\)</span>为正整数)</li>
<li>矩阵<span class="math">\(A^{-1}\)</span>有特征值<span class="math">\(\lambda^{-1}(\lambda\neq 0)\)</span>,对应的特征向量仍为<span class="math">\(x\)</span>.</li>
<li>矩阵<span class="math">\(A^{T}\)</span>有特征值<span class="math">\(\lambda\)</span></li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其中,<span class="math">\(\xi\)</span>表示的是一个抽象的向量,<span class="math">\(x_1,x_2\cdots x_n\)</span>则是这个抽象向量在<span class="math">\(\alpha_1,\alpha_2,\cdots,\alpha_n\)</span>基底下的坐标表示。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>全排列算法part22013-10-10T00:00:00-06:002013-10-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-10-10:/algorithm/Permutation-Generation-2/<p>寻找一个序列的所有排列情况是一个非常常见的需求,在很多实际应用中都有这样的需求。本文分析了目前几种常见的求全排列的算法。</p><h1>Johnson-Trotter算法</h1>
<p>Johnson-Trotter算法的基本思想和<a href="http://zhouyichu.com/algorithm/Permutation-Generation-1/" title="字典序">字典序</a>很相似,在字典序算法中,试图寻找一种所有排列情况中的顺序关系,然后按照这种顺序依次计算排列情况。而在Johnson-Trotter算法中,是寻找一种相邻元素相互<strong>交换</strong>的顺序,根据这种交换的顺序,依次计算排列。</p>
<p>在Johnson-Trotter算法中,每次循环都进行一次满足条件的相邻元素的交换,直到不存在满足条件的可交换的元素,此时说明所有排列的情况均已输出,算法结束。</p>
<p>具体过程如下:</p>
<ol>
<li>初始化所有元素的移动方向为左,输出序列本身</li>
<li>移动最大的可移动的元素(当元素移动方向上的元素比自己小时,才能移动)</li>
<li>反转所有比移动元素大的所有元素的移动方向</li>
<li>重复2~3步,直到不能移动为止</li>
</ol>
<h2>具体例子</h2>
<p>上面的算法流程有些抽象,现在举个例子来加深理解。假设现在要计算<span class="math">\(\{0,1,2\}\)</span>所有排列。首先是将所有元素的移动方向为标记为向左,我们可以表示成这样:<span class="math">\(\{\overleftarrow{0},\overleftarrow{1},\overleftarrow{2}\}\)</span>,然后根据算法流程中的步骤2,移动最大的可移动元素。这里的可移动元素是指在其移动方向上的相邻元素比自己小时,例如<span class="math">\(\overleftarrow{1},\overleftarrow{2}\)</span>都是可移动元素,因为在他们的移动方向上(左移)的相邻元素:<span class="math">\(0\)</span>,<span class="math">\(1\)</span>分别比<span class="math">\(1\)</span>,<span class="math">\(2\)</span>小,而每次都只移动这些可移动元素中最大的那个项。接着,在每次交换完成之后,寻找所有比当前交换元素大的元素,将他们的移动方向反转一下。</p>
<p>下面列出<span class="math">\(\{1,2,3\}\)</span>在计算过程中所有的情况:</p>
<div class="math">$$
\begin{align}
&\{\overleftarrow{0},\overleftarrow{1},\overleftarrow{2}\}\\
&\{\overleftarrow{0},\overleftarrow{2},\overleftarrow{1}\}\\
&\{\overleftarrow{2},\overleftarrow{0},\overleftarrow{1}\}\\
&\{\overrightarrow{2},\overleftarrow{1},\overleftarrow{0}\}\\
&\{\overleftarrow{1},\overrightarrow{2},\overleftarrow{0}\}\\
&\{\overleftarrow{1},\overleftarrow{0},\overrightarrow{2}\}\\
\end{align}
$$</div>
<p>最后给出代码:</p>
<pre><code>#!cpp
//找到最大可移动项
int FindTheBiggest(int *arg,int *direction,int n)
{
int i,k,j;
int max = -1;
k = -1;
//print(direction,n);
for(i = 0;i < n;++i)
{
j = i+direction[i];
if(j < 0 || j > n){continue;}
if(arg[i] > max && arg[j] < arg[i])
{
k = i;
max = arg[i];
}
}
return k;
}
//反转比移动项大的所有项的移动方向
void Reverse(int *arg,int *direction,int n,int k)
{
int max = arg[k];
int i;
for(i = 0; i < n;++i)
{
if(arg[i] > max)
{
direction[i]*=-1;
}
}
}
//Johson-Trotter算法
//用-1表示移动方向是向左,1表示移动方向是向右
void perm3(int *arg,int n)
{
int direction[n];
int i;
int k=0;
int max;
//初始化移动方向
for(i = 0;i < n;++i)
{
direction[i] = -1;
}
while(k!=-1)
{
//print(arg,n);
//print(direction,n);
k = FindTheBiggest(arg,direction,n);
max = arg[k];
i = direction[k]+k;
swap(arg[i],arg[k]);
swap(direction[i],direction[k]);
Reverse(arg,direction,n,i);
}
}
</code></pre>
<h1>多进制算法</h1>
<p>其实这个算法也偶然在网上看到,我甚至都不知道这个算法叫什么,只能按照其基本思想,自己起了个名字,如果哪位知道这个算法本名是什么,请联系我。</p>
<p>第一次看到这个算法的时候,真的觉得被这个算法的巧妙技巧给震撼到了,但是后来在写代码实现的时候,发现其效率也不是很高。<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<p>这个多进制的算法,其思想和之前讨论过的各种算法都是不一样的。我们首先从最基本的情况开始:假设我们有一个长度为<span class="math">\(n\)</span>的数列,首先取出第一个数字,然后取出第二个数字,此时第二个数字有两种放置的选择,可以放在第一个数字的左边或右边;接着取第三个数字,它将会有3种选择:左边、中间、右边;依次可以类推下去。多进制算法的精妙之处,是将这些可能的选择情况编码成为了一个数字:从左至右将可能放置的位置进行编号,从0开始。比如取出第三个数字时,它有左边、中间、右边三种选择情况,则着三种选择分别用<span class="math">\(0,1,2\)</span>来表示。</p>
<p>我们可以设计一个数,比如是xyz,其中z是二进位的,y是三进位的,x是四进位的,分别代表第二个数字、第三个数字、第四个数字可以进行选择的情况,这样设计的话,我们就可以将一种排列的状态转换为一个多进制的数,只要能给定一个这样的多进制数,我们就能计算出其相应的排列情况。</p>
<p>现在先来举个例子:对于<span class="math">\(\{a,b,c\}\)</span>来说,多进制数<span class="math">\(10\)</span>就表示<span class="math">\(\{a,b,c\}\)</span>的一种排列状态,具体过程是这样的:首先取出第一个字符a,然后取出第二个字符b,此时多进制数<span class="math">\(10\)</span>中的<span class="math">\(0\)</span>表示字符b放置在字符a的左侧,接着取出第三个字符c,此时多进制数<span class="math">\(10\)</span>中的<span class="math">\(1\)</span>就表示字符c要放置在字符串ba的中间,形成bca。这样,我们就根据一个多进制数生成了一中排列情况。</p>
<p>理解了多进制数的意义之后,现在的问题就是说,如何找出这样特殊的多进制数呢?这不禁让人想起了二进制数到十进制数的转化过程了,我们可以将同样的方法运用到这个多进制数上,将其转化为十进制数:<span class="math">\(3 \times x + 2 \times y + 1 \times z\)</span>,具体来说,多进制数<span class="math">\(10\)</span>可以通过<span class="math">\(2 \times 1 + 1 \times 0= 2\)</span>转化为十进制数2。利用这个过程的逆过程,我们就能将一个十进制数转化为一个多进制数,然后再将这个多进制数转化成为一种排列情况。</p>
<p>下面还是以<span class="math">\(\{a,b,c\}\)</span>为例,我写出了其所有排列情况的多进制数和十进制数:</p>
<p>{% math %}
</p>
<div class="math">\begin{align}
&\{a,b,c\}\cdots[21]\cdots2\times2+1\times1=5\\
&\{a,c,b\}\cdots[11]\cdots2\times1+1\times1=3\\
&\{c,a,b\}\cdots[01]\cdots2\times0+1\times1=1\\
&\{c,b,a\}\cdots[00]\cdots2\times0+1\times0=0\\
&\{b,c,a\}\cdots[11]\cdots2\times1+1\times0=2\\
&\{b,a,c\}\cdots[20]\cdots2\times2+1\times0=4\\
\end{align}</div>
<p>
{% endmath %}</p>
<p>其中第一列是排列的情况,第二列是其相应的多进制数,最后一列是将多进制转化为十进制数的计算过程。我们可以惊奇地发现,其十进制数刚好是在<span class="math">\([0,3!)\)</span>的范围内!!</p>
<p>这样我们就能够遍历<span class="math">\([0,n!)\)</span>中的每一个数,将其转换为多进制数,然后再转化为排列情况,这样就能输出全部的排列情况了。</p>
<p>不得不由衷感叹这种方法的精妙之处!</p>
<p>虽然这种方法的想法是这么的巧妙,但是具体运行的时候还是会很慢,主要原因是需要遍历<span class="math">\(n!\)</span>个数,这个遍历过程只要<span class="math">\(n\)</span>稍微大一点,其运行速度就会变得很慢,更何况每次遍历都要进行十进制数到排列情况的映射操作。虽然这个算法的效率不高,但其中包含的思想,我认为值得深入理解。</p>
<p>最后给出代码仅供参考</p>
<pre><code>#!cpp
void order(int *arg,int idx,int n)
{
int i,j,k;
int myarg[n];
int myidx = idx;
myarg[0] = arg[0];
for(i = 2; i <= n;++i)
{
k = myidx % i;
for(j = i-1;j > k;--j)
{
myarg[j] = myarg[j-1];
}
myarg[k] = arg[i-1];
myidx /= i;
}
//print(myarg,n);
}
void perm4(int *arg,int n)
{
int i;
int s = 1;
for(i = 1;i <= n;++i)
{
s*=i;
}
//cout<<s;
for(i = 0;i < s;++i)
{
order(arg,i,n);
}
}
</code></pre>
<h1>参考资料</h1>
<ol>
<li><a href="http://arieshout.me/2012/04/non-recursive-permutation-generation.html" title="非递归排列算法">非递归排列算法</a> </li>
<li><a href="http://en.wikipedia.org/wiki/Johnson-Trotter" title="Steinhaus–Johnson–Trotter algorithm">维基百科:Steinhaus–Johnson–Trotter algorithm</a></li>
<li><a href="http://08jibzhanglei.blog.163.com/blog/static/1116192232010325111024283/" title="Johnson-Trotter算法">Johnson-Trotter算法</a></li>
<li><a href="http://www.cnblogs.com/davidluo/articles/1802838.html" title="全排列的递归与非递归">全排列的递归与非递归</a></li>
<li><a href="http://llfclz.itpub.net/post/1160/278490" title="一个经典的全排列算法">一个经典的全排列算法</a></li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>甚至比递归还慢,这就解释了为什么这个算法不太知名。但是这个算法中蕴含的思想却十分巧妙,我觉得有必要记录一下。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>矩阵论学习笔记3-线性算子2013-10-10T00:00:00-06:002013-10-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-10-10:/matrix-theory/Theory-of-Matrices-3/<p>矩阵论学习课程笔记</p><h1>同构算子与线性空间同构</h1>
<p>上一次的笔记中,我们讲到了 <strong>线性算子</strong>,<strong>线性算子</strong>其实就是满足某些条件的从一个线性空间转换到另一个线性空间转换过程,可以说<strong>线性算子</strong>是一种特殊的<strong>转换过程</strong>。而现在要讲的<strong>同构算子</strong>是一种特殊的<strong>线性算子</strong>。</p>
<p><strong>定义</strong>: 设X,Y是线性空间,T是<span class="math">\(X\rightarrow Y\)</span>的线性算子,且是"一对一"的,即满足:</p>
<ol>
<li><span class="math">\(T(X)=Y(全映射)\)</span></li>
<li>若<span class="math">\(x_1,x_2\in X\)</span>,当<span class="math">\(x_1\neq x_2\)</span>时,有<span class="math">\(T(x_1)\neq T(x_2)\)</span></li>
</ol>
<p>那么,就称T为X与Y间的一个<strong>同构算子</strong></p>
<p>若X与Y之间存在同构算子,则称X与Y是<strong>同构的线性空间</strong></p>
<p>同构的线性空间有如下的性质:</p>
<ol>
<li>传递性,若<span class="math">\(V_1\)</span>与<span class="math">\(V_2\)</span>同构,<span class="math">\(V_2\)</span>与<span class="math">\(V_3\)</span>同构,则<span class="math">\(V_1\)</span>与<span class="math">\(V_3\)</span>也同构</li>
<li>同构的线性空间中的零向量必定是相互对应的<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></li>
<li>同构的线性空间中的线性相关向量系对应于线性相关向量系,线性无关向量系对应于线性无关向量系</li>
</ol>
<p>根据同构空间的定义,我们很容易得出这样的结论:<strong>同构空间的维数一定是相等的!</strong></p>
<p>事实上,存在着如下的定理:</p>
<p><strong>定理1</strong> <strong>数域<span class="math">\(F\)</span>上的两个有限维线性空间同构的充要条件是两空间的维数相等</strong></p>
<p>同构空间的概念是非常有用的,可以使得不同的线性空间<span class="math">\(V^n\)</span>的问题转化到向量空间<span class="math">\(F^n\)</span>中的问题加以研究。</p>
<h1>线性算子的矩阵表示</h1>
<p>一个线性空间可以用其坐标来表示,那么线性算子能否使用具体的数字来表示呢?为了回答这个问题,我们首先要定义线性算子相等的概念:</p>
<p><strong>定义2</strong>: 设<span class="math">\(T_1\)</span>与<span class="math">\(T_2\)</span>是由<span class="math">\(V^n\)</span>到<span class="math">\(V^m\)</span>的两个线性算子,如果对于任何<span class="math">\(x\in V^n\)</span>恒有<span class="math">\(T\_1(x)=T\_2(x)\in V^m\)</span>,则说线性算子<span class="math">\(T\_1\)</span>与<span class="math">\(T\_2\)</span><strong>相等</strong></p>
<p><strong>定义3</strong>: 设<span class="math">\(\alpha_1,\alpha_2,\cdots,\alpha_n\)</span>是<span class="math">\(n\)</span>维线性空间<span class="math">\(V^n\)</span>的一组基,T是由<span class="math">\(V^n\)</span>到<span class="math">\(V^m\)</span>的线性算子,则<span class="math">\(T(\alpha_1),T(\alpha_2),\cdots T(\alpha_n)\in V^m\)</span>叫做<span class="math">\(V^n\)</span>在算子T下的<strong>基象</strong></p>
<p>有了上述两个概念,我有如下的定理:</p>
<p><strong>定理2</strong> <strong>由<span class="math">\(V^n\)</span>到<span class="math">\(V^m\)</span>的线性算子T是由基象<span class="math">\(T(\alpha_1),T(\alpha_2),\cdots T(\alpha_n)\)</span>唯一确定的</strong></p>
<p>设<span class="math">\(x\in V^n\)</span>且<span class="math">\(x=\lambda_1\alpha_1+\lambda_2\alpha_2+\cdots\lambda_n\alpha_n\)</span>,则</p>
<div class="math">$$
\begin{align}
T(x)&=T(\lambda_1\alpha_1+\lambda_2\alpha_2+\cdots+\lambda_n\alpha_n)\\
&=\lambda_1T(\alpha_1)+\lambda_2T(\alpha_2)+\cdots+\lambda_nT(\alpha_n)
\end{align}
$$</div>
<p>其中<span class="math">\(\lambda\_1,\lambda\_2,\cdots,\lambda\_n\)</span>是已知的,所以只要知道<span class="math">\(T(\alpha\_1),T(\alpha\_2),\cdots T(\alpha\_n)\)</span>便确定了<span class="math">\(T(x)\)</span></p>
<p>因为<span class="math">\(T(x)\in V^m\)</span>,所以</p>
<div class="math">$$
\begin{align}
T(\alpha_1)=a_{11}\beta_1&+a_{21}\beta_2+\cdots +a_{m1}\beta_m\\
T(\alpha_2)=a_{12}\beta_1&+a_{22}\beta_2+\cdots +a_{m2}\beta_m\\
& \cdots \\
T(\alpha_n)=a_{1n}\beta_1&+a_{2n}\beta_2+\cdots +a_{mn}\beta_m\\
\end{align}
$$</div>
<p>其中<span class="math">\(\beta_i\)</span>是<span class="math">\(V^m\)</span>中的基。</p>
<p>因此,我们可以得到:</p>
<div class="math">$$
\begin{equation}
T(\alpha_1,\alpha_2,\cdots,\alpha_n)=(\beta_1,\beta_2,\cdots,\beta_n)\left[
\begin{array}{ccc}
a_{11} & a_{1,2} &\cdots & a_{1n} \\
a_{21} & a_{2,2} &\cdots &a_{2n} \\
\vdots & \vdots & &\vdots \\
a_{m1} & a_{m,2} &\cdots &a_{mn} \\
\end{array}
\right]
=(\beta_1,\beta_2,\cdots,\beta_m)A_{m\times n}
\end{equation}
$$</div>
<p>其中,<span class="math">\(a_{11},a_{21},\cdots,a_{m1}\)</span>是<span class="math">\(\alpha_1\)</span>经过<span class="math">\(T\)</span>变换后,在象空间的坐标表示。</p>
<p>上式中的<span class="math">\(A_{m\times n}\)</span>称为线性算子<span class="math">\(T\)</span>在基底<span class="math">\(\{\alpha_1,\alpha_2,\cdots,\alpha_n\}\)</span>与<span class="math">\(\{\beta_1,\beta_2,\cdots,\beta_m\}\)</span>下的<strong>矩阵表示</strong></p>
<p>从上述的推导过程中,我们可以知道,要求一个线性算子<span class="math">\(T\)</span>的矩阵表示,只需要求出线性空间<span class="math">\(V^n\)</span>的一组基底<span class="math">\(\{\alpha_1,\alpha_2,\cdots,\alpha_n\}\)</span>在经过<span class="math">\(T\)</span>转换之后在线性空间<span class="math">\(V^m\)</span>中以<span class="math">\(\{\beta_1,\beta_2,\cdots,\beta_m\}\)</span>为基底的<strong>坐标</strong>,这些坐标所形成的矩阵就是线性算子<span class="math">\(T:V^n\rightarrow V^m\)</span>的矩阵表示。</p>
<h1>线性算子的运算</h1>
<p>假设把线性空间<span class="math">\(V_1\)</span>到<span class="math">\(V_2\)</span>的所有线性算子组成的集合表示为<span class="math">\(L(V_1,V_2)\)</span>,则<span class="math">\(L(V_2,V_3)\)</span>和<span class="math">\(L(V_1,V_3)\)</span>分别表示<span class="math">\(V_2\)</span>到<span class="math">\(V_3\)</span>和<span class="math">\(V_1\)</span>到<span class="math">\(V_3\)</span>的所有线性算子的集合。</p>
<p>则线性算子的 <strong>和</strong>与<strong>积</strong>分别定义为:</p>
<p><strong>定义1</strong>: 设<span class="math">\(T_1,T_2 \in L(V_1,V_2)\)</span>,则线性算子<span class="math">\(T_1\)</span>与<span class="math">\(T_2\)</span>的和为:<span class="math">\((T_1+T_2)(x)=T_1(x)+T_2(x) \forall{x}\in V_1\)</span></p>
<p><strong>定义2</strong>: 设<span class="math">\(T_1\in L(V_1,V_2)\)</span>,<span class="math">\(T_1\in L(V_2,V_3)\)</span>,则定义<span class="math">\(T_2T_1\)</span>为<span class="math">\(T_1\)</span>与<span class="math">\(T_2\)</span>的积:<span class="math">\(T_2T_1(x)=T_2(T_1(x)) \forall{x}\in V_1\)</span></p>
<p>根据上述定义,线性算子的 <strong>和</strong>与<strong>积</strong>可以证明仍然是线性算子<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>再次强调,线性空间中必定含有零元素! <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>证明一个变换是线性算子,只需要证明这个变换满足两个条件: 1.<span class="math">\(T(x_1+x_2)=T(x_1)+T(x_2)\)</span> 2.<span class="math">\(T(\lambda x)=\lambda T(x)\)</span> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>全排列算法part12013-09-28T00:00:00-06:002013-09-28T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-28:/algorithm/Permutation-Generation-1/<p>寻找一个序列的所有排列情况是一个非常常见的需求,在很多实际应用中都有这样的需求。本文分析了目前几种常见的求全排列的算法。</p><h1>写在前面</h1>
<p>这个算法的分析其实上周就想写了,可惜一直忙于上课和作业,没有时间仔细考虑这个问题。只是依稀记得以前上课的时候做过一个递归的求全排列的算法,但是对于长度为<span class="math">\(n\)</span>的串的全排列的可能情况是<span class="math">\(n!\)</span>,这个增长太快了,使用递归的话几乎不太可能满足日常的需求,从这个角度来说,全排列的递归算法只能作为学习递归算法的一个例子吧。本文将从递归算法开始,分析几个目前常用的生成全排列算法,包括字典序算法、Johnson-Trotter算法和多进制算法。</p>
<h1>递归算法</h1>
<p>对于求一个序列的全排列,最直接的想法肯定就是采用递归的方法了,因为根据阶乘的定义<span class="math">\(n!=n\*(n-1)!\)</span>,因此递归的过程就是:</p>
<ul>
<li>递归式:在每一次的递归层次中求出<span class="math">\((n-1)\)</span>个元素的全排列。</li>
<li>递归边界条件:当元素个数为1的时候,直接返回该元素。</li>
</ul>
<p>但是在具体的实现过程中,如何处理返回的<span class="math">\(n-1\)</span>个元素的全排列又有很多不同的方法,这里主要介绍两种。</p>
<h2>插入法</h2>
<p>这种方法有点类似于插入排序,当通过递归过程返回<span class="math">\(n-1\)</span>个数的全排列的时候,我将第n个数插入到这些排列的空隙中,形成新的排列。举例来说,对于<span class="math">\(a=\{0,1,2,3\}\)</span>来说,首先取出第一个元素0,然后通过递归生成<span class="math">\(\{1,2,3\}\)</span>的全排列:</p>
<pre><code>#!python
{
{1,2,3},
{1,3,2},
{2,1,3},
{2,3,1},
{3,1,2},
{3,2,1},
}
</code></pre>
<p>然后对于生成的每一个排列,将0在每一个可能的位置插入:</p>
<pre><code>#!python
{
{0,1,2,3},
{1,0,3,2},
{1,2,0,3},
{1,2,3,0}, #完成了对{1,2,3}的插入
{0,1,3,2},
{1,0,3,2},
{1,3,0,2},
{1,3,2,0}, #完成了对{1,3,2}的插入
...
}
</code></pre>
<p>按照这样的顺序,我们就能够依次生成原序列的所有排列情况了。可以看到,按照这样的算法, <strong>每一次首元素都会被插入到不同的位置中</strong>,这一点是和下面要介绍的另外一种递归方法的本质区别。</p>
<p>下面给出插入法递归的代码:</p>
<p>代码1:</p>
<pre><code>#!python
def perm(arg):
if len(arg)==0:
return [[]]
else:
#得到n-1的排列
t = perm(arg[1:])
order = []
#遍历每一个排列
for item in t:
#在每一个排列的可能位置中插入当前元素
for (index,x) in enumerate(item):
tmp = item[:]
tmp.insert(index,arg[0])
order.append(tmp)
tmp = item[:]
tmp.append(arg[0])
order.append(tmp)
return order
</code></pre>
<h2>固定首元素</h2>
<p>在这种方法中,我们不需要每次都要将首元素插入到不同位置中,在递归过程中,我们会尝试所有可能的首元素,生成不同元素作为首元素时排列,举例来说,对于<span class="math">\(a=\{0,1,2,3\}\)</span>,我们首先选取0作为首元素,然后固定住0,向下递归生成<span class="math">\(\{1,2,3\}\)</span>的排列,然后,直接将0和生成的排列拼接起来(<strong>而不是插入</strong>),如下所示:</p>
<p>下面是<span class="math">\(\{1,2,3\}\)</span>的全排列</p>
<pre><code>:::python
{
{1,2,3},
{1,3,2},
{2,1,3},
{2,3,1},
{3,1,2},
{3,2,1},
}
</code></pre>
<p>直接将这些排列和0拼接,形成:</p>
<pre><code>:::python
{
{0,1,2,3},
{0,1,3,2},
{0,2,1,3},
{0,2,3,1},
{0,3,1,2},
{0,3,2,1},
}
</code></pre>
<p>完成拼接之后,选取1作为首元素,向下递归生成<span class="math">\(\{0,2,3\}\)</span>的全排列,然后,将1和生成的排列拼接起来;之后选取2作为首元素,重复上述过程,直到所有元素都作为首元素固定过。</p>
<p>下面给出代码:</p>
<p>代码2:
#!python
def perm(arg,order,k=0):
if k >= len(arg):
order.append(arg[:])
return
else:
for i in range(k,len(arg)):
#交换首元素
arg[i],arg[k] = arg[k],arg[i]
#递归调用
perm(arg,order,k+1)
#换回原来的位置
arg[i],arg[k] = arg[k],arg[i]</p>
<p>上面的代码是我自己写的,但是另外我在V2EX上还看到过同样算法的更加简洁的代码:</p>
<p>代码3:</p>
<pre><code>#!python
def all_perm(l):
if not l:
return [[]]
return [[a] + b for a in l for b in all_perm(_remove(l, a))]
def _remove(l, item):
tmp = l[:]
tmp.remove(item)
return tmp
</code></pre>
<h1>字典序法</h1>
<p>除了递归的方法,其实还有很多其他非递归的方法可以用来计算一个序列的全排列。其中有一个算法被称为字典序算法,据说STL中的Next_permutation也是用这个字典序算法实现的<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。这个算法的核心思想就是,<strong>对于每一种可能排列的情况,我们都想办法使其与某种顺序建立对应关系,这种关系式一一对应的</strong>,这样我们就能通过遍历得到的某种顺序来生成全排列,这样就能避免递归过程了。这种按照某种顺序来生成全排列的方法就被称为是<strong>字典序</strong>。</p>
<p>很显然,最重要的是如何才能找到这样一种一一对应的顺序关系,此处继续用<span class="math">\(a=\{0,1,2,3\}\)</span>来说明<strong>字典序</strong>算法的过程。</p>
<p>要找到一种顺序关系,我们就首先要定义大小关系,对于两个序列<span class="math">\(\{0,2,1,3\}\)</span>和<span class="math">\(\{0,2,3,1\}\)</span>来说,序列<span class="math">\(\{0,2,3,1\}\)</span>要比<span class="math">\(\{0,2,1,3\}\)</span>大,比较的方法是从前到后依次比较相同位置上的元素,如果相同则继续比较下一个元素,直到遇到一个不同的元素,元素值大的序列就大于元素值小的序列。按照这样的大小关系形成的序列的顺序,就是<strong>字典序</strong>。可以看到,最小的序列一定是<span class="math">\(\{0,1,2,3\}\)</span>,最大的序列是<span class="math">\(\{3,2,1,0\}\)</span>。而<strong>字典序</strong>算法就是从<strong>字典序</strong>中最小的序列开始,一直不停寻找下一个仅比上一个序列大的序列,直到到达最大的序列。<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>
<p>现在的问题就变成了,如何从当前状态生成一下个状态?</p>
<p><strong>字典序</strong>算法是这样做的(假设当前排列是<span class="math">\(a[1\cdots n]\)</span>):</p>
<ol>
<li>
<p>从<span class="math">\(a\)</span>中找到满足<span class="math">\(a[k] < a[k+1]\)</span>的<span class="math">\(k\)</span>的最大值,即<span class="math">\(k=\max\{i\|a[i] < a[i+1] \}(0 \leq i < n-1)\)</span>,如果不存在这样的k,那就是说已经达到字典序最大的序列了<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>。</p>
</li>
<li>
<p>从<span class="math">\(a[k+1\cdots n]\)</span>中寻找比<span class="math">\(a[k]\)</span>大的数中的最小数<span class="math">\(a[j]\)</span>,即<span class="math">\(j=\min\{i\|a[i] > a[k] \}(k < i \leq n-1)\)</span></p>
</li>
<li>
<p>交换<span class="math">\(a[k]\)</span>和<span class="math">\(a[j]\)</span>,并将<span class="math">\(a[k+1\cdots n]\)</span>中的元素全部倒序。</p>
</li>
</ol>
<p>经过上述三步,得到的序列就是<span class="math">\(a[1\cdots n]\)</span>在<strong>字典序</strong>中的下一个序列了。</p>
<p>我想看到这里,很多人都是一头雾水了吧,这三步只是告诉你How-to-do而不是Why-to-do,这里简略给出一个说明<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>:</p>
<p>首先应该知道,根据字典序的定义,越是小的数排在前面,则整个序列越小。</p>
<ol>
<li>第一步中找到的<span class="math">\(a[k]\)</span>,其实它是有这样的性质的:在k右侧的所有元素都是从大到小排列的</li>
<li>第二步中找到的<span class="math">\(a[j]\)</span>是用来和<span class="math">\(a[k]\)</span>交换的,根据<span class="math">\(a[j]\)</span>满足的条件,可以得出这样的结论:在<span class="math">\(a[k+1\cdots n]\)</span>中,a[k]是仅次于<span class="math">\(a[j]\)</span>的数。而将他们交换之后,能保证整个序列是最小增长的。</li>
<li>但是由于<span class="math">\(a[k+1\cdots n]\)</span>中是从大到小排列的,因此需要将这部分倒序,来使得序列进一步减小,使其成为仅大于原始序列的序列。</li>
</ol>
<p>代码4:</p>
<pre><code>#!python
def nextstate(arg):
flag = False
#步骤1
for i in range(len(arg)-2,-1,-1):
if(arg[i] < arg[i+1]):
flag = True
break
if flag:
k = i
else:
return False
#步骤2
for i in range(len(arg)-1,k,-1):
if arg[i] > arg[k]:
break
j = i
#步骤3
arg[j],arg[k] = arg[k],arg[j]
t = arg[k+1:]
t.reverse()
arg[k+1:] = t
return True
def dictgenerate(arg):
myarg = list(range(len(arg)))
order = []
t = []
for i in myarg:
t.append(arg[i])
order.append(t)
while True:
t = []
flag = nextstate(myarg)
if flag == False:
break
for i in myarg:
t.append(arg[i])
order.append(t)
return order
</code></pre>
<h1>关于代码</h1>
<p>如果有读者运行我上述的代码,大概会发现其实递归的算法和字典序的算法效率上相差不大,甚至有时候递归比字典序还快。但是,我想说的是,出现这样的现象不是 <strong>算法的问题</strong>,而是<strong>Python语言的问题</strong>,Python在很多方面都有着非常不错的特点的,但是在运行效率上却不是很高(相对来说它的开发效率很高),因此会出现递归和字典序效率差不多的现象。从这个角度来说,Python其实并不是一门适合学习算法时所使用的语言,它更多的偏向于解决实际的问题,而不是编程细节。</p>
<p>如果用C++重新实现上述的算法,你就会发现其实递归要比字典序算法慢得多。</p>
<h1>参考资料</h1>
<ol>
<li><a href="http://blog.csdn.net/hackbuteer1/article/details/6657435" title="全排列算法及实现">全排列算法及实现</a></li>
<li><a href="http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html" title="全排列算法原理和实现">全排列算法原理和实现</a></li>
<li><a href="http://ericlippert.com/2013/04/15/producing-permutations-part-one/" title="Producing permutations">Producing permutations</a></li>
<li><a href="http://blog.csdn.net/cpfeed/article/details/7376132" title="字典序法生成全排列算法的证明">字典序法生成全排列算法的证明</a></li>
<li><a href="http://blog.csdn.net/joylnwang/article/details/7064115" title="全排列生成算法(一)">全排列生成算法(一)</a></li>
</ol>
<h1>补充</h1>
<p>后来越想越不好,明明应该是在讲算法的,但是运行结果却不能证明算法的高效,干脆直接装了个C++编译器,将上述两个递归和非递归的算法重新实现了一遍:</p>
<p>递归算法:</p>
<pre><code>#!cpp
void perm2(int *arg,int n,int k)
{
int i;
if(k>=n)
{
//print
}
else
{
for(i = k;i < n;++i)
{
swap(arg[i],arg[k]);
perm1(arg,n,k+1);
swap(arg[i],arg[k]);
}
}
}
</code></pre>
<p>字典序算法:</p>
<pre><code>#!cpp
bool nextstate(int *arg,int n)
{
int i;
bool flag=false;
int k,j;
int start,end;
//step 1
for(i = n-2;i >= 0;--i)
{
if(arg[i] < arg[i+1])
{
k = i;
flag = true;
break;
}
}
if(flag==false)
{
return false;
}
//step2
for(i = n-1 ; i > k ; --i)
{
if(arg[i] > arg[k])
{
j = i;
break;
}
}
//step3
swap(arg[k],arg[j]);
for(start = k+1,end=n-1 ; start<end ; ++start,--end)
{
swap(arg[start],arg[end]);
}
return true;
}
void perm3(int *arg,int n)
{
int myarg[n];
int i;
for(i = 0;i < n; ++i)
{
myarg[i] = i;
}
//print
while(true)
{
if(nextstate(myarg,n))
{
//print
}
else
{break;}
}
}
</code></pre>
<p>下图是运行的结果(12个元素的全排列):</p>
<p><img alt="运行结果" src="http://zhouyichu.com/images/running-result.png" title="运行结果"/></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>这一点上我没有具体考证过,也是看到人家这么说的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这句话可能不太好理解,这里稍加解释一下:可以把每一种可能的排列序列当成一个状态,而这些状态之间是存在先后关系,这个关系就是之前所说的<strong>字典序</strong>,<strong>字典序</strong>算法就是按照从小到大的顺序遍历这些状态。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>以<span class="math">\(\{3,2,1,0\}\)</span>为例,它是一个字典序最大的序列,从这个序列中是无法找到满足条件的k的。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>其实很多算法是只可意会不可言传的,很多东西很难用语言来表达,我这里也只能结合具体的算法步骤简要说明一下。 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>矩阵论学习笔记2-线性空间和线性算子2013-09-20T00:00:00-06:002013-09-20T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-20:/matrix-theory/Theory-of-Matrices-2/<p>矩阵论学习课程笔记</p><h1>线性空间的基底变换与转移矩阵</h1>
<p>之前曾经说过,在一个线性空间中,它有着很多不同的基底,每一组基底都能唯一地刻画整个线性空间,那么,我们就要想,如果这些 <strong>不同</strong>的基底刻画的是<strong>相同</strong>的线性空间,那么这些不同的基底之间是否存在某些转化关系呢?因此,我们就引出了<strong>转移矩阵</strong>的概念:</p>
<p><strong>定义1</strong>: 设<span class="math">\([\alpha_1,\alpha_2,\cdots,\alpha_n]\)</span>和<span class="math">\([\beta_1,\beta_2,\cdots,\beta_n]\)</span>是线性空间<span class="math">\(V\)</span>的两个不同的基底,且满足</p>
<div class="math">$$
\begin{equation}
[\beta_1,\beta_2,\cdots,\beta_n]=[\alpha_1,\alpha_2,\cdots,\alpha_n]P
\end{equation}
$$</div>
<p>其中<span class="math">\(P=[p_1,p_2,\cdots,p_n]\)</span>,其第i列是<span class="math">\(\beta_i\)</span>在<span class="math">\([\alpha_1,\alpha_2,\cdots,\alpha_n]\)</span>下的坐标,P是可逆的<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,则称P是由基底<span class="math">\([\alpha_1,\alpha_2,\cdots,\alpha_n]\)</span>到<span class="math">\([\beta_1,\beta_2,\cdots,\beta_n]\)</span>的<strong>转换矩阵</strong></p>
<p>上述 <strong>转移矩阵</strong>表达的是两个不同基底之间的转化关系,那我们不禁又要问:在这两个基底下的坐标表示又有什么联系呢?</p>
<p>我们可以做一下推导:</p>
<p>设<span class="math">\(s=[\alpha_1,\alpha_2,\cdots,\alpha_n]x\)</span>且<span class="math">\(s=[\beta_1,\beta_2,\cdots,\beta_n]y\)</span>,其中<span class="math">\(x,y\)</span>分别表示在向量<span class="math">\(s\)</span>在<span class="math">\([\alpha_1,\alpha_2,\cdots,\alpha_n]\)</span>和<span class="math">\([\beta_1,\beta_2,\cdots,\beta_n]\)</span>下的坐标,根据上面对<strong>转移矩阵</strong>的定义,我们可以得到:</p>
<div class="math">$$
\begin{align}
s&=[\beta_1,\beta_2,\cdots,\beta_n]y=[\alpha_1,\alpha_2,\cdots,\alpha_n]x=[\alpha_1,\alpha_2,\cdots,\alpha_n]Py\\
&\Rightarrow [\alpha_1,\alpha_2,\cdots,\alpha_n](x-Py)=0
\end{align}
$$</div>
<p>又因为<span class="math">\([\alpha_1,\alpha_2,\cdots,\alpha_n]\)</span>是线性无关的(非奇异)的,所以<span class="math">\(x-Py=0\Rightarrow x=Py\)</span>,这就是向量<span class="math">\(s\)</span>在向量空间<span class="math">\(V\)</span>中两个不同基底下的<strong>坐标转换关系</strong>。</p>
<p>得出了这样的转换关系,同一个线性空间中的元素就能在不同的基下自由转化了,一般来说,在平时使用的时候,我们都默认是在 <strong>自然基底</strong>下的坐标,对于二维空间来说,自然基底是<span class="math">\([\{1,0\},\{0,1\}]\)</span>,而三维空间则是<span class="math">\([\{1,0,0\},\{0,1,0\},\{0,0,1\}]\)</span>.</p>
<h1>线性算子</h1>
<p><strong>定义2</strong>: 设<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>都是数域<span class="math">\(F\)</span>上的线性空间,若映射<span class="math">\(T:X\to Y\)</span>满足条件:</p>
<ol>
<li><span class="math">\(T(x_1+x_2)=Tx_1+Tx_2\)</span> <span class="math">\(\left(\forall x_1,x_2\in X\right)\)</span></li>
<li><span class="math">\(T(\lambda x)=\lambda Tx\)</span> <span class="math">\(\left(\forall \lambda\in F,x\in X\right)\)</span></li>
</ol>
<p>则称<span class="math">\(T\)</span>是从<span class="math">\(X\)</span>到<span class="math">\(Y\)</span>的<strong>线性算子</strong>(或者<strong>线性映射</strong>)<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">2</a></sup></p>
<p>对于<span class="math">\(Tx=y\)</span>来说,x称为<strong>原像</strong>,y称为<strong>像</strong>,<span class="math">\(X\)</span>称为<strong>定义域</strong>,<span class="math">\(Y\)</span>称为<strong>值域</strong>(事实上值域并没有"充满"<span class="math">\(Y\)</span>,也就说,<span class="math">\(X\)</span>中的每一个元素都可以通过映射<span class="math">\(T\)</span>映射到<span class="math">\(Y\)</span>中的元素,但是并不是说<span class="math">\(Y\)</span>中的每一个元素都有一个<span class="math">\(X\)</span>中的元素与其对应。)</p>
<h2>特殊的线性算子</h2>
<p>线性空间<span class="math">\(X\)</span>到自身的线性算子称为<span class="math">\(X\)</span>上的<strong>线性变换</strong></p>
<p>线性空间<span class="math">\(X\)</span>到数域<span class="math">\(F\)</span>的线性算子称为<span class="math">\(X\)</span>上的<strong>线性泛函</strong></p>
<h2>线性算子的性质</h2>
<ol>
<li><span class="math">\(T(0)=0,T(-x)=-T(x) \forall x\in X\)</span></li>
<li><span class="math">\(T(\lambda_1x_1+\lambda_2x_2+\cdots+\lambda_nx_n)=\lambda_1T(x_1)+\lambda_2T(x_2)+\cdots+\lambda_nT(x_n)\)</span></li>
<li>若<span class="math">\(\{x_1,x_2,\cdots,x_n\}\)</span>是<span class="math">\(X\)</span>中的线性相关系,则<span class="math">\(\{T(x_1),T(x_2),\cdots,T(x_n)\}\)</span>是<span class="math">\(Y\)</span>中的线性相关系</li>
<li>若<span class="math">\(\{x_1,x_2,\cdots,x_n\}\)</span>在<span class="math">\(X\)</span>中线性<strong>不</strong>相关,则<span class="math">\(\{T(x_1),T(x_2),\cdots,T(x_n)\}\)</span>在<span class="math">\(Y\)</span>中<strong>不一定</strong>线性相关</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>根据基底和坐标的定义,坐标是唯一的,因此<span class="math">\(P\)</span>中每一列都是线性无关的,所以<span class="math">\(P\)</span>是非奇异的,也即是可逆的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>其实<strong>线性算子</strong>就是一个转换过程,将一个元素从一个空间转换到另一个空间。需要注意的是,这样的映射有很多,但只有满足上述两个条件的映射才能被称为是<strong>线性算子</strong> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>矩阵论学习笔记1-线性子空间2013-09-16T00:00:00-06:002013-09-16T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-16:/matrix-theory/Theory-of-Matrices-1/<p>矩阵论学习课程笔记</p><p><strong>定义1:</strong> 设V是数域上的线性空间,W是V的一个非空子集。如果W关于V的加法与数量运算也组成数域F上的线性空间,我们则称W是V的一个子空间。</p>
<p>上面这个定义是非常数学化的,其实,通俗来说,线性空间V的子空间就是它自己的一个子集,并且这个子集上的元素满足V中元素的运算性质。这个定义不难理解,简单的例子就是三维空间和二维平面的关系。</p>
<h1>生成子空间</h1>
<p><strong>定义2:</strong> 设<span class="math">\(x_1,x_2,\cdots,x_n\)</span>是线性空间V中的元素,令<span class="math">\(W=\{k_1x_1+k_1x_1+\cdots+k_n x_n\| k_i\in F\}\)</span>,则称集合W是由向量系<span class="math">\(x_1,x_2,\cdots,x_n\)</span>的<strong>生成子空间</strong>,记为<span class="math">\(W=span\{x_1,x_2,\cdots,x_n\}=\{k_1x_1+k_2x_2+\cdots+k_n x_n\|k_i\in F\}\)</span></p>
<p>上面这个定义也是很好理解的,其实 <strong>生成子空间</strong>是原空间中某些元素(称为<strong>向量系</strong>)的所有线性组合所形成空间。注意,此处的<strong>向量系</strong>不一定是线性无关的,这里的向量系指的是所有的向量系。</p>
<h1>一些特殊的子空间</h1>
<p><strong>交空间</strong>: <span class="math">\(W_1\cap W_2=\{\alpha\|\alpha\in W_1且\alpha\in W_2\}\)</span></p>
<p><strong>和空间</strong>: <span class="math">\(W_1+W_2=\{\alpha+\beta\|\alpha\in W_1,\beta\in W_2\}\)</span></p>
<p>其中<span class="math">\(W_1\)</span>,<span class="math">\(W_2\)</span>是V的子空间,可以证明,<span class="math">\(W_1\cap W_2\)</span>和<span class="math">\(W_1+W_2\)</span>也是V的子空间,此处只对<span class="math">\(W_1+W_2\)</span>做出简略证明:</p>
<p>设<span class="math">\(x,y\in W_1+W_2\)</span>,<span class="math">\(A,B\in F\)</span>,根据<span class="math">\(W_1+W_2\)</span>的定义,我们可以得到:</p>
<div class="math">$$
\begin{align}
x&=a_1\alpha_1+b_1\beta_1,\alpha_1\in W_1,\beta_1\in W_2 \\
y&=a_2\alpha_2+b_2\beta_2,\alpha_2\in W_1,\beta_2\in W_2
\end{align}
$$</div>
<p>在上式中,<span class="math">\(a_1,b_1,a_2,b_2\in F\)</span>,所以:</p>
<div class="math">$$
\begin{align}
Ax+By&=Aa_1\alpha_1+Ab_1\beta_1+Ba_2\alpha_2+Bb_2\beta_2\\
&=\left(Aa_1\alpha_1+Ba_2\alpha_2\right)+\left(Ab_1\beta_1+Bb_2\beta_2\right)
\end{align}
$$</div>
<p>又因为<span class="math">\(\alpha_1,\alpha_2\in W_1\)</span>,<span class="math">\(\beta_1,\beta_2\in W_2\)</span>,所以<span class="math">\(Aa_1\alpha_1+Ba_2\alpha_2\in W_1\)</span>,<span class="math">\(Ab_1\beta_1+Ba_1\beta_2\in W_2\)</span>,因此:</p>
<div class="math">$$
Ax+By\in W_1+W_2
$$</div>
<p>证闭<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<p>需要注意的是:每个线性空间都至少有2个子空间,一个是其<strong>自身</strong>,另一个是仅有零元素组成的子空间称为<strong>零子空间</strong>,这两个子空间称为<strong>平凡子空间</strong>。</p>
<p>还两个比较特殊的子空间:</p>
<p><strong>A的零空间(<span class="math">\(N(A)\)</span>)</strong>: <span class="math">\(N(A)=\{x | Ax=0,x\in F^n\}\)</span></p>
<p><strong>A的象空间(<span class="math">\(R(A)\)</span>)</strong>: <span class="math">\(R(A)=\{y\in F^n | y=Ax,\forall x\in F^n\}\)</span></p>
<p>这里需要注意的是, <strong><span class="math">\(N(A)\)</span>是满足条件的<span class="math">\(x\)</span>的集合,而<span class="math">\(R(A)\)</span>是所有<span class="math">\(Ax\)</span>的集合。</strong></p>
<h1>直接和空间</h1>
<p>上面我们定义了 <strong>和空间</strong>的概念,简单来说,就是<strong>和空间</strong>中的任意一个元素都可以表示成另外两个线性空间元素的和,即</p>
<div class="math">$$
\begin{equation}
\alpha = \alpha_1+\alpha_2,\alpha_1\in V_1,\alpha_2\in V_2
\end{equation}
$$</div>
<p>但是这样的表示并不是唯一的,如果说我们需要一个能够唯一的表示,那么有如下的定义</p>
<p><strong>定义3</strong>: 如果<span class="math">\(V_1+V_2\)</span>中任一向量只能唯一地表示为子空间<span class="math">\(V_1\)</span>的一个向量与子空间<span class="math">\(V_2\)</span>的一个向量的和,则称<span class="math">\(V_1+V_2\)</span>为<strong>直接和</strong>,记为<span class="math">\(V_1\oplus V_2\)</span></p>
<p><strong>定理</strong>: <span class="math">\(V_1+V_2\)</span>为<strong>直接和</strong>的充要条件是:<span class="math">\(V_1\)</span>与<span class="math">\(V_2\)</span>之交<span class="math">\(V_1\cap V_2\)</span>为零空间,即<span class="math">\(V_1\cap V_2 = \{0\}\)</span><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>
<p><strong>直接和</strong>的几何意义可以这么理解:从<span class="math">\(V_1\)</span>,<span class="math">\(V_2\)</span>中任意取出两个非零元素<span class="math">\(x,y\)</span>,则<span class="math">\(x\)</span>与<span class="math">\(y\)</span>必是线性无关的。</p>
<p>关于 <strong>直接和</strong>,还有以下几个推论和定理:</p>
<p><strong>推论1</strong>: <span class="math">\(V_1+V_2\)</span>为直接和的充要条件为<span class="math">\(\dim(V_1+V_2)=\dim V_1+\dim V_2\)</span></p>
<p><strong>推论2</strong>: 设<span class="math">\(V_1+V_2\)</span>为直接和,若<span class="math">\(x_1,x_2,\cdots,x_r\)</span>是<span class="math">\(V_1\)</span>的一组基,<span class="math">\(y_1,y_2,\cdots,y_k\)</span>是<span class="math">\(V_2\)</span>的一组基,则<span class="math">\(x_1,x_2,\cdots,x_r,y_1,y_2,\cdots,y_k\)</span>是<span class="math">\(V_1\oplus V_2\)</span>的一组基。</p>
<p><strong>定理</strong>: 设<span class="math">\(V_1\)</span>是<span class="math">\(n\)</span>维线性空间<span class="math">\(V\)</span>的一个子空间,则一定存在<span class="math">\(V\)</span>的一个子空间<span class="math">\(V_2\)</span>,使得<span class="math">\(V=V_1\oplus V_2\)</span></p>
<h1>凸集的概念</h1>
<p><strong>定义4</strong>: 设<span class="math">\(C\)</span>是<span class="math">\(V\)</span>的非空子集,若<span class="math">\(\forall x,y\in C\)</span>,连接<span class="math">\(x\)</span>与<span class="math">\(y\)</span>的“线段”<span class="math">\(\lambda x+(1-\lambda)y(0\leq\lambda\leq 1)\)</span>均在<span class="math">\(C\)</span>中,即</p>
<div class="math">$$
\begin{equation}
\{\lambda x + (1-\lambda)y|x,y\in C,\lambda\in[0,1]\}\subset C
\end{equation}
$$</div>
<p>则称<span class="math">\(C\)</span>是<span class="math">\(V\)</span>中的凸集。</p>
<p><strong>凸集</strong>的直观理解是:<strong>集合中任意两点之间的连线仍然在该集合中。</strong></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>此处的证明非常简略,只是证明了<span class="math">\(W_1+W_2\)</span>是对加法封闭的,还需要证明对数乘也是封闭的,不过这个证明非常的简单,此处不再给出了。要证明一个空间是V的子空间,主要就是要证明这个子空间对加法和数乘运算时封闭的。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这个充要条件可以通过反证法来证明,此处不再给出。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Logistic回归2013-09-14T00:00:00-06:002013-09-14T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-14:/machine-learning/Logistic-Regression/<p>本文根据斯坦福公开课《机器学习》的内容,加上一些其他的资料,对Logistic回归进行了总结和归纳。</p><h1>Logistic回归</h1>
<p>在实际应用中,除了预测问题,其实更多的是 <strong>分类问题</strong>,<strong>回归问题</strong>和<strong>分类问题</strong>其实是非常相似的,主要区别是<strong>分类问题</strong>的输出变量Y是取有限个离散值的,而<strong>回归问题</strong>本质上是一个拟合问题,给定一组已知数据,选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。</p>
<p>面对两个相似的问题,我们就要考虑能否用同样的算法来解决?之前学习过<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a>,其实只要对线性回归模型稍加修改,就能将其应用到 <strong>分类问题</strong>上面了,经过修改过的<strong>线性回归模型</strong>就被称为<strong>Logistic回归</strong>。具体修改方案如下:</p>
<p>假设对应的分类目标只有两类,即<span class="math">\(y\in {0,1}\)</span>,回顾一下,在<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a>中,我们的预测函数为<span class="math">\(h\_\theta(x)\)</span>,在<strong>分类问题</strong>中,我们将其稍加修改:</p>
<div class="math">$$
h_\theta(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}
$$</div>
<p>其实就是在原来的预测函数上叠加一个<span class="math">\(g(z)\)</span>函数,而<span class="math">\(g(z)\)</span>是如此定义的:</p>
<div class="math">$$
g(z)=\frac{1}{1+e^{-z}}
$$</div>
<p>可以来看一下<span class="math">\(g(x)\)</span>函数的图像:</p>
<p><img alt="logistic函数图像" src="http://zhouyichu.com/images/logistic.png" title="logistic函数图像"/></p>
<p>从图像中可以看出,函数值是永远固定在<span class="math">\([0,1]\)</span>之内的,其实这个<span class="math">\(g(z)\)</span>函数就被称为<strong>Logistic函数</strong>或者<strong>sigmoid函数</strong>。因此,在这个<strong>Logistic函数</strong>的作用下,<span class="math">\(h\_\theta(x)\)</span>就被固定在<span class="math">\([0,1]\)</span>之内,也即<span class="math">\(h\_\theta(x)\in [0,1]\)</span>。</p>
<p>再次观察<strong>Logistic函数</strong>的图像,我们可以发现,<span class="math">\(x\)</span>越大,其函数值越接近于<span class="math">\(1\)</span>,<span class="math">\(x\)</span>越小,其函数值越接近与<span class="math">\(0\)</span>,因此我们用<span class="math">\(h\_\theta(x)\)</span>来估计每个分类的概率值,即:</p>
<div class="math">$$
p(y=1|x;\theta)=h_\theta(x)
$$</div>
<p>又因为我们的假设是一个二元分类问题,所以:</p>
<div class="math">$$
p(y=0|x;\theta)=1 - h_\theta(x)
$$</div>
<p>将上面两个等式合并:</p>
<div class="math">$$
p(y|x;\theta) = (h_\theta(x))^y(1-h_\theta(x))^{1-y}
$$</div>
<p>接着,我们可以写出参数<span class="math">\(\theta\)</span>的似然函数:</p>
<div class="math">$$
\begin{align}
L(\theta)&=p(y|X;\theta)\\
&=\prod_{i=1}^mp(y^{(i)}|x^{(i)};\theta)\\
&=\prod_{i=1}^m(h_\theta(x^{(i)}))^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}}
\end{align}
$$</div>
<p>这时,就可以依照在<a href="http://zhouyichu.com/machine-learning/Least-Squares-Probabilistic-Interpretation/" title="最小二乘法的概率解释"><strong>最小二乘法的概率解释</strong></a>中的推导过程一样,将这个关于<span class="math">\(\theta\)</span>的复杂似然函数转化为相对简单的对数函数:</p>
<div class="math">$$
\begin{align}
\ell(\theta)&=\log L(\theta)\\
&=\sum_{i=1}^my^{(i)}\log h(x^{(i)})+(1-y^{(i)})\log (1-h(x^{(i)}))
\end{align}
$$</div>
<p>现在的目标就是要使得这个似然函数最大化,可以回想一下我们在<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型"><strong>线性回归模型</strong></a>中所用的算法——<strong>梯度下降法</strong>,在此处我们也可以使用这个算法,使得<span class="math">\(\theta = \theta+\alpha\nabla\ell(\theta)\)</span>,需要注意的是,<strong>此处我们使用的加号而不是减号,因为我们要求的最大值而不是最小值。</strong></p>
<p>对<span class="math">\(\theta\)</span>中的每一个分量进行求偏导(此时为了运算的方便,暂时当做只有一组数据):</p>
<div class="math">$$
\frac{\partial}{\partial\theta_j}\ell(\theta)=\left(y\frac{1}{g(\theta^Tx)}-(1-y)\frac{1}{1-g(\theta^Tx)}\right)\frac{\partial}{\partial\theta_j}g(\theta^Tx)\label{0}
$$</div>
<p>而又因为<span class="math">\(g(z)=\frac{1}{1+e^{-z}}\)</span>,所以</p>
<div class="math">$$
\begin{align}
\frac{d}{dz}g(z)&=\frac{1}{(1+e^{-z})^2}\cdot e^{-z}\\
&=\frac{1}{1+e^{-z}}\cdot \left(1-\frac{1}{1+e^{-z}}\right)\\
&=g(z)\left(1-g(z)\right)
\end{align}
$$</div>
<p>因此式子<span class="math">\(\ref{0}\)</span>可以进行如下的推导:</p>
<div class="math">$$
\begin{align}
\frac{\partial}{\partial_j}\ell(\theta)&=\left(y\frac{1}{g(\theta^Tx)}-(1-y)\frac{1}{1-g(\theta^Tx)}\right)g(\theta^Tx)(1-g(\theta^Tx))\frac{\partial}{\partial_j}\theta x\\
&=\left[y(1-g(\theta x))-(1-y)g(\theta x)\right]\cdot x_j\\
&=(y-g(\theta^Tx))\cdot x\\
&=(y-h_\theta(x))\cdot x
\end{align}
$$</div>
<p>最终,我们得到了<strong>梯度上升法</strong>的递推公式:</p>
<div class="math">$$
\begin{equation}
\theta_j = \theta_j + \alpha(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)}\label{1}
\end{equation}
$$</div>
<p>到现在为止,我们已经得到了<strong>Logistic回归</strong>模型的学习算法了。</p>
<h1>比较</h1>
<p>这个公式<span class="math">\(\ref{1}\)</span>和<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a> 中的<strong>梯度下降法</strong>"长得"是一样的,但是其<strong>本质</strong>是完全不同的,在<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a>中,<span class="math">\(h\_\theta(x)\)</span>是一个线性函数,而在<strong>Logistic回归</strong>中,<span class="math">\(h\_\theta(x)\)</span>则不是一个线性函数,而是一个sigmoid函数。</p>
<p>在学习算法中,有三种学习模型是非常相似的,分别是<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a> 、<strong>Logistic回归</strong>和<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Perceptron/" title="感知机模型">感知机模型</a> ,它们不管在模型的建立还是在算法的求解上都非常的相似<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,但是它们之间也存在着不同的地方。</p>
<p>首先是<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/" title="线性回归模型">线性回归模型</a> ,它主要使用来对一系列的点进行拟合的,它的输出值(<span class="math">\(h\_\theta(x)\)</span>)是任意的预测值。</p>
<p>而<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Perceptron/" title="感知机模型">感知机模型</a>则是一种典型的简单分类器,它的输出值(<span class="math">\(h\_\theta(x)\)</span>)只能是固定的有限的几个类别,在二元分类问题中,其输出值(<span class="math">\(h\_\theta(x)\)</span>)只能0或1,即<span class="math">\(h\_\theta(x)\in \{0,1\}\)</span>
filename
最后是本文的主角,<strong>Logistic回归</strong>,某种程度上,我觉得它是介于上面两种模型之间的"中间模型",它的输出值(<span class="math">\(h\_\theta(x)\)</span>)虽然也是固定在有限的范围内,但是却是连续的,而不像感知机那样,全是离散的值,在二元分类中,其输出值是<span class="math">\(h\_\theta(x)\in [0,1]\)</span>。</p>
<h1>参考资料</h1>
<ul>
<li>斯坦福公开课《机器学习》第三集及其配套讲义</li>
<li><a href="http://chen.yi.bo.blog.163.com/blog/static/150621109201010301321654/">logistic回归的一些直观理解</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>其实之前我自己都一直在困惑,这个三个模型的区别到底在哪里 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>最小二乘法的概率解释2013-09-13T00:00:00-06:002013-09-13T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-13:/machine-learning/Least-Squares-Probabilistic-Interpretation/<p>最小二乘法可行性的概率分析,很多时候我们往往直接使用最小二乘法来对拟合函数做评价,而为什么要使用最小二乘法而不是其他的函数,却很少人说得清楚,本文结合斯坦福Andrew Ng教授的《机器学习》公开课,从概率角度给出一个比较合理的解释。</p><h1>最小二乘法简介</h1>
<blockquote>
<p><strong>最小二乘法</strong>(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。</p>
</blockquote>
<p>上面的定义是摘自<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95">维基百科</a>,在实际拟合应用中,而我个人直观的理解就是,最小二乘法是一个<strong>评价函数(标准)</strong>,用来评价我们得到的拟合曲线是否是最好的。最小二乘法的函数表示为:</p>
<div class="math">$$
\min\sum_i^n(y_m^{(i)}-y^{(i)})^2 \label{least squares}
$$</div>
<p>其中<span class="math">\(y\_m\)</span>表示我们拟合函数得到的拟合结果,<span class="math">\(y\_i\)</span>表示真实值。</p>
<h1>为什么是这个函数</h1>
<p>首先假设我们有这样的数据集:<span class="math">\((\vec{x\_0},y\_0),(\vec{x\_1},y\_1),\cdots (\vec{x\_m},y\_m)\)</span>,<span class="math">\(\vec{x}\)</span>是当前实例的一个特征向量,<span class="math">\(y\)</span>是对应的输出,m是数据集的大小。拟合问题的目标通常是寻找到一个函数,能够很好的描述这些点的分布情况。最简单的情况就是一条直线,然而在实际应用要复杂得多,数据是高维的。</p>
<p>面对一个高维的拟合问题,我们通常假设一个参数向量<span class="math">\(\vec{\theta}\)</span>,则预测输出为:</p>
<div class="math">$$
y_m^{(i)} = \vec{\theta^T}x^{(i)}
$$</div>
<p>拟合问题的目标就是寻找一个合适的<span class="math">\(\theta\)</span>值,使得上面的公式<span class="math">\(\ref{least squares}\)</span>到达最小。</p>
<p>那么为什么要选择这个函数而不是其他函数呢,为了回答这个问题,我们又要进行假设了,假设输入<span class="math">\(\vec{x^{(i)}}\)</span>和输出<span class="math">\(y^{(i)}\)</span>之间的真实关系是这样的:</p>
<div class="math">$$
y_m^{(i)} = \vec{\theta^T}x^{(i)} + \epsilon^{(i)}
$$</div>
<p>其中<span class="math">\(\epsilon^{(i)}\)</span>称为<strong>错误项(error term)</strong>,表示当前实例所有没有被特征值表达出来的影响因素(也可以理解成噪音)。我们进一步假设<span class="math">\(\epsilon^{(i)}\)</span>是独立同分布的,因此,根据中心极限定理,这个<span class="math">\(\epsilon^{(i)}\)</span>应该满足标准的正态分布,即:</p>
<div class="math">$$
\epsilon^{(i)}\sim \mathcal{N}(0,\sigma^2)
$$</div>
<p>所以<span class="math">\(\epsilon^{(i)}\)</span>的密度函数可以写成:</p>
<div class="math">$$
p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(\epsilon^{(i)})^2}{2\sigma^2}}
$$</div>
<p>所以我们可以得到:</p>
<div class="math">$$
p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}}
$$</div>
<p>此处<span class="math">\(p(y^{(i)}\|x^{(i)};\theta)\)</span>表示在给定<span class="math">\(x^{(i)}\)</span>并且参数为<span class="math">\(\theta\)</span>的情况下,<span class="math">\(y^{(i)}\)</span>的分布情况<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。 注意,此时<span class="math">\(\theta\)</span>不是一个随机变量,而应该看成一个固定的值(虽然此时我们并不知道<span class="math">\(\theta\)</span>具体是多少)。</p>
<p>用<span class="math">\(X\)</span>表示所有数据组成的矩阵(<span class="math">\(x^{(i)}\)</span>是一个向量),用<span class="math">\(\vec{y}\)</span>表示所有<span class="math">\(y^{(i)}\)</span>组成的向量,那么我们就可以得到<strong>似然函数</strong>:</p>
<div class="math">$$
\begin{align}
L(\theta)&=L(\theta;X,\vec{y})=p(\vec{y}|X;\theta)\\
&=\prod_{i=1}^mp(y^{(i)}|x^{(i)};\theta) \\
&=\prod_{i=1}^m\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}} \label{difficulty}
\end{align}
$$</div>
<p>为了最大程度的使拟合符合真实情况,我们尽可能的使<span class="math">\(L(\theta)=p(\vec{y}\|X;\theta)\)</span>达到最大,也就是说在给定<span class="math">\(x^{(i)}\)</span>的情况下,使得<span class="math">\(y^{(i)}\)</span>的概率最大。</p>
<p>但是公式<span class="math">\(\ref{difficulty}\)</span>太过复杂,不好处理,因此我们可以将求<span class="math">\(L(\theta)\)</span>的最大值转化为求<span class="math">\(logL(\theta)\)</span>的最大值<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">2</a></sup>,所以:</p>
<div class="math">$$
\begin{align}
\mathcal{L}(\theta)&=\log L(\theta) \\\\
&= \log \prod_{i=1}^m\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}}\\\\
&=\sum_{i=1}^m \log \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}}\\\\
&=m\log \frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{\sigma^2}\cdot\frac{1}{2}\sum_{i=1}^m(y^{(i)}-\theta^Tx^{(i)})^2 \label{final}
\end{align}
$$</div>
<p>最终,最大化<span class="math">\(\mathcal{L}\)</span>就可以转化成为最小化<span class="math">\(\frac{1}{2}\sum_{i=1}^m(y^{(i)}-\theta^Tx^{(i)})^2\)</span>,这个公式是不是有点眼熟呢?就是上面最开始给出的最小二乘法(公式<span class="math">\(\ref{least squares}\)</span>)的函数形式!</p>
<h1>总结</h1>
<p>本文是根据斯坦福大学的Andrew Ng教授的《机器学习》的公开课整理而成的,首先从假设误差项符合正态分布<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">3</a></sup>开始,一步一步推导,最终证明最小二乘法的有效性。最小二乘法是一个非常常见的数学优化技术,如果了解其存在的原因,对以后学习和使用都有很大的益处。
endmath </p>
<h1>参考资料</h1>
<ul>
<li>斯坦福《机器学习》公开课第三集及其配套讲义</li>
<li><a href="http://blog.sciencenet.cn/blog-430956-621997.html">最小二乘法?为神马不是差的绝对值</a></li>
<li><a href="http://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83">维基百科:正态分布</a></li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>此处的原文是: "<span class="math">\(p(y^{(i)}\|x^{(i)};\theta)\)</span> indicates that this is the distribution of <span class="math">\(y^{(i)}\)</span> given <span class="math">\(x^{(i)}\)</span> and parameterized by <span class="math">\(\theta\)</span>" <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>此处利用了对数函数<span class="math">\(\log\_n xy = \log\_n x + \log\_n y\)</span>的性质 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>正态分布真的是一个非常神奇的东西,生活中很多事情背后都隐含着正态分布的身影,更多内容可以查看 <a href="http://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83 正态分布">这里</a> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>矩阵论学习笔记0-线性空间2013-09-10T00:00:00-06:002013-09-10T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-10:/matrix-theory/Theory-of-Matrices-0/<p>矩阵论课程的学习笔记</p><p>本人觉得自己的数学功底一向很差,总是觉得在被数学折磨,本学期学校开了一门矩阵论的课,学工科的朋友都知道矩阵这个东西在工程运算,计算机算法中起着非常重要的作用,为了克服自己的短板,我决定把每次课学到的东西都以博客的方式记录下来,加深自己的理解。由于上课的教授非常强调知识产权的问题,我在写博客的时候会尽量回避上课讲义上的内容,用自己的理解将内容描述出来。</p>
<p>本文是第一次上课的内容,主要是一些具体的定义。</p>
<h1>数环</h1>
<p><strong>定义1</strong> 设Z为非空数集且其中任何两个数的和、差与积(注意,这里<em>没有商</em>)仍属于Z,则称Z是一个<strong>数环</strong>。</p>
<p>数学上还有关于"环"的定义,环的定义和数环有点类似,但是它是定义在<strong>任何集合</strong>上的,而数环是定义在<strong>数集</strong>上的,并且它的和、差、积运算并不一定是指一般意义上的加减乘。环具体的定义可以查看参考资料2。<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<p>数环上有如下的性质:</p>
<ol>
<li>任何数环都包含数零,即零环是数环中最小的数环。(<em>这个性质很重要</em>)</li>
<li>设S是一个数环。若<span class="math">\(a\in S\)</span>,则<span class="math">\(na\in S(n\in Z)\)</span></li>
<li>若M,N都是数环,则<span class="math">\(M\cap N\)</span>也是数环。</li>
</ol>
<h1>数域</h1>
<p><strong>定义2</strong> 如果F是至少含有两个互异数的数环,并且其中任意两个数a与b之商(<span class="math">\(b\neq 0\)</span>)仍然属于F,则F是一个数域。</p>
<p>数域的定义是在数环之上的,在数环的基础之上增加了商的运算,可以说数域是数环的一个特殊情况。</p>
<p>数域的性质:</p>
<ul>
<li>任何数域都包含有<strong>理数域Q</strong>,即Q是最小的数域。<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></li>
</ul>
<p>常用的数域有:复数域<span class="math">\(C\)</span>,实数域<span class="math">\(R\)</span>,有理数域<span class="math">\(Q\)</span></p>
<h1>线性空间</h1>
<p><strong>定义3</strong> 设V是一个非空集合,F是一个数域,在集合V的元素之间定义一种代数运算,叫做加法;这就是说,给出了一个法则,对于V中任意两个元素x和y,在V中都有唯一的一个元素z与他们对应,称为x与y的和,记为z=x+y.在数域F与集合V的元素之间还定义了一种运算,叫做数量乘法;这就是说,对于数域F中任一数k与V中任一元素x,在V中都有唯一的一个元素y与他们对应,称为k与x的数量乘积,记为<span class="math">\(y=kx\)</span>。如果加法与乘法还满足下述规则,那么V称为数域F上的<strong>线性空间</strong>.<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup></p>
<p>对加法满足:</p>
<ol>
<li>(交换律) <span class="math">\(x+y=y+x\)</span>;</li>
<li>(结合律) <span class="math">\((x+y)+z=x+(y+z)\)</span></li>
<li>(零元素) 在V中有一元素0,对于V中任一元素x都有<span class="math">\(x+0=x\)</span></li>
<li>(负元素) 对于V中每一个元素x,都有V中的元素y,使得<span class="math">\(x+y=0\)</span></li>
</ol>
<p>对数量乘法满足:</p>
<ol>
<li><span class="math">\(1x=x\)</span></li>
<li><span class="math">\(k(lx)=(kl)x\)</span></li>
</ol>
<p>数量乘法和加法满足:</p>
<ol>
<li><span class="math">\((k+l)x=kx+lx\)</span></li>
<li><span class="math">\(k(x+y)=kx+ky\)</span></li>
</ol>
<p>其中x,y,z为V中任意元素,k,l为数域F中的任意元素,1是F的乘法单位元。
数域F称为线性空间V的<strong>系数域</strong>或<strong>基域</strong>,F中元素称为<strong>纯量</strong>或<strong>数量(scalar)</strong>,V中元素称为<strong>向量(vector)</strong>。
当系数域F为实数域时,V称为实线性空间。当F为复数域时,V称为复线性空间。</p>
<p>需要注意的是,此处加法和数量乘法并不一定是传统意义上的加法和数量乘法,比如:</p>
<blockquote>
<p><span class="math">\(\forall a,b\in R+\)</span>及<span class="math">\(\forall k\in R\)</span>,定义加法为<span class="math">\(a\oplus b=ab\)</span>, 数量乘法为<span class="math">\(k\otimes a=a^k\)</span></p>
</blockquote>
<p>可以证明<span class="math">\(R^+\)</span>对于上述定义的加法<span class="math">\(\oplus\)</span>和数乘运算<span class="math">\(\otimes\)</span>是一个线性空间。<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup></p>
<p>事实上,可以将<strong>线性空间</strong>看成是一种满足一定条件的集合,而这个条件就是上述所说的对该集合上元素进行加法和数乘的约束条件。</p>
<h1>线性组合</h1>
<p><strong>定义4</strong> 设V是数域F上的<strong>线性空间</strong>,<span class="math">\(x\_1,x\_2,\cdots,x\_n\)</span>是V的向量,<span class="math">\(\lambda\_i\in F(i=1,2,\cdots,n)\)</span>。称V的元素<span class="math">\(x=\lambda\_1x\_1+\lambda\_2x\_2+\cdots+\lambda\_nx\_n\)</span>是集合<span class="math">\(x\_1,x\_2,\cdots,x\_n\)</span>的<em>线性组合</em>。</p>
<h1>线性无关</h1>
<p><strong>定义5</strong> 设V施数域F上的<strong>线性空间</strong>,<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_r(r\geq 1)\)</span>是V中的一组向量,如果存在一组不全为0的数<span class="math">\(k\_1,k\_2,\cdots,k\_f\in F\)</span>,使得<span class="math">\(k\_1\alpha\_1+k\_2\alpha\_2+\cdots+k\_r\alpha\_r=0\)</span>,则称向量组<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_r\)</span>是<em>线性相关</em>的,反之是<em>线性无关</em>的。根据<strong>线性组合</strong>和<strong>线性无关</strong>的定义,我们可以得出结论:</p>
<p><strong>V中一组向量<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_r\)</span>线性相关的充要条件是其中至少有一个向量是其余向量的线性组合。</strong></p>
<h1>维数</h1>
<p><strong>定义6</strong> 线性空间V中存在有n个<strong>线性无关</strong>的向量,而任何<span class="math">\(n+1\)</span>个向量都是<strong>线性相关</strong>的,则称V是<em>n维</em>的,记为<span class="math">\(dim(V)=n\)</span>,如果在V中可以找到任意多个线性无关的向量,则称V是<em>无限维</em>的</p>
<p>在实际应用中,常常会把有限维作为无限维的近似计算。</p>
<h1>基底</h1>
<p><strong>定义7</strong> 设V是数域F上的n维线性空间,则V中一定存在一组线性无关的向量<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_n\)</span>,使得V中任一向量都可以唯一表示成<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_n\)</span>的线性组合,则<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_n\)</span>称为V的一组<em>基底</em>.</p>
<p>基底必须满足两个条件:</p>
<ol>
<li>它是线性无关的(Linearly Independedt)</li>
<li>它的线性组合充满整个空间V(span V)</li>
</ol>
<h1>坐标</h1>
<p><strong>定义8</strong> 若<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_n\)</span>是V的一组基底,则<span class="math">\(\forall \alpha\in V\)</span>可以唯一的表示成<span class="math">\(\alpha = x\_1\alpha\_1+x\_2\alpha\_2+\cdots+x\_n\alpha\_n\)</span>,其中<span class="math">\(x\_1,x\_2,\cdots,x\_n\)</span>称为<span class="math">\(\alpha\)</span>在基<span class="math">\(\alpha\_1,\alpha\_2,\cdots,\alpha\_n\)</span>下的<em>坐标</em>.</p>
<p><strong>坐标</strong>这个概念非常重要,它给了我们表示具体向量的方法。<strong>向量</strong>最初的定义是<strong>线性空间</strong>中的元素,而<strong>线性空间</strong>是满足特定条件的一个抽象集合,对于抽象的东西,我们很难用具体的数字来表示。</p>
<p>比如,假设在一个直角坐标系中,有一个点<span class="math">\(A(1,1)\)</span>,其实这样的表述可以理解成:在一个二维的线性空间中,选择<span class="math">\((0,1)\)</span>和<span class="math">\((1,0)\)</span>作为其基底,则点A可以表示成<span class="math">\((1,1)\)</span>。</p>
<p>但是,我们也可以给它换一个基底:如果我们选择<span class="math">\((0,2)\)</span>和<span class="math">\((1,0)\)</span>作为其基底的话,则点A表示成<span class="math">\((\frac{1}{2},1)\)</span><sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup></p>
<p>因此, <strong>坐标</strong>把抽象向量和具体向量相互联系了起来,让我们能够用具体的数字来描述一个抽象的元素。</p>
<h1>参考资料</h1>
<ol>
<li><a href="http://baike.baidu.com/view/522801.htm" title="数环">百度百科:数环</a></li>
<li><a href="http://zh.wikipedia.org/wiki/%E7%8E%AF_(%E4%BB%A3%E6%95%B0)" title="环">维基百科:环</a></li>
<li><a href="http://baike.baidu.com/view/69652.htm" title="数域">百度百科:数域</a></li>
<li><a href="http://baike.baidu.com/view/545522.htm" title="线性空间">百度百科:线性空间</a></li>
<li>《Linear Algebra Done Right》</li>
</ol>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>学习这个概念的时候,经常把环和数环的定义弄混,后来才发现这其实是两个不同的定义,可以说数环是环的一个特殊情况。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>证明过程请查看参考资料3 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>这个定义是直接来自参考资料4的,上课时老师给出的定义是这样表述的:"数域F(R或C)上的集合V中定义了下列两种数学运算...",根据这个定义我的直观理解是V就是一个数域的子集,但其实并不是这样的,V是一个抽象的集合。不太明白是我自己理解不对,还是老师的PPT上表述有错误。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>这个例子来自于老师的PPT <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p><span class="math">(\left(<div class="math">\begin{array}{ccc}1\\\1\\\ \end{array}</div>\right)=\frac{1}{2}\left(<div class="math">\begin{array}{ccc}0\\\2\\\ \end{array}</div>\right)+1\left(<div class="math">\begin{array}{ccc}1\\\0\\\ \end{array}</div>\right)\)</span> <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>梯度下降法的Python实现2013-09-08T00:00:00-06:002013-09-08T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-08:/machine-learning/Gradient-Code/<p>之前的两篇文章记录梯度下降法的原理及其矩阵形式的Noraml Equation,这次用代码实现起来,以便加深理解。</p><p>之前的两篇文章记录<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/">梯度下降法的原理</a> 及其矩阵形式的<a href="http://zhouyichu.com/machine-learning/Normal-Equation/">Normal Equations</a> ,这次用代码实现起来,以便加深理解。代码中使用的具体数据来源于斯坦福公开课<a href="http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex3/ex3.html" title="Deep Leaning">网站</a>。</p>
<h1>写在前面</h1>
<p>通常进行科学计算的时候,首选工具一般都是matlab,但是我觉得matlab太过臃肿,而且matlab本身作为一种编程语言,在矩阵计算以外有着很多不便的地方,因此果断放弃matlab,转而投向Python的伟大怀抱。网上流传着这样一个等式:<strong>numpy+scipy+matplotlib = matlab</strong>,其中<strong>numpy</strong>、<strong>scipy</strong>和<strong>matplotlib</strong>都是开源的Python库,将这几个库组合起来,就能完全取代matlab,并且本身具有良好的可扩展性(Python世界中有着无数的优秀开源软件包)。更多详细资料,可以参考<a href="http://www.scipy.org/" title="Scipy">这里</a>。</p>
<h1>代码</h1>
<p>关于梯度下降法的具体Python代码如下:</p>
<pre><code>#!python
import numpy as np
import matplotlib.pyplot as plt
def H(theta,x):
return theta.dot(x)
def Read():
x = np.loadtxt('ex3x.dat')
y = np.loadtxt('ex3y.dat')
m = len(x)
t = np.ones((m,1))
x = np.concatenate((t,x),axis=1)
return (x,y,m)
#gradient的计算
def cal(alpha,theta,x,y,m):
n = x.shape[1]
newtheta = np.array([0]*n,dtype=np.float)
for j in range(0,n):
count = 0
for i in range(m):
count += (H(theta,x[i,:]) - y[i]) * x[i,j]
newtheta[j] = (theta[j] - alpha / m * count )
return newtheta
#Cost Function
def J(theta,x,y,m):
return np.transpose(x.dot(theta)-y).dot(x.dot(theta)-y)/(2*m)
#Normal Equation
def normalequation(x,y):
return np.linalg.inv(np.transpose(x).dot(x)).dot(np.transpose(x)).dot(y)
#根据不同的alpha值,画出图像
def gradent_descent():
(x,y,m) = Read()
sigma = np.std(x,0)
mu = np.mean(x,0)
#数据归一化
x[:,1] = (x[:,1]-mu[1]) / sigma[1]
x[:,2] = (x[:,2]-mu[2]) / sigma[2]
n = x.shape[1]
theta = np.array([0]*n,dtype=np.float)
j = []
alpha=0.01
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'b-',label=r'$\alpha = 0.01$')
j = []
theta = np.array([0]*n,dtype=np.float)
alpha=0.03
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'r-',label=r'$\alpha = 0.03$')
j = []
theta = np.array([0]*n,dtype=np.float)
alpha=0.1
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'y-',label=r'$\alpha = 0.1$')
j = []
theta = np.array([0]*n,dtype=np.float)
alpha=0.3
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'b--',label=r'$\alpha = 0.3$')
j = []
theta = np.array([0]*n,dtype=np.float)
alpha=1
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'r--',label=r'$\alpha = 1$')
j = []
theta = np.array([0]*n,dtype=np.float)
alpha=1.3
for i in range(50):
j.append(J(theta,x,y,m))
theta = cal(alpha,theta,x,y,m)
plt.plot(range(50),j,'y--',label=r'$\alpha = 1.3$')
plt.xlabel('Number of interations')
plt.ylabel('Cost J')
plt.legend()
plt.show()
if __name__=='__main__':
#画出图像
gradent_descent()
(x,y,m) = Read()
#利用normal equation计算theta值
theta = (normalequation(x,y))
#预测未知数据
print('predict:',end=' ')
print(H(theta,np.array([1,1650,3])))
</code></pre>
<h2>运行结果</h2>
<p><img alt="参数变化" src="http://zhouyichu.com/images/gradient-running-result.png" title="参数变化"/></p>Frog Chess问题2013-09-06T00:00:00-06:002013-09-06T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-06:/algorithm/Frog-Chess-Problem/<p>最初是在OSChina上看到的这个题目,觉得蛮有意思的,用两种搜索算法去实现了一下,现在把过程记录下来。</p><h1>问题出处</h1>
<p>我最初是在<a href="http://www.oschina.net/question/136226_122187">OSChina</a>上看到这个问题的,有人在论坛上把这个问题提了出来,寻求算法来解决。最初的问题其实是一个<a href="http://s15.photobucket.com/user/hilllynx/media/9242c12c.swf.html">Flash小游戏</a>,简单来说,就是一共有6只青蛙,左右各3只,中间还有一个空格,我们的任务是经过有限步的跳跃,将左右青蛙的位置交换。交换的时候会有一些限制条件:</p>
<ol>
<li>青蛙只能前进,不能后退</li>
<li>每次只能前进1格或2格</li>
</ol>
<p>当时试玩的时候,玩了好几次才成功……我实在太笨了<strong>-.-</strong>.</p>
<h1>用算法求解</h1>
<p>当考虑用算法求解这个问题的时候,首先要将这个题目数字化,就是如何在程序中表达这个游戏过程。如果把注意力集中在青蛙身上,一共有6只青蛙,那就是说需要设置6个变量,并且需要时刻跟踪这6个变量的变化,这样的程序难度太大了,而且如果青蛙数目继续增加的话,程序就更不好处理了,这显然不是一个好方法。我们可以换个角度来看待这个问题,不需要盯着青蛙是如何运动的,只需要盯着当中那个空格是如何运动的。因为所有的格子总会比青蛙多一个,所以我们只需要关注格子的位置就可以了。</p>
<p>因为在每次的移动过程中,空格只有四种情况:往左移动2格、往左移动1格、往右移动2格、往右移动1格。因此我把整个青蛙序列作为一个状态,每一个状态都可以经由4条不同的路径转移到下一个状态(对应于4种移动方案),这样我就能把原问题转化为一个图搜索问题:<strong>从初始状态开始,找到一条达到目标状态的路径。</strong></p>
<p>根据问题中的限制条件,空格只能和其左右2格以内的青蛙进行交换,并且空格往右移动的时候只能和原本在右边的青蛙交换,同样,往左移动的时候,只能和原本在左边的青蛙交换。因此我可以将整个青蛙序列用一个数组表示,原来在左侧的青蛙用-1表示,原来在右侧的青蛙用1表示,空格用0表示。同时,我用-2、-1、1、2分别表示空格往左移动2格,往左移动1格,往右移动1格,往右移动2格。注意,这里我使用了一个小技巧:空格能够往左(-1,-2)移动的条件是,左边要交换的位置上有一个原来在左侧(-1)的青蛙,这样的话,我只需要判断往左的代表值和青蛙的代表值是否同号,我就能判断能否进行交换了。</p>
<h1>代码</h1>
<pre><code>#!python
#深度遍历,其中order参数是用来记录路径的
def deepexplore(table,order):
index = table.index(0)
#判断是否是终点状态
if index == len(table) // 2 and sum(table[:index]) == len(table)//2:
print('Swap Complete!')
return True
#顺序尝试四条路径
for i in range(-2,3):
#判断是否越界,是否倒退
if i == 0 or index + i < 0 or index + i >= len(table) or table[index+i] * i <=0:
continue
else:
table[index+i],table[index] = table[index],table[index+i]
order.append(table[:])
if deepexplore(table,order) == True:
return True
order.pop(-1)
table[index+i],table[index] = table[index],table[index+i]
def widthexplore(table):
stack = []
stack.append((table[:],False))
while len(stack)!=0:
state = stack.pop(0)
index = state[0].index(0)
#判断是否是终点
if index == len(state[0]) // 2 and sum(state[0][:index]) == len(state[0])//2:
print('Swap Complete!')
break
for i in range(-2,3):
#判断是否越界,是否倒退
if i == 0 or index + i < 0 or index + i >= len(state[0]) or state[0][index+i] * i <=0:
continue
else:
newstate = (state[0][:],state)
newstate[0][index+i],newstate[0][index] = newstate[0][index],newstate[0][index+i]
stack.append(newstate)
#还原路径
order = []
while state[1] != False:
order.append(state[0])
state = state[1]
order.append(state[0])
order.reverse()
return order
def frogchess(n):
table = [-1] * n + [0] + [1] * n
order=[]
order.append(table[:])
deepexplore(table,order)
order.reverse()
for item in order:
print(item)
if __name__ == '__main__':
frogchess(4)
</code></pre>
<p>上述代码中,我用了两种方法进行搜索,分别是深度优先和广度优先,本来以为广度优先能够找到最少的移动序列,但是程序跑下来,广度优先除了更加耗时间以外,找到的路径和深度优先是一样的。</p>
<h1>总结</h1>
<p>本来想从数学角度来推导得到一个比较美观的公式的,可是数学功底不扎实,实在找不到什么数学原理,只能直接用程序来计算,上面的算法只是利用计算机的高速计算的特点从解空间中寻找答案。 一旦青蛙的数量有所提高,计算量就迅速增大,这样的解法就不再适合了(<span class="math">\(N>20\)</span>),应该要从数学角度寻求更优的解法。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Normal Equations2013-09-05T00:00:00-06:002013-09-05T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-05:/machine-learning/Normal-Equation/<p>基于斯坦福《机器学习》公开的内容,计算得到矩阵形式的Normal Equation。</p><p>本文主要是将上一篇<a href="http://zhouyichu.com/machine-learning/Gradient-Descent/">博文</a> 中的得出的梯度下降法的算法用矩阵进行化简,得到一个一般化的公式,最后对这两种方法进行了比较。</p>
<h1>几个结论</h1>
<p>在开始正式推导之前,我将会列出一些推导过程中需要用到的定义和结论,其中有些我会给出证明。</p>
<p>首先是关于矩阵迹的定义:一个<span class="math">\(n\times n\)</span>的矩阵<span class="math">\(A\)</span>的迹,是指<span class="math">\(A\)</span>的主对角线上各个元素的总和。迹是定义在矩阵上的一种运算,它是一个实数。</p>
<p>关于矩阵的迹,它有以下几个结论:</p>
<ol>
<li><span class="math">\(trAB=trBA\)</span> 推论:<span class="math">\(trABC=trCAB=trBCA\)</span></li>
<li>令<span class="math">\(f(A)=trAB\)</span><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,则<span class="math">\(\nabla_AtrAB=B^T\)</span></li>
<li><span class="math">\(trA=trA^T\)</span></li>
<li>如果<span class="math">\(a\in R\)</span>,则<span class="math">\(tra=a\)</span></li>
<li><span class="math">\(\nabla_AtrABA^TC=CAB+C^TAB^T\)</span></li>
</ol>
<p>几个结论的简略证明如下:</p>
<p><span class="math">\(trAB=trBA\)</span></p>
<p>根据矩阵乘法的运算法则,如果<span class="math">\(C=A\_{m\times n}B\_{n\times m}\)</span>,则<span class="math">\(C\_{ij}=(AB)\_{ij}=\sum\_{k=1}^nA\_{ik}B\_{kj}\)</span>。</p>
<p>所以,<span class="math">\(tr(AB)=\sum_{i=1}^m(AB)_{ii}=\sum_{i=1}^m\sum\_{k=1}^nA_{ik}B_{ki}=\sum_{k=1}^n\sum_{i=1}^mB_{ki}A_{ik}=\sum_{k=1}^n(BA)_{jj}=trBA\)</span></p>
<p>现在证明<span class="math">\(\nabla\_AtrAB=B^T\)</span></p>
<p><span class="math">\(trAB=\sum_{i=1}^n\sum_{k=1}^mA_{ik}B_{ki}=\sum_{k=1}^mA_{1k}B_{k1}+\sum_{k=1}^mA_{2k}B_{k2}\cdots\sum_{k=1}^mA_{nk}B_{kn}\)</span></p>
<p>所以,<span class="math">\(\frac{\partial trAB}{\partial A\_{ij}}=B\_{ji}\)</span></p>
<p>即,<span class="math">\(\nabla\_AtrAB=B^T\)</span></p>
<p>结论3、4、5此处就不再给出证明了。<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>
<h1>矩阵推导</h1>
<p>有了上述的准备工作,就可以开始我们的推导工作了。我们将训练数据表示成矩阵的形式:</p>
<div class="math">$$
X = \left[ \begin{array}{ccc}
\cdots (x^{(1)})^T \cdots \\\\
\cdots (x^{(2)})^T \cdots \\\\
\vdots \\\\
\cdots (x^{(n)})^T \cdots \\\\
\end{array}
\right]
$$</div>
<p>参数<span class="math">\(\theta\)</span>和输出结果<span class="math">\(y\)</span>表示成向量形式:<span class="math">\(\theta = \left[ <div class="math">\begin{array}{ccc} \theta\_1 \\\ \theta\_2 \\\ \vdots \\\ \theta\_n \end{array}</div> \right]\)</span>,<span class="math">\(y = \left[ <div class="math">\begin{array}{ccc} y^{(1)} \\\ y^{(2)} \\\ \vdots \\\ y^{(m)} \end{array}</div> \right]\)</span></p>
<p>所以<span class="math">\(X\theta-y\)</span>就可以表示成:</p>
<div class="math">$$
X\theta - y = \left[ \begin{array}{ccc}
(x^{(1)})^T\theta - y^{(1)} \\\
(x^{(2)})^T\theta - y^{(2)} \\\
\vdots \\\
(x^{(m)})^T\theta - y^{(m)} \\\
\end{array}
\right] =
\left[
\begin{array}{ccc}
h_{\theta}(x^{(1)})-y^{(1)} \\\
h_{\theta}(x^{(2)})-y^{(2)} \\\
\vdots \\\
h_{\theta}(x^{(m)})-y^{(m)} \\\
\end{array}
\right]
$$</div>
<p>根据向量的基本性质:<span class="math">\(z^Tz=\sum_{i=1}^nz_i^2\)</span>,所以:</p>
<div class="math">$$
\frac{1}{2}(X\theta-y)^T(X\theta-y)=\frac{1}{2}\sum_{i=1}^m\left[ h_{\theta}(x^{(i)})-y^{(i)} \right]^2
=J(\theta)
$$</div>
<p>因此,为了使<span class="math">\(J(\theta)\)</span>达到最小,只需要求出令<span class="math">\(\nabla\_{\theta}J(\theta)=0\)</span>时的<span class="math">\(\theta\)</span>值,这时的<span class="math">\(\theta\)</span>值就是梯度下降法中最终得到的参数值。</p>
<div class="math">$$
\begin{split}
\nabla_{\theta}\frac{1}{2}(X\theta-y)^T(X\theta-y)&=\frac{1}{2}\nabla_{\theta}tr(\theta^TX^TX\theta-\theta^TX^T\overrightarrow y-\overrightarrow yX\theta+\overrightarrow y^T\overrightarrow y)\\
& = \frac{1}{2}\nabla_{\theta}(tr\theta^TX^TX\theta-2tr\overrightarrow y^TX\theta) \\
& = \frac{1}{2}(X^TX\theta+X^TX\theta-2X^T\overrightarrow y)\\
&= X^TX\theta-X^T\overrightarrow y
\end{split}
$$</div>
<p>最终<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>,我们得到了最终的Normal Equation:<span class="math">\(X^TX\theta=X^T\overrightarrow y\)</span></p>
<p>所以,梯度下降法就转变为一个矩阵计算:<span class="math">\(\theta=(X^TX)^{-1}X^T\overrightarrow y\)</span></p>
<p>但是,需要注意的是,不要以为式子变简单了,计算量就减少了,事实上,当X的维数很高时,计算量反而更大,因为大矩阵运算会消耗很多资源。</p>
<h1>参考文献</h1>
<ul>
<li><a href="http://zh.wikipedia.org/wiki/%E8%B7%A1">维基百科:迹</a></li>
<li><a href="http://www.docin.com/p-385519319.html">豆丁网:矩阵导数和迹的性质</a></li>
<li>斯坦福《机器学习》公开课第二集及其配套讲义</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><span class="math">\(f(A)\)</span>表示一个函数,这个函数将<span class="math">\(m\times n\)</span>的矩阵<span class="math">\(A\)</span>作为输入,将一个实数<span class="math">\(trAb\)</span>作为输出。其实就是从高维到低维的一个映射:<span class="math">\(\boldsymbol{R}^{m\times n}\mapsto\boldsymbol{R}\)</span> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>3、4几乎不用证明,直接利用迹的定义就能够得出。而5的证明,老实说,我也不会,如果有哪位大神会的,请不吝赐教(-.-)。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>在上面推导过程中,利用第一节中列出的那5个结论。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>商人过河问题2013-09-04T00:00:00-06:002013-09-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-09-04:/algorithm/BusinessMan-Across-The-River/<p>商人过河问题常常出现在一些电视剧中作为考察智力的题目,其实这类问题是有迹可循的,本文将从数学建模和算法的角度来分析这一问题,给出具体的解法。</p><p>商人过河问题常常出现在一些电视剧中作为考察智力的题目,其实这类问题是有迹可循的,本文将从数学建模和算法的角度来分析这一问题,给出具体的解法。</p>
<h1>问题描述</h1>
<p>三名商人各带一个随从乘船渡河。现此岸有一小船只能容纳两人,由他们自己划行。若在河的任一岸随从人数比商人多,他们就可能抢劫财物。不过如何乘船渡河的大权由商人们掌握。商人们怎样才能安全过河呢?</p>
<h1>分析</h1>
<p>大多数人看到这类问题的第一反应就是一个方案一个方案去试,直到找到一个符合条件的方案。但是这样的寻找过程就像是没头苍蝇一样,没有章法可循。我们首先可以对原题进行建模,将原来用文字描述的问题转化为数学的语言,再从数学角度对其进行搜索。</p>
<h2>建模</h2>
<p>首先假设商人和仆人都在北岸,他们的目的地是南岸。那么我们可以用<span class="math">\((x,y)\)</span>表示在北岸的商人(<span class="math">\(x\)</span>)和仆人(<span class="math">\(y\)</span>)的人数(<span class="math">\((x,y)\in\{0,1,2,3\}\)</span>),用<span class="math">\(S_k = (x_k,y_k)\)</span>表示第k次渡河前北岸的商人和仆人的人数,称其为一个<strong>状态</strong>。用<span class="math">\(d_k=(u_k,v_k)\)</span>表示第k次渡河时,船上的商人和仆人的人数(<span class="math">\(\{(u_k,v_k)\| 0 < u_k+v_k<=2\}\)</span>)。将<span class="math">\(d_k\)</span>称为一次<strong>转移</strong>。因为k为奇数时,是从北岸到南岸,而k为偶数时是从南岸到北岸,所以<span class="math">\(S_k\)</span>随<span class="math">\(d_k\)</span>的变化规律是:</p>
<div class="math">$$
S_{k+1}=S_k+(-1)^kd_k
$$</div>
<p>对于状态<span class="math">\(S_k\)</span>和转移<span class="math">\(d_k\)</span>来说,它必须满足以下三个条件,才能被称为是<strong>允许转移集合</strong>:</p>
<ol>
<li><span class="math">\(x_k >= y_k\)</span></li>
<li><span class="math">\(x_k+(-1)^ku_k >= y_k+(-1)^kv_k\)</span></li>
<li><span class="math">\(3-x_k+(-1)^ku_k >= 3-y_k+(-1)^kv_k\)</span></li>
</ol>
<p>第一个条件是保证渡河前北岸商人数不小于仆人数,第二个条件是保证渡河后北岸的商人数不小于仆人数,第三个条件是保证渡河后,南岸的商人数不小于仆人数。</p>
<p>因此,原问题就转化为,寻找一个转移序列<span class="math">\(\{d_k\|k=1,2...n\}\)</span>,使得<span class="math">\(S_k\)</span>由初始状态<span class="math">\(S_1=(3,3)\)</span>经有限步n到达状态<span class="math">\(S_n=(0,0)\)</span>,并且中间的每一次转移都属于<strong>允许转移集合</strong>。<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>
<h2>求解</h2>
<p>那么,我们应该如何来寻找这样一个转移序列<span class="math">\(d_k\)</span>呢?这其实是一个多步决策问题,但也可以把它看成一个图的问题。在直角坐标系中,将每一个状态<span class="math">\(S_k\)</span>对应于图中的每一个点,如图所示:</p>
<p><img alt="商人过河" src="http://zhouyichu.com/images/across-the-river.png" title="商人过河"/></p>
<p><span class="math">\(d_k\)</span>表示沿着方格移动1格或2格,当k为奇数时,向左,下方移动,k为偶数时,向右、上方移动。这样,我们的任务就变成了寻找从<span class="math">\(S_1=(3,3)\)</span>到原点<span class="math">\((0,0)\)</span>的一条路径,且这条路径上的每一次转移都属于<strong>允许转移集合</strong>。</p>
<h2>算法</h2>
<p>有了上述的思路以后,求解该问题就变得简单了,只要利用图论算法中的最简单的广度或深度遍历就行了<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>,唯一的不同是,在遍历每一个点的时候,都需要判断一下此次转移是否满足上述的三个条件。</p>
<p>最后贴出代码:</p>
<pre><code>#!python
#coding:utf-8
"""
Author: Flyaway - flyaway1217@gmail.com
Date: 2013-08-12 13:57:31
Last modified: 2013-08-12 14:52:47
Python release: 3.3.2
"""
def issafe(state,d):
if state[1] > state[0] and state[0] != 0:
return False
elif state[1] + d[1] > state[0] + d[0] and state[0] + d[0] !=0:
return False
elif 3 - (state[1] + d[1]) > 3 - (state[0] + d[0]) and 3 - (state[0] + d[0]) != 0 :
return False
else:
return True
def explore(state,num,order,lastmove=(0,0)):
#设置递归层数限制,否则会进入无限递归
if num >= 20:
return False
if state == (0,0):
order.append(state)
return True
#运输规则
d = [(0,1),(0,2),(1,0),(1,1),(2,0)]
for item in d:
if item == lastmove:
continue
realitem = (item[0] * ((-1)**num) , item[1] * ((-1)**num))
if issafe(state,realitem) == True:
nextstate = ( (state[0] + realitem[0]) , ( state[1] + realitem[1]) )
if explore(nextstate,num+1,order,item) == True:
order.append(state)
return True
def main():
state = (3,3)
order = []
explore(state,1,order)
print(order)
if __name__ == '__main__':
main()
</code></pre>
<h1>参考资料</h1>
<ul>
<li>《数学建模》姜启源</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>在这个具体的题目中,由于商人人数和仆人人数都是相对较小的,<strong>允许转移集合</strong>是可以被穷举列出来的,但是如果是m个商人和n个仆人的时候,那就只能通过上述三个条件来进行判断了。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>我在网上看到有人用的是Dijkstra算法,Dijkstra算法是用来计算固定点到图中其他所有定点的最短路径,而我们的题目中只需要计算两个固定点之间的路径,使用Dijkstra的话,似乎有些“大材小用”了。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Vim自动插入文件头部2013-07-04T00:00:00-06:002013-07-04T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-07-04:/vim/Vim-Insert-Title/<p>Vim一向以可高度定制而著称的,平时在写程序的时候,总是需要插入一些文件的头部信息,每次手打都嫌太麻烦,作为一个coder,所有重复的操作都应该用程序来实现。</p><p>Vim一向以可高度定制而著称的,平时在写程序的时候,总是需要插入一些文件的头部信息,每次手打都嫌太麻烦,作为一个coder,所有重复的操作都应该用程序来实现。比如在用<a href="http://jekyllrb.com" title="Jekyll">Jekyll</a>写博客的时候,文章首行必须是YAML格式开头的数据,这些都是必须的但每次手工输入都觉得太麻烦了,此时,我们可以利用Vim的脚本功能来进行自动输入。由于我平时用的是Python,所以下面将以Python程序的头部信息为例。</p>
<h1>效果</h1>
<pre><code>#!python
#coding:utf-8
"""
Program:
Description:
Author: Flyaway - flyaway1217@gmail.com
Date: 2013-07-04 21:21:55
Last modified: 2013-07-04 21:22:40
Python release: 3.3.2
"""
</code></pre>
<p>上述代码就是我的每个Python文件都需要的头部信息,其中的时间信息都是Vim自动填写的,这样就省去了每次都手工修改的麻烦,而且在每次保存的时候,Vim都会自动修改<code>Last modified:</code>这一项后面的时间,避免了每次手工填写会忘记的尴尬局面。</p>
<h1>Vim代码</h1>
<p>要完成上述自动填写的功能,Vim脚本如下所示</p>
<pre><code>#!vim
function! TitleInsert()
call setline(1,"#coding:utf-8")
call append(1,'""""')
call append(2,"Program: ")
call append(3,"Description: ")
call append(4,"Author: Flyaway - flyaway1217@gmail.com")
call append(5,"Date: " . strftime("%Y-%m-%d %H:%M:%S"))
call append(6,"Last modified: " . strftime("%Y-%m-%d %H:%M:%S"))
call append(7,"Python release: 3.3.2")
call append(8,'"""')
endfunction
function! DateInsert()
call cursor(7,1)
if search('Last modified') != 0
let line = line('.')
call setline(line,"Last modified: " . strftime("%Y-%m-%d %H:%M:%S"))
endif
endfunction
:map <F2> :call TitleInsert()<CR>ggjjA
:autocmd FileWritePre,BufWritePre *.py ks|call DateInsert()|'s
</code></pre>
<h1>脚本解释</h1>
<p>上述代码中,定义了两个函数,分别是<code>DateInsert()</code>和<code>TitleInsert()</code>。<code>DateInsert()</code>用来在文件保存时插入当前日期和时间,<code>TitleInsert()</code>用来插入文件头部信息。</p>
<pre><code>#!vim
:map <F2> :call TitleInsert()<CR>ggjjA
</code></pre>
<p>上述代码是一个映射命令,将F2键映射成一系列vim命令,首先是调用<code>TitleInsert()</code>函数,<code><CR></code>表示回车,'ggjjA'表示首先回到第一行,然后下移两行,最后将鼠标定位到行末。具体的命令就不多做解释了,详细解释可以查看参考资料。</p>
<pre><code>#!vim
:autocmd FileWritePre,BufWritePre *.py call DateInsert()
</code></pre>
<p>上述代码设置了一个自动命令,每当FileWritePre或BufWritePre事件发生时,vim都是自动调用<code>DateInsert()</code>函数。FileWritePre事件表示的是当写入新文件的时触发的事件,BufWritePre事件表示的事将缓冲区写回硬盘时触发的事件。因此,每次当我们保存文件的时候,vim都会自动调用<code>DateInsert()</code>函数,以实现自动插入修改时间。</p>
<h2>TitleInsert函数</h2>
<p><code>TitleInsert()</code>函数用来插入文件的头部信息,其中调用了三个vim的内置函数,分别是<code>setline()</code>、<code>append()</code>和<code>strftime()</code>。<code>setline()</code>这个函数用来在指定行上插入内容,<code>append()</code>函数用来在指定行下一行中插入内容。利用这两个函数就可以在文件头部插入预定义的信息,如上面代码所示。而<code>strftime()</code>函数将会返回系统的当前时间,并且以参数给定的格式返回出来。vim中有着很多的内置函数,具体可以查看vim的官方手册。</p>
<p>代码中的<code>.</code>在vim中表示连接两个字符串。</p>
<h2>DateInsert函数</h2>
<p><code>DateInsert()</code>是用来在保存文件时,自动修改头部信息中的<code>Last modified</code>中的时间。</p>
<p><code>normal ms</code>表示首先调用vim在normal状态下时的命令<code>ms</code>,而<code>ms</code>表示将当前光标所在位置标识为s。</p>
<p><code>call cursor(7,1)</code>表示将光标移动到第7行第1列的位置,其中<code>cursor</code>也是一个内置函数,表示设置光标的位置。</p>
<p><code>call search('Last')</code>表示搜索字符串"Last",因为在填写<code>Program</code>和<code>Description</code>这两项时,有可能会占用很多行,因此并不能保证<code>Last modified</code>一定在第7行,所以要从第7行开始搜索关键字"Last",找到<code>Last modified</code>所在行的真正位置。<code>search()</code>也是vim内置函数。</p>
<p><code>let line = line('.')</code>表示调用<code>line()</code>函数返回当前光标所在的行号。</p>
<p>然后调用<code>setline()</code>函数,将<code>Last modified</code>后面的时间修改为当前时间。</p>
<p><code>normal 's</code>表示调用vim在normal状态下的命令<code>'s</code>,表示将光标恢复到之前标识为s的地方。</p>
<p>以上就是对上述vim脚本的说明。</p>
<h1>参考资料</h1>
<ul>
<li>vim自动给脚本加注释: <a href="http://linux.chinaunix.net/techdoc/desktop/2007/09/21/968431.shtml">http://linux.chinaunix.net/techdoc/desktop/2007/09/21/968431.shtml</a></li>
<li>vim提供的内置函数: <a href="http://hi.baidu.com/joenali/item/c3291433ae7aeb322f0f811c">http://hi.baidu.com/joenali/item/c3291433ae7aeb322f0f811c</a></li>
<li>IBM的Vim教程的第三部分: <a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/index.html">http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/index.html</a></li>
</ul>线性回归与梯度下降法2013-03-19T00:00:00-06:002013-03-19T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-03-19:/machine-learning/Gradient-Descent/<p>基于斯坦福《机器学习》公开课的内容,详细探讨了梯度下降法的来龙去脉。</p><h1>前言</h1>
<p>最近在看斯坦福的《机器学习》的公开课,这个课程是2009年的,有点老了,不过讲的还是很好的,廓清了一些我以前关于机器学习懵懂的地方。我的一位老师曾经说过:</p>
<blockquote>
<p>什么叫理解?理解就是你能把同一个事情用自己的语言表达出来,并且能让别人听得懂。</p>
</blockquote>
<p>本着这样的原则,同时也为了证明自己是"理解"的,于是决定打算在学习《机器学习》公开课的时候,写一些系列文章类巩固学到的东西。机器学习中的很多内容都是和数学推导相关的,而我本人的数学功底并不扎实,所以文章也许会写得比较慢。另外,这个系列的文章大体上是按照公开课的课程来的,但也不一定局限于它,因为同时手头还有很多其他的学习资料,学到哪里就写到哪里吧,但我也会尽量保持连贯性<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。</p>
<p>这篇文章的关注点在于 <strong>线性回归问题</strong>,重点是求解线性回归问题的<strong>梯度下降法(Gradient Descent)</strong>,之前在学习<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Perceptron/" title="感知机模型">感知机</a>的时候,使用过这个算法,并且还在<a href="http://zhouyichu.com/machine-learning/Perceptron-Implementation/" title="实现">这里</a>了它。可是那只是仅仅停留在使用的层面上,这次是要充分理解<strong>梯度下降法</strong>的原理及其计算方法。</p>
<h1>线性回归问题</h1>
<p>从数学上说, <strong>回归问题</strong>其实就是函数拟合问题:给定一些点的集合,然后用一个曲线<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>或方程去拟合,使得集合中的所有点都大致符合给出的曲线或方程。当拟合的曲线是一条直线的时候,就称为是<strong>线性回归问题</strong>。</p>
<p>回归问题的意义在于,它使得我们能够在已知数据的基础上对未知数据进行预测:通过对已知数据进行回归分析,得到一个曲线,我们就能够利用这个曲线对未知的数据进行很好的预测。其实,我们在初高中就遇到过这种问题了,只是我们当时被没有意识到这是一个回归问题。</p>
<p>例如给定两个点<span class="math">\((x_1,y_1)\)</span>,<span class="math">\((x_2,y_2)\)</span>,求过这两个点的直线。当然,现在我们的问题复杂得多,而且不仅仅局限在二维平面,很多时候都是处理高维数据。</p>
<p>举了例子<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>,现在我们有如下的数据:</p>
<table>
<thead>
<tr>
<th align="center">Living area</th>
<th align="center">bedrooms</th>
<th align="center">Price</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">2104</td>
<td align="center">3</td>
<td align="center">400</td>
</tr>
<tr>
<td align="center">1600</td>
<td align="center">3</td>
<td align="center">330</td>
</tr>
<tr>
<td align="center">2400</td>
<td align="center">3</td>
<td align="center">369</td>
</tr>
<tr>
<td align="center">1416</td>
<td align="center">2</td>
<td align="center">232</td>
</tr>
<tr>
<td align="center">3000</td>
<td align="center">4</td>
<td align="center">540</td>
</tr>
</tbody>
</table>
<p>现在的问题是,我给定一个组新的Living area 和 bedrooms数据,你能否预测正确的Price是多少?这里的数据是三维的,但是更多时候是多维的,影响房价的因素还包括很多,如有浴室的数目、有没有壁炉等。这里的输入是Living area和beadrooms,输出则是Price。</p>
<p>在统计机器学习<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>中,影响输出的因素被称为是<strong>特征(features)</strong>,输入数据称为<strong>训练集(training set)</strong>或<strong>训练数据</strong>(training data),训练数据的维度称为<strong>特征的个数</strong>。</p>
<p>因为我们的重点是线性回归问题,所以这里我们简单地假设能够拟合的方程是:</p>
<div class="math">$$
\begin{equation}
h_\theta(x)=\theta_0 + \theta_1x_1+\theta_2x_2
\end{equation}
$$</div>
<p>这里<span class="math">\(\theta_i\)</span>称为参数(也称作是权重),这里的变量是<span class="math">\(x_1\)</span>和<span class="math">\(x_2\)</span>,在我们的例子中分别代表Living area和bedrooms,<span class="math">\(h_\theta(x)\)</span>是输出值,这里是就是Price。现在任务很明确,就是根据已知的数据计算出相应的<span class="math">\(\theta_i\)</span>参数。整个过程可以用下图表示:</p>
<p><img alt="学习流程图" src="http://zhouyichu.com/images/learning-flow.png" title="学习流程图"/></p>
<p>上图是整个统计机器学习的流程,不仅仅局限于回归问题。</p>
<p>为了一般化我们的公式,可以引入一个常量<span class="math">\(x_0=1\)</span>,这样我们的公式就可以表示为:</p>
<div class="math">$$
h_{\theta}(x_{n\times 1})=\sum_{i=0}^{n}\theta_ix_i=\theta_{n\times 1}^{T}x_{n\times 1}\label{origin}
$$</div>
<p>注意,这里有几个贯穿全文的约定:</p>
<ul>
<li><span class="math">\(n\)</span>代表的是特征的个数,也就是输入数据的维度</li>
<li><span class="math">\(m\)</span>代表的是训练数据的数目</li>
<li><span class="math">\(x^{(i)}\)</span>代表第i个训练数据</li>
<li><span class="math">\(x_{i}\)</span>代表第i个特征</li>
<li>因为后面有很多公式都是向量的或矩阵的运算,为了区别开来,我会在所有表示向量或矩阵的变量的下标中注明维度。如果没有下表,则表示一个实数<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup>。</li>
</ul>
<p>现在我们已经有了一个假设的函数了,那么我们该如何衡量这个函数的好坏呢?这就要引入<strong>损失函数(cost function)</strong>,这个函数用来衡量我们的预测值和真实值之间的差距。它是这样定义的:</p>
<div class="math">$$
J(\theta_{n\times 1}) = \frac{1}{2} \sum_{i=1}^m(h_\theta(x_{n\times 1}^{(i)})-y^{(i)})^2
$$</div>
<p>这个函数很好理解,它是关于参数<span class="math">\(\theta_{n\times 1}\)</span>的函数,直观上就是(预测值-真实值)的平方,然后对每一组训练数据进行累加,用这个累加和来衡量我们学习到的函数<span class="math">\(\eqref{origin}\)</span>。这里的<span class="math">\(\frac{1}{2}\)</span>其实并不是必须的,只是为了简化后面的推导而人为的乘上一个系数,这对结果不影响。如果搞过数模的话,就知道,这其实就是<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95" title="最小二乘法">最小二乘法</a>的思想。</p>
<h1>梯度下降法</h1>
<p>现在我们的问题就转化为一个求最小值的问题了:</p>
<div class="math">$$
\begin{aligned}
& J(\theta_{n\times 1}) = \frac{1}{2} \sum_{i=1}^m(h_\theta(x_{n\times 1}^{(i)})-y^{(i)})^2 \\
& \min_{\theta}J_{\theta}
\end{aligned}
$$</div>
<p>如何求解这个问题呢?这里我们就要引入<strong>最小梯度法</strong>了。还记得当年学高数,在学到梯度的时候,记得老师曾经说过,负梯度方向是函数下降最快的方向。最小梯度法就是利用这个性质。具体的思路是:</p>
<ol>
<li>对<span class="math">\(\theta_{n\times 1}\)</span>进行赋值,这个值可以是随机的,但通常都赋值为一个全零的向量。</li>
<li>不停迭代,每次迭代都改变<span class="math">\(\theta_{n\times 1}\)</span>,使得<span class="math">\(J(\theta_{n\times 1})\)</span>按梯度下降的方向进行减少。</li>
</ol>
<p>上面的比较数学化的说法,其实比较直观的说法是这样的:想象你站在一座高山上,你想要用最短的时间下山,但是你每次只能走一步。那你需要做的就是查看你周围360度的范围,找到一个最陡峭的(下降的最快的)方向,然后转移到那个点上;转移到新的位置之后,重复相应的步骤,环顾360度,找到最陡峭的(下降的最快的)方向,然后转移过去,这样每次都是选择最陡峭的方向走,那么很快就能到达山下了。</p>
<p>这就是梯度下降法的基本思路,其中对陡峭的方向就是负梯度的方向。</p>
<p>为了更加易于理解,给出下图:</p>
<p><img alt="梯度下降" src="http://zhouyichu.com/images/gradient-descent.png" title="梯度下降"/></p>
<p>我们<span class="math">\(\theta_{n\times 1}\)</span>按照梯度下降的方向进行调整,就会使得<span class="math">\(J(\theta_{n\times 1})\)</span>往更低的方向进行变化,如上图所示,算法的结束将是在<span class="math">\(\theta_{n\times 1}\)</span>下降到无法继续下降为止。</p>
<p>其中,梯度方向由<span class="math">\(J(\theta)\)</span>对<span class="math">\(\theta\)</span>的偏导数确定。用公式来表达就是:</p>
<div class="math">$$
\theta_j = \theta_j - \alpha\frac{\partial}{\partial\theta_{j}}J(\theta_{n\times 1})
$$</div>
<p>其中<span class="math">\(\alpha\)</span>称为<strong>学习率(learning rate)</strong>,直观的意义是,在函数向极小值方向前进时每步所走的步长。太大一般会错过极小值,太小会导致迭代次数过多。</p>
<p>具体的梯度方向是(<em>此处为了方便计算,假设只有一组数据</em>):</p>
<div class="math">$$
\begin{split}
\frac{\partial}{\partial\theta_j}J(\theta_{n\times 1})&=\frac{\partial}{\partial\theta_j}\frac{1}{2}(h_{\theta}(x_{n\times 1})-y)^2\\\\
&=2 \cdot \frac{1}{2}(h_{\theta}(x_{n\times 1})-y)\cdot\frac{\partial}{\partial\theta_j}(h_{\theta}(x_{n\times 1})-y)\\\\
&=(h_{\theta}(x_{n\times 1})-y)\cdot\frac{\partial}{\partial\theta_j}\left(\sum_{i=0}^n\theta_ix_i-y\right)\\\\
&=(h_{\theta}(x_{n\times 1})-y)x_j
\end{split}
$$</div>
<p>上面式子中的<span class="math">\(j\)</span>表示的是第<span class="math">\(j\)</span>个特征。从这个推导过程就可以知道,当初我们为什么要在公式前乘上<span class="math">\(\frac{1}{2}\)</span>了。</p>
<p>这样,对于每一组训练数据,每一个特征分量<span class="math">\(\theta_j\)</span>的变化是这样的(<strong>注意:此时括号中的符号改变了,因为是负梯度的方法向</strong>):</p>
<div class="math">$$
\theta_j=\theta_j+\alpha\left(y^{(i)}-h_{\theta}(x_{n\times 1}^{(i)})\right)x_j^{(i)} \label{1}
$$</div>
<h2>批梯度下降法(bath gradient descent)</h2>
<p>在得到上面的公式之后,我们的算法也就形成了:</p>
<p><img alt="batch梯度下降" src="http://zhouyichu.com/images/batch-descent.png" title="batch梯度下降"/></p>
<p>上述算法中的式子是针对所有的训练数据的,这是从公式<span class="math">\(\ref{1}\)</span>变化而来,只是加入了一个累加的过程,此处不再证明。从公式中可以看到,每次迭代的时候,该算法都会遍历整个训练数据集,这个就被称为<strong>批梯度下降法(bath gradient descent)</strong>。需要注意的是,此处的梯度下降法是只能找到局部最优解,而非全局最优解。它有以下两个特点:</p>
<ol>
<li>得到的结果是局部最优解,这依赖于初始值</li>
<li>每次迭代它的梯度大小都在变化,且越来越趋近于0</li>
</ol>
<h2>随机梯度下降法(stochastic gradient descent)</h2>
<p>在利用<strong>批梯度下降法(bath gradient descent)</strong>进行计算的时候,你会发现,每计算一个参数分量,都需要遍历整个训练数据集,这样做的效率明显不高,因此我们有一个替代的算法:</p>
<p><img alt="随机梯度下降" src="http://zhouyichu.com/images/sgd.png" title="随机梯度下降"/></p>
<p>可以看到,这个算法每次都只利用了一组数据进行计算,这样就大大减少了计算量。这个算法称为<strong>随机梯度下降法(stochastic gradient descent)</strong>。但是,带来的相应后果就是,它最终得到的解可能是在真正的最小值的附近,而不是最小值本身。因此只有在数据量很大的情况下才会使用这个算法。</p>
<h1>参考文献及推荐阅读</h1>
<ul>
<li>斯坦福《机器学习》公开课第二集及其配套讲义</li>
<li><a href="http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html" title="机器学习中数学">机器学习中的数学</a></li>
<li><a href="http://www.cnblogs.com/jerrylead/archive/2011/03/05/1971867.html" title="对线性回归,logistic回归和一般回归的认识">对线性回归,logistic回归和一般回归的认识</a></li>
<li>《统计学习方法》李航</li>
</ul>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>之前已经发布了两篇文章,当时还没考虑到要写成系列文章,所以那两篇文章暂时不算做这个系列,以后修改之后也许会加进来。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>这里的曲线不再局限于二维的,而是高维空间的,甚至有时候会是无穷维的。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>公开课中的例子,详细可以参考公开课的讲义。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>更多的统计机器学习的内容参见<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Introduction/">这里</a>。事实上,回归问题是统计机器学习的一个分支,属于<strong>监督学习(SupervisedLearnig)</strong>的范畴。 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p>在学习的过程中,经常因为不确定这个变量是个向量还是个实数值,导致很多理解上的错误(是我太笨了吗?<code>-.-!</code>),为了方便其他人的理解,我在这里特意将向量和实数值区别开来。 <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>感知机的Python简单实现(任意维度)2013-03-14T00:00:00-06:002013-03-14T00:00:00-06:00Flyawaytag:zhouyichu.com,2013-03-14:/machine-learning/Perceptron-Implementation/<p>之前写过一篇感知机模型原理的文章,这次用Python具体实现出来,加深对模型的理解。</p><p>之前写过一篇感知机模型原理的文章,这次用Python具体实现出来,加深对模型的理解。</p>
<p>具体的模型描述请参考<a href="http://zhouyichu.com/machine-learning/Statistical-Learning-Perceptron/" title="感知机">这里</a>,这里不再说明了。唯一要强调的是,感知机模型的前提是,数据必须是<strong>线性可分</strong>的,如果线性不可分,算法是不会<strong>收敛</strong>的,最终体现就是无限的<strong>死循环</strong>,在最后的测试数据中给出一组线性不可分的数据。</p>
<pre><code>#!python
#coding:utf-8
"""
简单感知机学习算法
感知机模型:f(x)=sign(w*x+b)
算法策略:损失函数:L(w,b)=y(w*x+b)
学习算法:梯度下降法
参考书籍:《统计学习方法》——李航
@author: flyaway
@date: 2013-3-12
@Python: 2.7.3
"""
class Perceptron:
"""
感知机类,一共七个方法,分别是:
__init__:构造函数
isError:判断是不是误分点
adjust:利用梯度下降法修改参数
train:开始训练数据
add:两个向量的加法
vtimesv:两个向量的乘法
vtimesi:向量乘实数
"""
def __init__(self,eta,w0,b0,data):
"""
eta是学习率,w0是权值向量w的初值,b0是偏置b的初值
"""
self.eta = eta
self.w = w0
self.b = b0
self.data = data
def isError(self,x):
'''
用来判断是否是误分类点,如果计算结果大于0,则表示被正确分类的,否则是误分类点
'''
result=(self.vtimesv(self.w , x[:-1]) + self.b)*x[-1]
if result > 0:
return False
else:
return True
def adjust(self,x):
'''
更新权值向量w和偏置b
'''
self.w = self.add(self.w , self.vtimesi(x[:-1] , self.eta * x[-1] ))
self.b = self.b + self.eta * x[-1]
return
def train(self):
'''
开始训练数据
'''
#获得数据个数
n = len(data)
flag=True
count=0
print('-'*30)
while flag:
for i in range(0,n):
if self.isError(data[i]):
count+=1
print('No.{0} adjustment...'.format(count))
print('data:'+str(data[i]))
print('(w,b)=:'+str(self.w)+' '+str(self.b))
self.adjust(data[i])
flag=True
break
else:
flag=False
#返回训练好的模型参数
return (self.w,self.b,count)
@staticmethod
def add(x,y):
'''
计算两个向量相加,返回一个新的向量
'''
if len(x)!=len(y):
raise Exception
else:
return [x[t]+y[t] for t in range(len(x))]
@staticmethod
def vtimesv(x,y):
'''
计算两个向量相乘,返回一个实数
'''
if len(x)!=len(y):
raise Exception
else:
z = [x[t]*y[t] for t in range(len(x))]
return sum(z)
@staticmethod
def vtimesi(vector,n):
return [vector[t]*n for t in range(len(vector))]
if __name__=='__main__':
#书上的原始数据
#data = [[3,3,1],[4,3,1],[1,1,-1]]
#线性可分的测试数据
#data = [[3,3,1],[4,3,1],[1,1,-1],[2,2,-1],[5,4,1],[1,3,-1]]
#线性不可分,导致死循环
#data = [[3,3,1],[4,3,1],[1,1,-1],[1,3,-1],[2,2,1],[3,1,-1]]
data = [[3,3,1],[4,3,1],[1,1,-1],[1,3,-1],[2,2,-1],[3,1,-1]]
p = Perceptron(0.5,[0,0],0,data)
answer = p.train()
print('-'*30)
print('answer'+str(answer))
</code></pre>刚入手佳能600D2013-03-05T00:00:00-07:002013-03-05T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-03-05:/words/First-Day-of-Canon/<p>网上订的佳能600D今天刚到,迫不及待地拍了几张,在此纪念一下。</p><p>网上订的佳能600D今天刚到,迫不及待地拍了几张,在此纪念一下。</p>
<p><img alt="鸟哥私房菜" src="http://farm9.staticflickr.com/8521/8530187609_d19f64a6c3.jpg"/>
<img alt="Learning Python" src="http://farm9.staticflickr.com/8228/8531328460_2a52a8a79e.jpg"/>
<img alt="统计学习方法" src="http://farm9.staticflickr.com/8391/8530224631_482c631e92.jpg"/>
<img alt="统计学习方法" src="http://farm9.staticflickr.com/8097/8531345430_89241b00cc.jpg"/></p>
<p>这几本书是我最近在看的,由于是晚上到货,外面一片漆黑的拍不到什么照片,只能找几本书来拍拍~</p>感知机模型2013-03-02T00:00:00-07:002013-03-02T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-03-02:/machine-learning/Statistical-Learning-Perceptron/<p>感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机旨在求出将训练数据进行线性划分的分离超平面。为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。</p><p><strong>感知机(perceptron)</strong> 是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机旨在求出将训练数据进行线性划分的分离超平面。为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。</p>
<h1>感知机模型</h1>
<p><strong>定义1(感知机)</strong> 假设输入空间(特征空间)是<span class="math">\(\cal{X}\subseteq\boldsymbol{R}^n\)</span>,输出空间是<span class="math">\(\cal{Y}=\{+1,-1\}\)</span>。输入<span class="math">\(x\in\cal{X}\)</span>表示实例的特征向量,对应于输入空间(特征空间)的点,输出<span class="math">\(y\in\cal{Y}\)</span>表示实例的类别。由输入空间到输出空间的如下函数</p>
<div class="math">$$
\begin{equation}
f(x)=sign(w \cdot x+b)
\end{equation}
$$</div>
<p>称为感知机。其中,<span class="math">\(w\)</span>和<span class="math">\(b\)</span>为感知机模型参数,<span class="math">\(w\in\boldsymbol{R}^n\)</span>叫做<strong>权值(weight)</strong>或<strong>权值向量(weight vector)</strong>,<span class="math">\(b\in\boldsymbol{R}\)</span>叫做<strong>偏置(bisa)</strong><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>,<span class="math">\(w\cdot x\)</span>表示<span class="math">\(w\)</span>和<span class="math">\(x\)</span>的内积。<span class="math">\(sign\)</span>是符号函数,即</p>
<div class="math">$$
\begin{equation}
sign(x)=
\begin{cases}
+1 & x \geq 0 \\\\
-1 & x < 0
\end{cases}
\end{equation}
$$</div>
<p>感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有
<strong>线性分类器模型(linear classification model)</strong>或<strong>线性分类器(linear classifier)</strong>,即函数集合<span class="math">\(\{f|f(x)=w\cdot x+b\}\)</span><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>。</p>
<p>感知机有如下几何解释:线性方程</p>
<div class="math">$$
\begin{equation}
w\cdot x +b=0
\end{equation}
$$</div>
<p>对应于特征空间<span class="math">\(\boldsymbol{R}^n\)</span>中的一个超平面<span class="math">\(S\)</span>,其中<span class="math">\(w\)</span>是超平面的法向量,<span class="math">\(b\)</span>是超平面的截距。这个超平面将特征空间划分两个部分,位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面<span class="math">\(S\)</span>称为<strong>分离超平面(separating hyperplane)</strong>。
如图所示:</p>
<p><img alt="超平面" src="http://zhouyichu.com/images/hyperplane.png" title="超平面"/></p>
<h1>感知机学习策略</h1>
<h2>数据集的线性可分</h2>
<p><strong>定义(数据集的线性可分性)</strong> 给定一个数据集</p>
<div class="math">$$
\begin{equation}
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
\end{equation}
$$</div>
<p>其中,<span class="math">\(x_i\in\cal{X}=\boldsymbol{R}^n\)</span>,<span class="math">\(y_i\in\cal{Y}=\{+1,-1\},i=1,2,\cdots,N\)</span>,如果存在某个超平面S</p>
<div class="math">$$
\begin{equation}
w\cdot x + b = 0
\end{equation}
$$</div>
<p>能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有<span class="math">\(y_i=+1\)</span>的实例<span class="math">\(i\)</span>,有<span class="math">\(w\cdot x_i + b > 0\)</span>,对所有<span class="math">\(y_i=-1\)</span>的实例<span class="math">\(i\)</span>,有<span class="math">\(w\cdot x_i + < 0\)</span>,则称数据集<span class="math">\(T\)</span>为<strong>线性可分数据集(linearly separable data set)</strong>,否则,称数据集<span class="math">\(T\)</span>线性不可分。</p>
<h2>感知机学习策略</h2>
<p>感知机的学习的目标是找到一个能够将训练正实例点和负实例点完全正确分离的超平面,即确定感知机模型参数<span class="math">\(w\)</span>,<span class="math">\(b\)</span>,我们需要确定一个学习策略,也即定义(经验)损失函数并将损失函数极小化。</p>
<p>感知机所采用的损失函数是误分类点到超平面<span class="math">\(S\)</span>的总距离<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>。为此,首先写出输入空间<span class="math">\(\boldsymbol{R}^n\)</span>中任一点<span class="math">\(x_0\)</span>到超平面S的距离:</p>
<div class="math">$$
\begin{equation}
\frac{1}{\Vert w \Vert}\vert w \cdot x_0 + b \vert
\end{equation}
$$</div>
<p>这里,<span class="math">\(\Vert w \Vert\)</span>是<span class="math">\(w\)</span>的<span class="math">\(L_2\)</span><a href="http://zh.wikipedia.org/wiki/%E8%8C%83%E6%95%B0" title="范数">范数</a><sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>。</p>
<p>其次,对于误分类的数据<span class="math">\((x_i,y_i)\)</span>来说</p>
<div class="math">$$
\begin{equation}
-y_i(w\cdot x_i+b) > 0
\end{equation}
$$</div>
<p>成立,因为对误分点来说,<span class="math">\(y_i\)</span>与<span class="math">\((w_i\cdot x_i +b)\)</span>是异号。因此,误分类点到超平面<span class="math">\(S\)</span>的距离是:</p>
<div class="math">$$
\begin{equation}
-\frac{1}{\Vert w \Vert}y_i\vert w \cdot x_0 + b \vert
\end{equation}
$$</div>
<p>这样假设超平面S的误分类点集合为<span class="math">\(M\)</span>,那么所有误分类点到超平面<span class="math">\(S\)</span>的总距离为</p>
<div class="math">$$
\begin{equation}
-\frac{1}{\Vert w \Vert}\sum_{x_i\in M}y_i(w\cdot+b)
\end{equation}
$$</div>
<p>不考虑<span class="math">\(\frac{1}{\Vert w \Vert}\)</span>,就得到感知机学习的损失函数。<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup></p>
<p>给定训练数据集</p>
<div class="math">$$
\begin{equation}
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
\end{equation}
$$</div>
<p>其中,<span class="math">\(x_i\in\cal{X}=\boldsymbol{R}^n,y_i\in\cal{Y}=\{+1,-1\},i=1,2,\cdots,N.\)</span>。感知机<span class="math">\(sign(w \cdot x + b)\)</span>学习的损失函数定义为:</p>
<div class="math">$$
\begin{equation}
L(w,b)=-\sum_{x_i\in M}y_i(x\cdot x_i+b) \label{cost function}
\end{equation}
$$</div>
<p>其中,<span class="math">\(M\)</span>为误分点的集合。这个损失函数就是感知机学习的<strong>经验风险函数</strong>。</p>
<p>显然,损失函数<span class="math">\(L(w,b)\)</span>是非负的。如果没有误分类点,损失函数值是0,而且,误分类点越少,误分类点离超平面越近,损失函数就越小。一个特定的样本点的损失函数:在误分类时是参数<span class="math">\(w,b\)</span>的线性函数,在正确分类时是0.因此,给定训练数据集<span class="math">\(T\)</span>,损失函数<span class="math">\(L(w,b)\)</span>是<span class="math">\(w,b\)</span>的连续可导函数。</p>
<p>感知机学习的策略是在假设空间中选取使损失函数(<span class="math">\(\ref{cost function}\)</span>)最小的模型参数<span class="math">\(w,b\)</span>,即感知机模型。</p>
<h1>感知机学习算法</h1>
<h2>感知机学习算法的原始形式</h2>
<p>感知机学习算法是对以下最优化问题的算法,给定一个训练数据集</p>
<div class="math">$$
\begin{equation}
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
\end{equation}
$$</div>
<p>其中,<span class="math">\(x_i\in\cal{X}=\boldsymbol{R}^n,y\in\cal{Y}=\{-1,+1\},i=1,2,\cdots,N\)</span>,求参数<span class="math">\(w,b\)</span>,使其为以下损失函数极小化问题的解</p>
<div class="math">$$
\begin{equation}
\min_{w,b}L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b) \label{target function}
\end{equation}
$$</div>
<p>其中<span class="math">\(M\)</span>为误分类点的集合。</p>
<p>感知机的学习算法是误分类驱动的,具体采用<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E9%80%9F%E4%B8%8B%E9%99%8D%E6%B3%95" title="梯度下降法">随机梯度下降法(stochastic gradient descent)</a>。首先,任意选取一个超平面<span class="math">\((w_0,b_0)\)</span>,然后利用<strong>梯度下降法</strong>不断地极小化目标函数(<span class="math">\(\ref{target function}\)</span>)。极小化过程中不是一次使<span class="math">\(M\)</span>中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。</p>
<p>假设误分类点集合<span class="math">\(M\)</span>是固定的,那么损失函数<span class="math">\(L(w,b)\)</span>的梯度由</p>
<div class="math">$$
\begin{equation}
\nabla_{w}L(w,b)=\frac{\partial{L(w,b)}}{\partial{w}}=-\sum_{x_i\in M}y_ix_i\\\
\nabla_{w}L(w,b)=\frac{\partial{L(w,b)}}{\partial{b}}=-\sum_{x_i\in M}y_i
\end{equation}
$$</div>
<p>给出。</p>
<p>随机选取一个误分类点<span class="math">\((x_i,y_i)\)</span>,对<span class="math">\(w,b\)</span>进行更新:</p>
<div class="math">$$
\begin{equation}
w\leftarrow w+\eta y_ix_i
\end{equation}
$$</div>
<div class="math">$$
\begin{equation}
b\leftarrow b+\eta y_i
\end{equation}
$$</div>
<p>式中<span class="math">\(\eta(0\le\eta\le1)\)</span>是步长,在统计学习中又称为<strong>学习率(learning rate)</strong>。这样,通过迭代可以期待损失函数<span class="math">\(L(w,b)\)</span>不断减小,直到为0.</p>
<p><strong>算法(感知机学习算法的原始形式)</strong></p>
<p><strong>输入</strong>: 训练数据集<span class="math">\(T=\{(x_1,x_2),(x_2,y_2),\cdots,(x_N,y_N)\}\)</span>,其中<span class="math">\(x_i\in\cal{X}=\boldsymbol{R}^n,y_i\in\cal{Y}=\{-1,+1\},i=1,2,\cdots,N\)</span>;学习率<span class="math">\(\eta(0<\eta\le1)\)</span>。</p>
<p><strong>输出</strong>:<span class="math">\(w,b\)</span>;感知机模型<span class="math">\(f(x)=sign(w\cdot x+b)\)</span>。</p>
<p><strong>(1) 选取初值<span class="math">\(w_0,b_0\)</span></strong></p>
<p><strong>(2) 在训练集中选取数据<span class="math">\((x_i,y_i)\)</span></strong></p>
<p><strong>(3) 如果<span class="math">\(y_i(w\cdot x_i+b)\le 0\)</span>,则</strong></p>
<div class="math">$$
\begin{equation}
w\leftarrow w+\eta y_ix_i\\\
b\leftarrow b+\eta y_i
\end{equation}
$$</div>
<p><strong>(4) 转至(2),直至训练集中没有误分类点。</strong></p>
<p>这种学习算法直观上有如下解释:当一个实例点被误分类,即位于分离超平面的错误的一侧时,则调整<span class="math">\(w,b\)</span>的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直至超平面越过该误分类点使其被正确分类。</p>
<h2>算法的收敛性</h2>
<p>现在要证明,对于线性可分数据集感知机学习算法原始形式收敛,即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面感知机模型。
为了便于叙述,将偏置<span class="math">\(b\)</span>并入权重向量<span class="math">\(w\)</span>,记作</p>
<div class="math">$$\hat{w} = (w^T, b)^T$$</div>
<p>,同样也将输入向量加以扩充,加进常数1,记作</p>
<div class="math">$$\hat{x}=(x^T,1)^T$$</div>
<p>。这样,</p>
<div class="math">$$\hat{x}\in\boldsymbol{R}^{n+1},\hat{w}\in\boldsymbol{R}^{n+1} $$</div>
<p>,显然,</p>
<div class="math">$$\hat{w}\cdot\hat{x}=w\cdot x + b$$</div>
<p>。</p>
<p><strong>定理(Novikoff):</strong> 设训练数据集<span class="math">\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}\)</span>是线性可分的,其中<span class="math">\(x_i\in\cal{X}=\boldsymbol{R}^n,y_i\in\cal{Y}=\{-1,+1\},i=1,2,\cdots,N\)</span>,则</p>
<p>(1) 存在满足条件</p>
<div class="math">$$\Vert\hat{w}_{opt}\Vert=1$$</div>
<p>的超平面</p>
<div class="math">$$\hat{x}_{opt}\cdot\hat{x}=w_{opt}\cdot x + b_{opt}=0$$</div>
<p>将训练数据集完全正确分开;且存在<span class="math">\(\gamma>0\)</span>,对所有<span class="math">\(i=1,2,\cdots,N\)</span></p>
<div class="math">$$
\begin{equation}
y_i(\hat{w}_{opt}\cdot\hat{x}_i)=y_i(w_{opt}\cdot x_i+b_{opt})\ge\gamma\label{2.8}
\end{equation}
$$</div>
<p>(2)令</p>
<div class="math">$$R=\max_{1\le i\le N}\Vert\hat{x}_i\Vert$$</div>
<p>,则感知机算法在训练数据集上的误分类次数<span class="math">\(k\)</span>满足不等式</p>
<div class="math">$$
\begin{equation}
k\le\left(\frac{R}{\gamma}\right)^2
\end{equation}
$$</div>
<p><strong>证明</strong>
(1) 由于训练数据集是线性可分的,按照定义,存在超平面可将训练数据集完全分开,取此超平面为</p>
<div class="math">$$\hat{w}_{opt}\cdot\hat{x}=w_{opt}\cdot x + b_{opt}=0$$</div>
<p>,使</p>
<div class="math">$$\Vert\hat{w}_{opt}\Vert=1$$</div>
<p>,由于对有限的<span class="math">\(i=1,2,\cdots,N\)</span>,均有<sup id="fnref:6"><a class="footnote-ref" href="#fn:6">6</a></sup></p>
<div class="math">$$
\begin{equation}
y_i(\hat{x}_{opt}\cdot \hat{x}_i)=y_i(w_{opt}\cdot x_i + b_{opt}) > 0
\end{equation}
$$</div>
<p>所以存在</p>
<div class="math">$$
\begin{equation}
\gamma=\min_{i}{y_i(w_{opt}\cdot x_i+b_{opt})}
\end{equation}
$$</div>
<p>使</p>
<div class="math">$$
\begin{equation}
y_i(\hat{w}_{opt}\cdot\hat{x})=y_i(w_{opt}\cdot x_i + b_{opt})\ge\gamma
\end{equation}
$$</div>
<p>(2)感知机算法从</p>
<div class="math">$$\hat{w}_0=0$$</div>
<p>开始,如果实例被误分类,则更新权重。令</p>
<div class="math">$$\hat{x}_{k-1}$$</div>
<p>是第<span class="math">\(k\)</span>个误分类实例之前的扩充权重向量,即</p>
<div class="math">$$
\begin{equation}
\hat{w}_{k-1}=(w_{k-1}^T,b_{k-1})^T
\end{equation}
$$</div>
<p>则第k个误分类实例的条件是</p>
<div class="math">$$
\begin{equation}
y_i(\hat{w}_{k-1}\cdot\hat{x}_i)=y_i(w_{k-1}\cdot x_i+b_{k-1}) \le 0\label{2.10}
\end{equation}
$$</div>
<p>若<span class="math">\((x_i,y_i)\)</span>是被</p>
<div class="math">$$\hat{w}_{k-1}=(w_{k-1}^T,b_{k-1})^T$$</div>
<p>误分类的数据,则<span class="math">\(w\)</span>和<span class="math">\(b\)</span>的更新是</p>
<div class="math">$$
\begin{equation}
w_k\leftarrow w_{k-1}+\gamma y_ix_i\\\\
b_k\leftarrow b_{k-1}+\gamma y_i
\end{equation}
$$</div>
<p>即</p>
<div class="math">$$
\begin{equation}
\hat{w}_k=\hat{w}_{k-1}+\gamma y_i\hat{x}_i\label{2.11}
\end{equation}
$$</div>
<p>接下来进行两个不等式的推导</p>
<p>(1)</p>
<div class="math">$$
\begin{equation}
\hat{w}_k\cdot\hat{w}_{opt}\ge k\eta\gamma\label{2.12}
\end{equation}
$$</div>
<p>由式(<span class="math">\(\ref{2.11}\)</span>)及式(<span class="math">\(\ref{2.8}\)</span>)得</p>
<div class="math">$$
\begin{equation}
\hat{w}_k\cdot\hat{w}_{opt}=\hat{w}_{k-1}\cdot\hat{w}_{opt}+\eta y_i\hat{w}_{opt}\cdot\hat{x}_i\ge\hat{w}_{k-1}\cdot\hat{w}_{opt}+\eta\gamma
\end{equation}
$$</div>
<p>由此递推即得不等式(<span class="math">\(\ref{2.12}\)</span>)</p>
<div class="math">$$
\begin{equation}
\hat{x}_k\cdot\hat{w}_{opt}\ge\hat{x}_{k-1}\cdot\hat{w}_{opt}+\eta\gamma\ge\hat{x}_{k-2}\cdot\hat{w}_{opt}+2\eta\gamma\ge\cdots\ge k\eta\gamma
\end{equation}
$$</div>
<p>(2)</p>
<div class="math">$$
\begin{equation}
\Vert\hat{w}_{k}\Vert^2\le k\eta^2R^2\label{2.13}
\end{equation}
$$</div>
<p>由式(<span class="math">\(\ref{2.11}\)</span>)及式(<span class="math">\(\ref{2.10}\)</span>)得</p>
<div class="math">$$
\begin{equation}
\begin{split}
\Vert\hat{x}_k\Vert^2&=\Vert\hat{x}_{k-1}\Vert^2+2\eta y_i\hat{w}_{k-1}\cdot\hat{x}_i+\eta^2\Vert\hat{x}_i\Vert^2\\
&\le\Vert\hat{x}_{k-1}\Vert^2+\eta^2\Vert\hat{x}_i\Vert^2\\
&\le\Vert\hat{x}_{k-1}\Vert^2+\eta^2R^2\\
&\le\Vert\hat{x}_{k-2}\Vert^2+2\eta^2R^2\le\cdots\\
&\le k\eta^2R^2
\end{split}
\end{equation}
$$</div>
<p>结合不等式(<span class="math">\(\ref{2.12}\)</span>)及不等式(<span class="math">\(\ref{2.13}\)</span>)即得</p>
<div class="math">$$
\begin{equation}
k\eta\gamma\le \hat{w}_k\cdot\hat{w}_{opt}\le\Vert\hat{w}_k\Vert\Vert\hat{w}_{opt}\Vert\le\sqrt{k}\eta R\\
k^2\gamma^2\le kR^2
\end{equation}
$$</div>
<p>于是</p>
<div class="math">$$
\begin{equation}
k\le\left(\frac{R}{\gamma}\right)^2
\end{equation}
$$</div>
<p>定理表明,误分类的次数<span class="math">\(k\)</span>是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。当训练集线性不可分时,感知机算法不收敛,迭代结果会发生震荡。</p>
<h2>感知机学习算法的对偶形式</h2>
<p>对偶形式的基本思想是,将<span class="math">\(w\)</span>和<span class="math">\(b\)</span>表示为实例<span class="math">\(x_i\)</span>和标记<span class="math">\(y_i\)</span>的线性组合的形式,通过求解其系数而求得<span class="math">\(w\)</span>和<span class="math">\(b\)</span>。不是一般性,在原始算法中,可假设初值<span class="math">\(w_0,b_0\)</span>均为0.对误分类点<span class="math">\((x_i,y_i)\)</span>通过</p>
<div class="math">$$
\begin{equation}
w\leftarrow w+\eta y_ix_i\\\\
b\leftarrow b+\eta y_i
\end{equation}
$$</div>
<p>逐步修改<span class="math">\(w,b\)</span>,则<span class="math">\(w,b\)</span>关于<span class="math">\((x_i,y_i)\)</span>的增量分别是<span class="math">\(\alpha_iy_ix_i\)</span>。这里<span class="math">\(\alpha_i=n_i\eta\)</span>。这样,从学习过程不难看出,最后学习到的<span class="math">\(w,b\)</span>可以分别表示为<sup id="fnref:8"><a class="footnote-ref" href="#fn:8">7</a></sup></p>
<div class="math">$$
\begin{gather}
w=\sum_{i=1}^N\alpha_iy_ix_i\label{2.14}\\
b=\sum_{i=1}^N\alpha_iy_i\label{2.15}
\end{gather}
$$</div>
<p><sup id="fnref:9"><a class="footnote-ref" href="#fn:9">8</a></sup>这里<span class="math">\(\alpha_i\ge0,i=1,2,\cdots,N\)</span>,当<span class="math">\(\eta=1\)</span>时,表示第<span class="math">\(i\)</span>个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离超平面越近,也就越难正确分类。</p>
<p><strong>算法(感知机学习算法的对偶形式)</strong></p>
<p><strong>输入:</strong> 线性可分的数据集<span class="math">\(T={(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)}\)</span>,其中<span class="math">\(x_i\in\boldsymbol{R}^n,y_i\in\{-1,+1\},i=1,2,\cdots,N;\)</span>学习率<span class="math">\(\eta(0<\eta\le 1)\)</span></p>
<p><strong>输出:</strong> <span class="math">\(\alpha,b\)</span>;感知机模型<span class="math">\(f(x)=sign\left(\sum_{j=1}^N\alpha_jy_jx_j\cdot x + b\right)\)</span>。其中<span class="math">\(\alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T\)</span></p>
<p><strong>(1)<span class="math">\(\alpha\leftarrow 0,b\leftarrow 0\)</span></strong></p>
<p><strong>(2)在训练集中选取数据<span class="math">\((x_i,y_i)\)</span></strong></p>
<p><strong>(3)如果<span class="math">\(y_i\left(\sum_{j=1}^N\alpha_jy_jx_j\cdot x_i+b\right)\le 0\)</span></strong></p>
<div class="math">$$
\begin{equation}
\alpha_i\leftarrow\alpha_i+\eta\\
b\leftarrow b+\eta y_i
\end{equation}
$$</div>
<p><strong>(4)转至(2)直到没有误分类数据</strong></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>此处的<span class="math">\(w\)</span>和<span class="math">\(b\)</span>就是模型后面要学习的参数,一旦<span class="math">\(w\)</span>和<span class="math">\(b\)</span>确定了,感知机模型也就学习完成了。 <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>因为是线性分类器,所以<span class="math">\(x\)</span>都是一次幂的,高次幂的情况不考虑。 <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>其实,关于损失函数最直接的想法是误分类点的总数,但是这样的损失函数不是参数<span class="math">\(w\)</span>,<span class="math">\(b\)</span>的连续可导函数,不易优化。 <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p><span class="math">\(L_2\)</span>范数其实就是欧几里得距离,<div class="math">$$\Vert x\Vert=\sqrt{x_1^2+x_2^2\cdots+x_n^2}$$</div>。 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p>其实在这里我不太理解的是,为什么可以不考虑<span class="math">\(\frac{1}{\Vert w \Vert}\)</span>,网上查了一圈,暂时没发现什么合理的解释。先在在这里存疑吧,以后知道原因后再补上。 <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:6">
<p>因为前提是能够将数据完全分开,所以<span class="math">\(y_i\)</span>与<span class="math">\((\hat{w}_{opt}\cdot \hat{x})\)</span>永远是同号的。 <a class="footnote-backref" href="#fnref:6" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:8">
<p>误分类点<span class="math">\((x_i,y_i)\)</span>经过<span class="math">\(n_i\)</span>次修改,最终被正确分类,此时<span class="math">(<div class="math">\begin{equation}w=w_0+n_i\eta_0y_ix_i=w_0+\alpha_iy_ix_i\\\\b=b_0+n_i\eta_0y_ix_i=b_0+\alpha_iy_i\end{equation}</div>\)</span> <a class="footnote-backref" href="#fnref:8" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
<li id="fn:9">
<p>公式(<span class="math">\(\ref{2.14}\)</span>)和(<span class="math">\(\ref{2.15}\)</span>)中的<span class="math">\(N\)</span>是训练样本的数量 <a class="footnote-backref" href="#fnref:9" title="Jump back to footnote 8 in the text">↩</a></p>
</li>
</ol>
</div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>统计学习方法概论2013-02-27T00:00:00-07:002013-02-27T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-02-27:/machine-learning/Statistical-Learning-Introduction/<p>简要介绍了统计学习方法的一些基本概念,叙述了统计学习方法的大轮廓,为以后更深入的学习做好基础。</p><h1>统计学习</h1>
<h2>统计学习的特点</h2>
<p>统计学习(statistical learning)是关于计算机给予数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。统计学习也称为统计机器学习(statistical machine learning)。</p>
<p>哈尔伯特西蒙(Herbert A.Simon)曾对"学习"给出以下定义:</p>
<blockquote>
<p>如果一个系统能够通过执行某个过程改进它的性能,这就是学习</p>
</blockquote>
<h2>统计学习的对象</h2>
<p>统计学习的对象时数据(data)。它从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,又回到对数据的分析与预测中去。</p>
<p>统计学习关于数据的基本假设是同类数据具有一定的统计规律性,这是统计学习的前提。</p>
<p>在统计学习过程中,以变量或变量组表示数据。数据分为由连续变量和离散变量表示的类型。</p>
<h2>统计学习的目的</h2>
<p>统计学习用于对数据进行预测与分析,特别是对未知数据进行预测与分析。统计学习总的目标就是考虑学习什么样的模型和如何学习模型,以使模型能够对数据进行准确的预测与分析,同时也要考虑尽可能地提高学习效率。</p>
<h2>统计学习的方法</h2>
<ul>
<li>监督学习(supervised learning)</li>
<li>非监督学习(unsupervised learning)</li>
<li>半监督学习(semi-supervised learning)</li>
<li>强化学习(reinforcement learning)</li>
</ul>
<h1>监督学习</h1>
<p>监督学习(supervised learning)的任务时学习一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个好的预测(注意,这里的输入、输出是指某个系统的输入与输出,与学习的输入与输出不同)</p>
<h2>基本概念</h2>
<p><strong>输入空间、特征空间与输出空间</strong></p>
<p>在监督学习中,将输入与输出所有可能取值的集合分别称为输入空间(input space)与输出空间(output space),输入与输出空间可以是有限元素的集合,也可以是整个<a href="http://zh.wikipedia.org/wiki/%E6%AC%A7%E5%BC%8F%E7%A9%BA%E9%97%B4" title="欧式空间">欧式空间</a>。输入空间与输出空间可以是同一个空间,也可以是不同的空间;但通常输出空间远远小于输入空间。</p>
<p>每个具体的输入是一个实例(instance),通常是由特征向量(feature vector)表示,这时,所有特征向量存在的空间成为特征空间(feature space),特征空间的每一维对应于一个特征。有时假设输入空间与特征空间为相同的空间,对它们不予区分;有时假设输入空间与特征空间为不同的空间,将实例从输入空间映射到特征空间。模型实际上都是定义在特征空间上的。</p>
<ul>
<li>回归问题:输入变量与输出变量均为连续变量。</li>
<li>分类问题:输出变量为有限个离散变量</li>
<li>标注问题:输入变量与输出变量均为变量序列的预测。</li>
</ul>
<p><strong>联合概率分布</strong></p>
<p>监督学习假设输入与输出的随机变量X与Y遵循联合概率分布<span class="math">\(P(X,Y)\)</span>。<span class="math">\(P(X,Y)\)</span>表示分布函数,或分布密度函数。X和Y具有联合概率分布的假设就是监督学习关于数据的基本假设。</p>
<p><strong>假设空间</strong></p>
<p>监督学习的目的在于学习一个由输入到输出的映射,这一映射由模型来表示。模型属于由输入空间到输出空间的映射的集合,这个集合就是<strong>假设空间(hypothesis space)</strong>.假设空间的确定意味着学习范围的确定。</p>
<h2>问题的形式化</h2>
<p>监督学习利用训练数据集学习一个模型,再用模型对测试样本集进行预测,由于在这个过程中需要训练数据集,而训练数据集往往是人工给出的,所以这个学习过程称为监督学习。监督学习分为学习和预测两个过程。</p>
<p>监督学习中,假设训练数据与观测数据是依联合概率分布<span class="math">\(P(X,Y)\)</span>独立同分布产生的。</p>
<h1>统计学习三要素</h1>
<p>方法 = 模型 + 策略 + 算法</p>
<h2>模型</h2>
<p>在监督学习过程中,模型就是所要学习的条件概率分布或决策函数,也就是说,模型可以用概率条件分布或决策函数来表示。模型的<strong>假设空间(hypothesis space)</strong>包含了所有可能的条件概率分布或决策函数。<strong>假设空间</strong>中的模型一般有无穷多个。</p>
<p><strong>决策函数</strong></p>
<p>当假设空间用决策函数表示时,假设空间可以定义为决策函数的集合</p>
<div class="math">$$
\begin{equation}
\mathcal{F}=\{f|Y=f(X)\}
\end{equation}
$$</div>
<p>其中,<span class="math">\(\mathcal{F}\)</span>是假设空间,<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>是定义在输入空间<span class="math">\(\mathcal{X}\)</span>和输出空间<span class="math">\(\mathcal{Y}\)</span>上的变量。这时的<span class="math">\(\mathcal{F}\)</span>通常是由一个参数向量决定的函数族:</p>
<div class="math">$$
\begin{equation}
\mathcal{F}=\{f|Y=f_\theta(X),\theta\in R^n\}
\end{equation}
$$</div>
<p>参数向量<span class="math">\(\theta\)</span>取值于<span class="math">\(n\)</span>维欧式空间<span class="math">\(R_n\)</span>,称为<strong>参数空间(parameter space)</strong>。</p>
<p><strong>条件概率分布</strong></p>
<p>当假设空间用条件概率分布时,假设空间也可以定义为条件概率的集合</p>
<div class="math">$$
\begin{equation}
\mathcal{F}=\{P|P(Y|X)\}
\end{equation}
$$</div>
<p>其中,<span class="math">\(\mathcal{F}\)</span>是假设空间,<span class="math">\(X\)</span>和<span class="math">\(Y\)</span>是定义在输入空间<span class="math">\(\mathcal{X}\)</span>和输出空间<span class="math">\(\mathcal{Y}\)</span>上的随机变量。这时的<span class="math">\(\mathcal{F}\)</span>通常是由一个参数向量决定的条件概率分布族:</p>
<div class="math">$$
\begin{equation}
\mathcal{F}=\{f|Y=f_\theta(Y|X),\theta\in R^n\}
\end{equation}
$$</div>
<p>参数向量<span class="math">\(\theta\)</span>取值于<span class="math">\(n\)</span>维欧式空间<span class="math">\(R_n\)</span>,也称为<strong>参数空间(parameter space)</strong>。</p>
<p>决策函数表示的模型为<strong>非概率模型</strong>,由条件概率表示的模型为<strong>概率模型</strong>。</p>
<h2>策略</h2>
<p>有了模型的假设空间,统计学习接着需要考虑的是按照什么样的准则学习或选择最优的模型。统计学习的目的在于从假设空间选取最优模型。</p>
<p>首先要了解损失函数与风险函数的概念。</p>
<ul>
<li>损失函数:度量模型一次预测的好坏</li>
<li>风险函数:度量平均意义下模型预测的好坏</li>
</ul>
<p><strong>损失函数和风险函数</strong></p>
<p>监督学习是从假设空间<span class="math">\(\mathcal{F}\)</span>中选取一个最优的模型<span class="math">\(f\)</span>,使得对于给定的输入<span class="math">\(X\)</span>,由<span class="math">\(f\)</span>给出相应的输出<span class="math">\(f(X)\)</span>,这个输出的预测值<span class="math">\(f(X)\)</span>与真实值<span class="math">\(Y\)</span>可能一致也可能不一致,我们必须用一个函数来度量它们之间的差异程度。这就引出了<strong>损失函数(loss function)</strong>或<strong>代价函数(cost function)</strong>的概念。损失函数应该是<span class="math">\(f(X)\)</span>和<span class="math">\(Y\)</span>的非负实值函数,记作<span class="math">\(L(Y,f(X))\)</span>。</p>
<p>统计学习中常用的的损失函数有以下几种:</p>
<ol>
<li>0-1损失函数(0-1 loss function)</li>
</ol>
<div class="math">$$
\begin{equation}
L(Y,f(X))=\begin{cases}1 & Y \neq f(X)\\\\ 0 & Y=f(X)
\end{cases}
\end{equation}
$$</div>
<ol>
<li>平方损失函数(quadratic loss function)</li>
</ol>
<div class="math">$$
\begin{equation}
L(Y,f(X))=(Y-f(X))^2
\end{equation}
$$</div>
<ol>
<li>绝对损失函数(absolute loss function)
<div class="math">$$
\begin{equation}
L(Y,f(X))=\left\vert Y-f(X)\right\vert
\end{equation}
$$</div>
</li>
<li>对数损失函数(logarithmic loss function)或对数似然损失函数(loglikeihood loss function)
<div class="math">$$
\begin{equation}
L(Y,f(Y|X)=-\log P(Y|X)
\end{equation}
$$</div>
</li>
</ol>
<p>损失函数数值越小,模型越好。由于模型的输入、输出<span class="math">\((X,Y)\)</span>是随机变量,遵循联合分布<span class="math">\(P(X,Y)\)</span>,所以损失函数的期望是:</p>
<div class="math">$$
\begin{equation}
R_{exp}(f)=E_p[L(Y,f(X))]=\int_\mathcal{X \times Y} L(y,f(x))P(x,y) dxdy
\end{equation}
$$</div>
<p>这是理论上模型<span class="math">\(f(X)\)</span>关于联合分布<span class="math">\(P(X,Y)\)</span>的平均意义下的损失,称为<strong>风险函数(risk function)</strong>或<strong>期望损失(expected loss)</strong>。我们学习的目标就是选择期望风险最小的模型。但是由于联合分布<span class="math">\(P(X,Y)\)</span>是未知的,所以<span class="math">\(R_{exp}(f)\)</span>不能直接计算。</p>
<p>给定一个训练数据集</p>
<div class="math">$$
\begin{equation}
T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\}
\end{equation}
$$</div>
<p>模型<span class="math">\(f(X)\)</span>关于训练数据集的平均损失称为<strong>经验风险(empirical risk)</strong>或<strong>经验损失(empirical loss)</strong>,记作<span class="math">\(R_{emp}\)</span>:</p>
<div class="math">$$
\begin{equation}
R_{emp}(f)=\frac{1}{N}\sum_{i=1}^N L(y_i,f(x_i))
\end{equation}
$$</div>
<p>期望风险<span class="math">\(R\_{exp}(f)\)</span>是模型关于联合分布的期望损失,经验风险<span class="math">\(R\_{emp}(f)\)</span>是模型关于训练样本集的平均损失。根据<a href="http://zh.wikipedia.org/wiki/%E5%A4%A7%E6%95%B0%E5%AE%9A%E5%BE%8B" title="大数定律">大数定律</a>,当样本容量<span class="math">\(N\)</span>趋于无穷时,经验风险<span class="math">\(R\_{emp}(f)\)</span>趋于期望风险<span class="math">\(R\_{exp}(f)\)</span>。所以很自然的想法是,用经验风险估计期望风险,但是现实中的训练样本数目有限,甚至很小,所以这样的估计并不理想,需要对经验风险进行一定的矫正。</p>
<p><strong>经验风险最小化与结构风险最小化</strong></p>
<p>在假设空间、损失函数以及训练数据集确定的情况下,经验风险函数就可以确定。<strong>经验风险最小化(empirical risk minimization,ERM)</strong>的策略认为,经验风险最小的模型是最优的模型。根据这一策略,按照经验风险最小化求最优模型就是求解最优化问题:</p>
<div class="math">$$
\begin{equation}
\min_{f \in\cal_{F} } \frac{1}{N}\sum_{i=1}^N L(y_i,f(x_i))
\label{ERM}
\end{equation}
$$</div>
<p>其中,<span class="math">\(\cal{F}\)</span>是假设空间。</p>
<p>当样本容量足够大时,经验风险最小能够保证有很好的学校效果,在现实中被广泛采用。比如<strong>极大似然估计(maximum linklihood estimation)</strong>就是经验风险最小化的一个例子。当模型是条件概率分布,损失函数是对数损失函数时,经验风险最小化就等价于极大似然估计。</p>
<p>但是,当样本容量很小时,经验风险最小化学习的效果未必很好,会产生"<strong>过拟合(over-fitting)</strong>"现象。</p>
<p><strong>结构风险最小化(structural risk minimization,SRM)</strong>是为了防止过拟合而提出的策略。结构风险最小化等价于<strong>正则化(regularization)</strong>。结构风险在经验风险上加上表示模型复杂度的正则化项(regularizer)或罚项(penalty term)。在假设空间、损失函数以及训练数据集确定的情况下,结构风险的定义是:</p>
<div class="math">$$
\begin{equation}
R_{srm}(f)=\frac{1}{N}\sum_{i=1}^N L(y_i,f(x_i))+\lambda J(f)
\end{equation}
$$</div>
<p>其中<span class="math">\(J(f)\)</span>为模型的复杂度,是定义在假设空间<span class="math">\(\cal{F}\)</span>上的泛函。模型<span class="math">\(f\)</span>越复杂,复杂度<span class="math">\(J(f)\)</span>越大。<span class="math">\(\lambda\ge0\)</span>是系数,用以权衡经验风险和模型复杂度。结构风险需要经验风险与模型复杂度同时小。结构风险小的模型往往对训练数据以及未知的测试数据都有较好的预测。</p>
<p>比如,贝叶斯估计中的<strong>最大后验概率估计(maximum posterior probability estimate,MAP)</strong>就是结构风险最小化的一个例子。当模型是条件概率分布、损失函数是对数损失函数、模型复杂度由模型的先验概率表示时,结构风险最小化等价于最大后验概率估计。</p>
<p>结构风险最小化的策略认为结构风险最小的模型是最优模型,所以寻找最优模型,就是求解最优化问题:</p>
<div class="math">$$
\begin{equation}
\min_{f\in\cal{F}}\frac{1}{N}\sum_{i=1}^N L(y_i,f(x_i)) + \lambda J(f) \label{SRM}
\end{equation}
$$</div>
<p>这样,监督学习的问题就变成了经验风险(公式<span class="math">\(\ref{ERM}\)</span>)或结构风险函数(公式<span class="math">\(\ref{SRM}\)</span>)的最优化问题,这时经验结构风险函数是最优化的目标函数。</p>
<h2>算法</h2>
<p>算法是指学习模型的具体计算方法。统计学习基于训练数据集,根据学习策略,从假设空间中选择最优模型,最后需要考虑用什么样的计算方法求解最有模型。</p>
<h1>模型评估与模型选择</h1>
<h2>训练误差与测试误差</h2>
<p>统计学习的目的是使学到的模型不仅对已知的数据而且对未知数据都能有很好的预测能力。不同的学习方法会给出不同的模型,当损失函数给定时,基于损失函数的<strong>训练误差(training error)</strong>和模型的<strong>测试误差(test error)</strong>就成为学习方法评估的标准。需要注意的是,统计学习方法具体采用的损失函数未必是评估时所使用的损失函数,当然,两者一致是比较理想的。</p>
<p>假设学习到的模型是<span class="math">\(Y=\hat{f}(X)\)</span>,训练误差是模型<span class="math">\(Y=\hat{f}(X)\)</span>关于训练数据集的平均损失:</p>
<div class="math">$$
\begin{equation}
R_{emp}(\hat{f})=\frac{1}{N}\sum_{i=1}^N L(y_i,\hat{f}(x_i))
\end{equation}
$$</div>
<p>其中<span class="math">\(N\)</span>是训练样本容量。</p>
<p>测试误差是模型<span class="math">\(Y=\hat{f}(X)\)</span>关于测试数据集的平均损失:</p>
<div class="math">$$
\begin{equation}
R_{emp}(\hat{f})=\frac{1}{N'}\sum_{i=1}^N' L(y_i,\hat{f}(x_i))
\end{equation}
$$</div>
<p>其中<span class="math">\(N'\)</span>是测试样本容量。</p>
<p>训练误差的大小,对判定给定的问题是不是一个容易学习的问题是有意义的,但本质上不重要。测试误差反映了学习方法对未知的测试数据集的预测能力,是学习中的重要概念。通常将学习方法对未知数据的预测能力称为<strong>泛化能力(generalization ability)</strong></p>
<h2>过拟合与模型选择</h2>
<p>当假设空间含有不同复杂度(例如,不同的参数个数)的模型时,就要面临模型选择(model selection)的问题,我们希望选择或学习一个合适的模型,如果在假设空间中存在"真"模型,那么所选择的模型应该逼近真模型。</p>
<p>但是,如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高。这种现象称为<strong>过拟合(over-fitting)</strong>。过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象。在上文说到的两个监督学习的策略中,结构风险就是把模型的复杂度考虑进去了,而经验风险就没有考虑模型的复杂度,因此结构风险对于未知数据会有更好的预测。可以说模型选择旨在避免过拟合并提高模型的预测能力。</p>
<p>下图描述了训练误差和测试误差与模型的复杂度之间的关系。当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。</p>
<p><img alt="训练误差和测试误差与模型复杂度的关系" src="http://zhouyichu.com/images/errors.png"/></p>
<p>下面介绍两种常用的模型选择方法:正则化与交叉验证。</p>
<h1>正则化与交叉验证</h1>
<h2>正则化</h2>
<p>模型选择的典型方法是正则化(regularization)。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项(regularizer)或罚项(penalty term)。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。</p>
<p>正则化一般具有如下的形式:</p>
<div class="math">$$
\begin{equation}
\min_{f\in\cal{F}}\frac{1}{N}\sum_{i=1}^N L(y_i,f(x_i)) + \lambda J(f)
\end{equation}
$$</div>
<p>其中第一项是经验风险,第二项是正则化项,<span class="math">\(\lambda\ge0\)</span>为调整两者之间关系的系数。</p>
<p>正则化的作用是选择经验风险与模型复杂度同时较小的模型。正则化符合<a href="http://zh.wikipedia.org/wiki/%E5%A5%A5%E5%8D%A1%E5%A7%86%E5%89%83%E5%88%80" title="奥卡姆剃刀原理">奥卡姆剃刀原理(Occam's razor)</a>,奥卡姆剃刀原理应用于模型选择时变为以下的想法:在所有可能选择的模型中,能够很好地解释已知数据并且十分简单才是最好的模型。</p>
<h2>交叉验证</h2>
<p>另一种常见的模型选择方法是<strong>交叉验证(cross validation)</strong>。</p>
<p>如果给定的样本数据充足,进行模型的选择的一种简单方法是随机地将数据集合切分成三部分,分别为<strong>训练集(training set)</strong>、<strong>验证集(validation set)</strong>和<strong>测试集(test set)</strong>。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。</p>
<p>但是,在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证的方式。交叉验证的基本思想是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。</p>
<p><strong>简单交叉验证</strong></p>
<p>简单交叉验证的方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集,然后用训练集在各种条件下训练模型,从而得到不同的模型,在测试集上评价各个模型的测试误差,选出测试误差最小的模型。</p>
<p><strong>S折交叉验证</strong></p>
<p>应用最多的是<strong>S折交叉验证(S-fold cross validation)</strong>,方法如下:首先随机地将已给数据切分为S个互不相交的大小相同的子集,然后利用S-1个子集的数据训练模型,利用余下的子集测试模型;将这一过程对可能的S中选择重复进行;最后选出S次评测中平均测试误差最小的模型。</p>
<h1>泛化能力</h1>
<h2>泛化误差</h2>
<p>学习方法的<strong>泛化能力(generalization ability)</strong>是指由该方法学习到的模型对未知数据的预测能力,是学习方法本质上重要的性质。</p>
<p>泛化误差的定义:如果学到的模型是<span class="math">\(\hat{f}\)</span>,那么用这个模型对未知数据预测的误差即为<strong>泛化误差(generalization error)</strong></p>
<div class="math">$$
\begin{equation}
R_{exp}(\hat{f})=E_p[L(Y,\hat{f}(X))]=\int_{\cal_{X \times Y}}L(Y,\hat{f}(X))P(x,y)dxdy
\end{equation}
$$</div>
<p>泛化误差反映了学习方法的泛化能力,如果一种方法学习的模型比另一种方法学习的模型具有更小的泛化误差,那么这种方法就有效。事实上,泛化误差就是所学习到的期望风险。</p>
<h2>泛化误差上界</h2>
<p>学习方法的泛化能力分析往往是通过研究泛化误差的概率上界进行的,简称为<strong>泛化误差上界(generalization error bound)</strong>。具体来说,就是通过比较两种泛化误差上界的大小来比较它们的优劣。泛化误差上界通常具有以下性质:它是样本容量的函数,当样本容量增加时,泛化上界趋于0;它是假设空间容量的函数,假设空间越大,模型就越难学,泛化误差上界就越大。</p>
<h1>生成模型与判别模型</h1>
<p>监督学习又可以分为<strong>生成方法(generative approach)</strong>和<strong>判别方法(discriminative approach)</strong>,所学到的模型分别称为<strong>生成模型(generative model)</strong>和<strong>判别模型(discriminative model)</strong></p>
<p>生成方法由数据学习联合概率分布<span class="math">\(P(X,Y)\)</span>,然后求出条件概率分布<span class="math">\(P(Y\|X)\)</span>作为预测的模型,即生成模型:</p>
<div class="math">$$
\begin{equation}
P(Y|X)=\frac{P(X,Y)}{P(X)}
\end{equation}
$$</div>
<p>这样的方法之所以称为生成方法,是因为模型表示了给定输入X产生输出Y的生成关系。典型的生成模型有:朴素贝叶斯法和隐马尔科夫模型。</p>
<p>判别方法由数据直接学习决策函数<span class="math">\(f(X)\)</span>或者条件概率分布<span class="math">\(P(X\|Y)\)</span>作为预测的模型,即判别模型。典型的判别模型包括:k近邻法、感知机、决策树、逻辑斯蒂回归模型、最大熵模型、支持向量机、提升方法和条件随机场等。</p>
<h1>分类问题</h1>
<p>分类是监督学习的一个核心问题。在监督学习中,当输出变量Y取有限个离散值时,预测问题便成为分类问题。这是,输入变量X可以是离散的,也可以是连续的。监督学习从数据中学习一个分类模型或分类决策函数,称为<strong>分类器(classifier)</strong>。</p>
<p>对于二类分类问题常用的评价指标是精确率(precision)与召回率(recall)。分类器在测试数据集上的预测或正确或不正确,4种情况出现的总数分别记作:</p>
<ul>
<li>TP——将正类预测为正类数;</li>
<li>FN——将正类预测为负类数;</li>
<li>FP——将负类预测为正类数;</li>
<li>TN——将负类预测为负类数;</li>
</ul>
<p>精确率定义为:</p>
<div class="math">$$
\begin{equation}
P=\frac{TP}{TP+FP}
\end{equation}
$$</div>
<p>召回率定义为</p>
<div class="math">$$
\begin{equation}
R=\frac{TP}{TP+FN}
\end{equation}
$$</div>
<p>此外,还有<span class="math">\(F\)</span>值,是精确率和召回率的调和均值,即</p>
<div class="math">$$
\begin{gather}
\frac{2}{F}=\frac{1}{P}+\frac{1}{R} \\
F=\frac{2TP}{2TP+FP+FN}
\end{gather}
$$</div>
<p>精确率和召回率都高时,<span class="math">\(F\)</span>值也会高。</p>
<h1>标注问题</h1>
<p>标注问题的输入是一个预测序列,输出是一个标记序列或状态序列。标注问题的目标在于学习一个模型,是它能够对观测序列给出标记序列作为预测。注意,可能的标记个数是有限的,但其组合所城的标记序列的个数是依序列长度呈指数级增长的。</p>
<p>评价标注模型的指标与评价分类模型的指标一样,常用的标注精确率和召回率。其定义与分类模型相同。</p>
<p>标注常用的统计学习方法有:隐马尔科夫模型、条件随机场。</p>
<h1>回归问题</h1>
<p>回归用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化。回归模型正是表示从输入变量到输出变量之间映射的函数。回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。</p>
<p>回归问题按照输入变量的个数,分为一元回归和多元回归;按照输入变量和输出变量之间关系的类型即模型的类型,分为线性回归和非线性回归。</p>
<p>回归学习最常用的损失函数是平方损失函数,在此情况下,回归问题可以由著名的<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95" title="最小二乘法">最小二乘法(least squares)</a>求解。</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>Vim语法检测那些事2013-02-26T00:00:00-07:002013-02-26T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-02-26:/vim/Vim-Somthing-About-Syntax/<p>本文仔细分析了Vim语法高亮的原理,阐述了如何定制一个自己的文件类型,并进行语法高亮。</p><p>自从开始使用<a href="http://jekyllrb.com" title="Jekyll">Jekyll</a>写博客,markdown就成为了我的常用工具,我平时使用的编辑器是vim,强大的vim拥有大量的语法文件,这当中当然包括了markdown的语法高亮文件。但是,随着时间的推移,我发现基本的markdown语法高亮已经不太适合我的要求了,因为在<a href="http://jekyllrb.com" title="Jekyll">Jekyll</a>里我使用的是<a href="http://kramdown.rubyforge.org" title="Kramdown">kramdown</a>这个渲染引擎,它对markdown的语法进行了扩充,有用很多其他的特性(包括支持Latex、输入表格等)。因此,基础的markdown语法已经不能满足我了,因此针对kramdown的扩展了的语法,我想要自己写一个语法文件。在开始写语法文件之前,有必要先了解一下vim是如何对文件类型进行识别的,有助于更好的理解vim的启动过程。网上找了很久,关于vim是如何启动、如何读取配置文件的内容非常少,大多数都是教程都是告诉你该用什么命令,但是却不告诉你为什么要用这个命令。经过一个下午的苦苦搜索,并且加上自己查看vim手册,得出了一些成果,在此记录一下。</p>
<h1>配置文件的搜索路径</h1>
<p>首先需要知道的是,vim是可高度可定制化的编辑器,它在运行过程中都会维护一些内部的变量(或者叫做选项),如常见的<code>number</code>,<code>incsearch</code>等,这些选项都会控制vim的一些具体属性,例如<code>set number</code>就会告诉vim打开行号,这样vim就会显示出每一行的行号(其实这样的选项vim中有很多,此处不再展开,想要完整了解,可以查看手册)。在这些选项中,有一个选项叫做<code>runtimepath</code>,这个选项中记录了vim启动时应该要读取的配置文件的目录(有点类似操作系统中的$PATH环境变量),可以通过<code>set runtimepath</code>命令来查看(修改)。在windows上,默认是:</p>
<ul>
<li>~/vimfiles</li>
<li>安装目录/vimfiles</li>
<li>安装目录/vim73</li>
<li>安装目录/vimfiles/after</li>
<li>~/vimfiles/after</li>
</ul>
<p>在Linux上是:</p>
<ul>
<li>~/.vim</li>
<li>/var/lib/vim/addons</li>
<li>/usr/share/vim/vimfiles</li>
<li>/usr/share/vim/vim73</li>
<li>/usr/share/vim/vimfiles/after</li>
<li>/var/lib/addons/after</li>
<li>~/.vim/after</li>
</ul>
<p>这些是vim的默认搜索配置文件的路径,需要注意的是,它是有顺序的,就是从上到下搜索的,以windows为例,最先查看的是~/vimfiles目录,最后查看的是~/vimfiles/after目录。每一个目录都是用逗号隔开的,我们可以在默认的基础上添加自己的配置文件搜索路径。因为关系着配置文件的读取,所以这个路径非常重要,建议不要乱改。</p>
<h1>自动命令</h1>
<p>vim拥有自己的独立脚本语言,是专门用来开发vim插件的,更多的vim脚本命令可以查看手册或上网查询。此处我只想说的是自动命令,一个自动命令是在某个事件发生时会自动执行的命令,可以引发一个自动命令的事件有很多,包括读写文件或缓冲区内容被改变等。vim对文件类型的识别就是依靠这个命令的。完整的命令如下:</p>
<pre><code>:::vim
:autocmd [group] {events} {file_pattern} [nested] {command}
</code></pre>
<p>举例:</p>
<pre><code>:::vim
:autocmd FileWritePre * call DateInsert()
</code></pre>
<p>上面这个命令的意思是,在事件FileWritePre发生时,调用DataInsert()函数。其中"*"是一个模式字串,用来匹配文件名,此例中要匹配的是所有文件。<code>autocmd</code>可以简写为<code>au</code></p>
<h1>语法文件</h1>
<p>vim默认自带了大量的语法高亮文件,它有自己的语法,用来定义高亮的方式。具体的语法规则可以查看我<a href="http://wiki.zhouyichu.com/Vim/2012/12/03/Vim-Develop-Syntax/" title="Vim自定义语法高亮">wiki上的笔记</a>。此处的重点是语法文件是存放在安装目录的syntax目录下面的,所以,如果我们要自己写语法文件,我们就必须把语法文件放置到syntax目录下面。而syntax目录则是在上面的<code>runtimepath</code>指定的目录下。</p>
<p>还是以windows为例,打开<code>安装目录/Vim/vim73</code>,你会看到一个名为syntax的目录,这目录下面存放的就是所有vim自带的语法高亮文件。需要的注意的是,语法高亮文件的后缀名统一是.vim,文件名就是对应文件类型名,这一点不能弄错。例如,一个c语言的语法高亮文件的文件名就应该是c.vim,只有正确命名的文件才能被vim识别。你可以打开该目录下的任意一个文件,其中就是对应类型的文件的语法高亮规则。</p>
<h1>启动过程中的语法高亮</h1>
<p>vim的启动过程应该是比较复杂的,事实上,我自己都没有完全弄清楚,此处我只是针对语法高亮来简略的说一下vim的启动过程。</p>
<p>当vim启动时,它会首先读取<code>runtimepath</code>中指定的路径中的配置文件,当然,vim会读取很多的配置文件,但其中一个名为filetype.vim的配置文件是我们目前所需要的,可以打开这个文件看一下,你会发现这个文件中有很多<code>au</code>命令,如图所示。</p>
<p><img alt="autocmd命令" src="http://zhouyichu.com/images/auto_cmd.png"/></p>
<p>其中的命令是:</p>
<pre><code>:::vim
au BufNewFile,BufRead *.css setf css
</code></pre>
<p>这个命令就是之前我们提到的自动命令,它在告诉vim,在事件<code>BufNewFile</code>或<code>BufRead</code>发生时,对于所有文件名满足<code>*.css</code>模式的文件采用css的语法进行语法高亮显示。此时,vim就会到syntax目录下去读取对应的css.vim文件中的语法规则,然后对当前的文件进行语法高亮渲染。其中<code>BufNewFile</code>和<code>BufRead</code>这两个事件,顾名思义,就是在创建新文件或在读取某个已经存在的文件时所触发的事件。</p>
<h1>添加新的文件类型</h1>
<p>既然决定要自己写语法高亮文件,那就是我们先要自己定义一个新的文件类型(注意不要和原有已知的文件类型发生冲突)。我选择的文件类型是*.md,这个后缀名暂时还没有被使用。根据上文的分析,要使vim能够读取到这个新的文件类型,我们需要做以下几件事:</p>
<ul>
<li>自己创建一个名为md.vim的语法规则文件,其中记录了该如何高亮*.md文件中的内容,并把这个文件放入安装目录下的syntax目录下。</li>
<li>
<p>修改filetype.vim文件内容,使vim能够正确认识你的文件类型,在其中添加如下的语句:</p>
<pre><code>:::vim
augroup filtypedetect
au BufNewFile,BufRead *.md setf md
augroup END
</code></pre>
</li>
<li>
<p>重启vim,一切搞定。</p>
</li>
</ul>
<h1>不同的目录</h1>
<p>最后关于目录设置,还有几点要注意。虽然按照上述的步骤是可以让vim正确识别出新的文件类型,但是最好不要在原来的安装目录下修改,因为安装目录下的文件都是默认写好了的,经过很多人的反复检测,可以说是相当完美的,而如果你不小心修改错了,那可能会引起不小的问题。其实,也没必要非要在安装目录下修改,回头看看<code>runtimepath</code>中设置的路径,第一个搜索的路径其实是~/vimfiles(对于windows来说),我们只要将自己的配置文件放入这个目录就行了,不需要去动安装目录的。</p>
<ol>
<li>新建~/vimfiles/syntax目录,自己创建一个名为md.vim的语法规则文件,并把这个文件放入这个目录中。</li>
<li>在~/vimfiles目录中新建一个filetype.vim文件,输入上面的代码</li>
<li>重启vim</li>
</ol>
<p>按照这样的操作,不仅你实现了自己的语法高亮,还不会影响vim原来的文件结构。</p>《一九八四》的恐怖2013-02-17T00:00:00-07:002013-02-17T00:00:00-07:00Flyawaytag:zhouyichu.com,2013-02-17:/words/Somthing-About-1984/<p>《一九八四》,一部恐怖小说的震感。</p><p>今天下午花了2个小时把《一九八四》剩下的几章看完了,看完之后的整体感觉就是,这是一部非常<strong>恐怖</strong>的恐怖小说。</p>
<p>所谓的"恐怖"并不是指有多么灵异的事件,或者有多么悲惨的案件发生,而是小说营造的那种压抑的氛围,那种抹杀一切人性的极权社会,从一个小人物的转变过程反映出了隐藏其后的巨大恐怖。</p>
<p>小说的情节是非常简单的,主人翁温斯顿生活在一个极权的社会里,每天重复着机械的篡改历史的工作。某一天他开始记日记了,然后他和女主人翁茱莉亚相爱了,经常躲开"老大哥"的监视偷偷幽会。其实这一切"老大哥"统统都知道,当时机成熟之后,“老大哥”把他们抓了起来,分别进行了"改造",最终他们两人都变得"纯洁"了。</p>
<p>小说的第三部分无疑是高潮所在,温斯顿的人性一点一点地被肢解,经过地狱般的洗礼,最终面对恐怖的"鼠刑",温斯顿彻底奔溃了,喊出了“去咬茱莉亚”这句意味着背叛一切的话语。最终,温斯顿"升华"了,他变得"纯洁"了。这是一个非常令人恶心的过程,但是在小说里作者没有使用任何一个恶心的字眼,这也是我佩服作者的原因之一——用像小桥流水般的文字刻画出一段扭曲人性的过程。在无尽的拷打的过程之中,温斯顿诋毁了所有他认识的人,把所有的人都牵连成了"叛国者",当然这其中包括了他爱着的茱莉亚,但这并不是背叛,这只是所有必然流程中一个而已,他依然爱她,就不是背叛。</p>
<blockquote>
<p>他不相信有什么力量可以让自己不再爱他,直到这种力量真的出现。</p>
</blockquote>
<p>从我的理解来说,这已经超出了单纯的爱情的范畴了,这是一个人性的信仰问题。在放弃了所有的准则,坦白了所有的罪恶之后,温斯顿唯一的救命的稻草就是这个信仰——他爱着她。当连这个最后的救命稻草都被剥夺之后,温斯顿终于被征服了,他已经不再是一个人了,他只是一个具有双重思想的行尸走肉,一个硕大机器上面的一个螺丝钉。</p>
<p>关于极权导致人性的扭曲,我记得我曾经看过一篇报告,说的是某个心理学家从一个著名的世界性大学中挑选了几个非常优秀的学生,请他们参与一个心理实验<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>。实验的过程是这样的,这些学生被分成两组,一组扮演警察,一组扮演囚犯,在一个与外界隔绝的模拟监狱中共同生活几周的时间,期间囚犯必须绝对服从警察的命令。在实验开始时,每个参与者都签订了保证书,不管实验过程中发生什么事情,都不会受到法律制裁,也不能提前退出实验。实验刚开始一段时间,没什么特别的事情发生,然而随着时间的推移,扮演警察的人发现自己在这里拥有几乎无限的权力,他们开始要求囚犯做出一些带有侮辱性的事情,后来发展的更为严重,警察们经常对囚犯进行私刑、虐待,甚至强行让他们发生性行为。在实验结束之后,心理学家分别和这些实验者进行了谈话,扮演警察的那组人在实验结束之后非常懊悔他们的所作所为,但是他们自己也说不清为什么在那种情况下,他们自己会发生如此大的变化,失去了作为一个正常人应有的人性。最终那个心理学家做出了这样一个结论:<strong>无论一个人受到多么好的教育,一旦处于一个极权的情况下,他的所有价值观都会发生改变,从而丧失基本的人性。</strong></p>
<p>当然,就这部小说而言,它的意义绝不是仅仅在讨论人性的扭曲,更多的政治的讽刺意义,然而作为一个没什么政治经验的人来说,我觉得我没什么发言权,这里也就不再多说什么了......</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>这个实验后来被拍成了电影,2009年保罗舒尔灵拍的《死亡实验》。我到现在都不敢看这部电影,它将人性中最黑暗的一掀开了...... <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>康熙与曹操2012-12-29T00:00:00-07:002012-12-29T00:00:00-07:00Flyawaytag:zhouyichu.com,2012-12-29:/words/KangXi-and-Caocao/<p>这是很早之前写的文章,特意将它移到新博客上来,时刻提醒自己不能太过安逸。</p><p>前几天,老爸提到了一个挺有意思的事情,说是一个很优秀的大学生考公务员,以笔试第一名的成绩进入面试,面试过程中也表现的十分优秀,主考官几乎认定就要录取他了。这时,主考官问了最后一个问题:你最喜欢的历史人物是谁?谁知道这位非常优秀的大学生脱口而出的就是和珅~结果大家可想而知,他从第一名变成了倒数第一。</p>
<p>确实,从一个人对历史的看法可以推断出他这个人的一些性格特点,老爸随即就拿这个最后的问题来问我和我堂妹,我也是几乎不假思索的回答说是康熙,堂妹的回答是曹操。还好,这两个回答还算是正常~</p>
<p>这件事其实本身没什么好说的,我想说的是,康熙与曹操的比较,当然,仅仅是个人看法。 </p>
<p>其实,在以前,我也一直最喜欢的是曹操,乱世之奸雄,治世之能臣,从一个不起眼的校尉成长为一方雄主,刺董卓,平吕布,灭袁绍,败马超,挟天子以令诸侯,多么了不起啊。</p>
<p>但现在,我却更喜欢康熙。康熙是在位时间最长的帝王之一,能文能武,学贯古今,而且政绩卓著,灭鳌拜,平三番,收台湾,治黄河,修四库,每一样都是功垂千秋的。但在这些所有的功绩之后,有一个大前提,康熙是生在帝王之家,一出生,其贵族的命运就伴随着他。从这一点上说,曹操似乎比康熙更使人喜欢。</p>
<p>但,就目前我的人生经历来看,内在的松懈往往比外在的压力更致命。</p>
<p>曹操生活的时代是一个群雄林立的时代,你自己不强大,势必要被别人所吞并。所以在这样的情况下,是外在的生存压力将曹操逼到了一方雄主的位置上,当然,这也必须要求曹操足够优秀,有足够的能力,才不会被强大的外在压力所打败。俗话说,时势造英雄,曹操的成功一半来源于他过人的能力,一半来自于外在强大的压力,压迫着他必须变得更加优秀。</p>
<p>而康熙不同,康熙出生在帝王家,是含着金钥匙出生的,从小锦衣玉食,有太监宫女伺候着。在他8岁时,他就稀里糊涂的坐上了帝位。可以说,他在没有任何能力的情况下,就拥有了中华大地上的最大权力。他可以过得非常奢华,可以像纣王、隋炀帝一样穷极一生地享乐。</p>
<p>但,他没有,他努力地做一个优秀的帝王。他懵懂的眼睛盯上了两个庞然大物,一个是权倾朝野的鳌拜,一个是拥兵自重于西南的吴三桂,对于这个两个和他父辈都有很大关系的政治力量,他下手了。18岁干净利落地干掉了鳌拜,20岁开始对吴三桂的征伐,用了8年,彻底打败了吴三桂。可以说,他把整个中原大地按他自己的方式重新打扫了一遍。</p>
<p>能够在奢华的环境下成长起来,而且拥有着强大的精神力量,我想历史上也就康熙了吧。在恶劣环境下成长起来的英雄是真英雄,但在温柔乡里成长出来的英雄,那是比真英雄还要英雄的人物。</p>
<p>有时候,舒适的环境才是最致命的,这一点我深有体会。放假在家的时候,几乎很少去翻书,但在学校里,却是手不释卷的。为何?因为环境不同!在家太舒适了,没有压力,没有更优秀的人在旁边刺激你,没有上课的课表时刻提醒你你需要上课,没有上课的铃声催促你起床,于是每天晚晚地起床,看电视、上网打游戏成为了假期的主旋律。但在学校就不同了,学校有一个竞争和学习的氛围,敦促着你要去学习,不能荒废学业。</p>
<p>恶劣的环境能够磨练人的意志,能够创造出英雄;但在舒适的环境下成长起来的英雄往往更令我钦佩!</p>Hello World2012-11-23T00:00:00-07:002012-11-23T00:00:00-07:00Flyawaytag:zhouyichu.com,2012-11-23:/misc/Hello-World/<p>这是我正式发布在github上的第一篇博客。和学习所有编程语言一样,第一个实例总是Hello World!</p><p>记得最早之前是在<a href="http://blog.sina.com.cn/" title="新浪博客">新浪博客</a>上写博客,大概是在初中的时候吧,当时也是跟风很多其他人玩博客,没坚持多久就停止了。上大学之后,从大二开始一直折腾<a href="http://wordpress.org/" title="WordPress">WordPress</a>,<a href="http://flyaway-blog.com" title="flyaway">这里</a>是我原来的博客地址。<a href="http://wordpress.org/" title="WordPress">WordPress</a>用了一段时间之后,发现处处有限制,用起来感觉很不灵活,总觉得<a href="http://wordpress.org/" title="WordPress">WordPress</a>还是太臃肿了。虽然有很多插件,但是还是不能满足我的需要。最让我纠结的就是文章的排版格式,当时为了发布几篇包含了很多公式的关于算法的文章,排版排了很久,但是最终的显示效果还是不如意。这让我觉得很痛苦。</p>
<p>后来,一次偶然的机会让我知道了<a href="https://github.com/" title="github">github</a>和<a href="http://jekyllrb.com/" title="Jekyll">jekyll</a>。一下子就喜欢上它的简单清爽了。可以在<a href="http://www.vim.org/" title="Vim">Vim</a>里写文章,同时又不需要担心格式的问题,实在太吸引人了!一直想找时间把blog搬过来,可惜学校的事情太多了,一直拖到现在,才有时间好好学习一下<strong>Jekyll</strong>相关的东西。</p>
<p>这个站点就是我学习的成果,虽然还有很多不完善,但整体博客系统的功能还是work的。关于这个站点还有几件事情需要在将来进一步完善,但是最近忙于学校的一个项目的中期检查,以下这些事情只能暂时留到将来处理了。</p>
<ul>
<li><del>文章归档功能的实现。<strong>Jekyll</strong>本身好像对文章归档功能支持不是很好,需要再花点时间研究一下。</del></li>
<li><del>评论系统。<strong>Jekyll</strong>本身是不支持评论系统的,添加评论系统需要用到<a href="http://disqus.com/" title="Disqus">Disqus</a>。</del></li>
<li><del>添加Feed页面。</del></li>
<li><del>添加站内搜索功能。</del></li>
<li><del>把原博客的部分文章移植到这个站点上来。</del></li>
<li><del>添加随机文章功能。</del></li>
<li>强化SEO技巧。</li>
</ul>
<p>不管怎么样,我就这样定居在<a href="https://github.com/" title="github">github</a>上了,这将是一个新的开始。</p>
<p>Hello world, 这是一个新的开始。</p>