在知乎周刊上看到一篇文章如何集中精神看资料?,受益匪浅,尤其是排名第二的@warfalcon的回答,更多地具体化了方法论,而不是逼格的东西。作者也在自己的blog上面整理了下,可以参考这里。
鉴于文中多次提到思维导图的重要性和优势,我这里把文章论述的主要观点用思维导图整理出来,也算活学活用。
上图(xmind所作,模板自己定制),点击可以看大图:
via WordPress http://ift.tt/1ku4lV7
在知乎周刊上看到一篇文章如何集中精神看资料?,受益匪浅,尤其是排名第二的@warfalcon的回答,更多地具体化了方法论,而不是逼格的东西。作者也在自己的blog上面整理了下,可以参考这里。
鉴于文中多次提到思维导图的重要性和优势,我这里把文章论述的主要观点用思维导图整理出来,也算活学活用。
上图(xmind所作,模板自己定制),点击可以看大图:
本节主要关注列空间(column space)和零空间 (null space)
子空间首先必须是向量空间,而且在另一个空间之中,即subspace 是vector space中的vector space。举例子,来看R^3的子空间,首先R^3是向量空间,R^3的subspace,如任意穿过原点的平面任意穿过原点的置信
子空间的交和并,假如有两个subspace,plane P和line L
∪:P U L是subspace吗?no,简单的可以找到vector加法不封闭
∩:P ∩ L是subspace吗?yes,交集要么是原点,要么是过原点的line
更一般的问题,Subspace S 和T,intersection S ∩ T is a subspace
证明:
强调一下vector space的条件
v + w 和 CV are in the space
vector space的列向量的线性组合还在vector space中
column space of matrix A is all linear combinations of columns
那么究竟是什么样的子空间呢?是整个R^4还是小一点的真子空间?到底有多小?显然不是整个空间,只是一部分(,3个列向量的线性组合无法充满整个4维空间。),在上图中,C(A)是A的列的线性组合。
同方程组量联系起来 Ax = b,对哪些b方程有解?并不是总有解的,因为对于上面的A,有4个方程和3个未知数。什么样的b才能让方程组有解?如b=全0,b是A中的某一列,也可以先把x列出来,然后去求b,也即有解的b的条件及是b是A的列空间的向量,因为Ax即A列的线性组合。
此外,观察一下,这3列向量是线性相关的,去掉某一列仍然可以组成之前的向量空间,如列三
C(A)是R^4的一个2维的subspace。
还是用A来举例子N(A),null space是一个很特殊的space,null space of A = all solutions x to Ax=0
首先从x可以看出,是R^3中的空间,下面来看看解有哪些,零向量显然是,又如[1, 1, -1],扩展为,即一条直线c[1, 1, -1],是一个subspace,可以通过前面的条件来check,比较简单,如下,假设v和w在零空间,Av = 0,Aw = 0,则A(v+w)= 0,那么v+w也在零空间,数乘类似
向量空间的关键
对于某个b,非0,不再考虑null space
如果有解,解构成子空间吗?显然不构成,因为显然的解中不包含原点,因此不是向量空间
那么是什么样的呢?[1, 0, 0]是一个解,[0, -1, 1]也是一个解,他们可能是一个不穿过原点的直线或者平面
总结,两种得到subspace的方法
可以从几个向量,通过线性组合,得到b,列空间
也可以从一个方程组中让x满足某种条件来找到子空间,如Ax=0,得到x,零空间。
本节的内容有三部分
置换矩阵P,用来完成行互换的矩阵(如消元,遇到主元为0的时候),之前我们做的A=LU分解,是假设了没有行变化,这里面的P本质上相当于单位阵,限制取消限制,怎么做?
PA = LU,先做P变化,将A变成主元不会出现0的情况,这样LU可以和以前一样,因此P是关键,P = identity matrix with reordered rows
有n!种n * n的置换阵,一些性质,而且都可逆,并且逆矩阵于其转置相等PT * P = I
转置(后续为了方便,记做P’,像matlab一样)
行列互换,共识如下
相关的一个应用广泛的矩阵是对称矩阵,对称矩阵(A’ = A),转置不变性
可以轻易造一个对称阵出来,如将上面的A’ * A,R’R is always symmetric,例子
理论上证明(R’R)’ = R’(R’)’ = R’R
Vector spaces
举例R^2,是一个平面,所有2维向量组成的空间,所有向量空间必须包括原点,向量运算结果页在该向量所在的空间
R^n 包含所有的n维向量,这里的向量都是column vector
性质:数乘,向量加法,取线性组合依然在R^n中,即封闭的
R^2的一个部分不能称为向量空间,比如第一象限,只有整数,运算不是封闭的
我们关注的更多的是R^n的子空间,它不是整个R^n,但是满足向量空间的性质,如在R^2中的一条过原点的直线,满足向量空间的性质,就是向量空间,这就是子空间的一个例子。但是不过原点的就不是,因为数乘0得到的是原点
subspace of R^2
R^3的比较类似,比如过原点的面和直线,其他,如在R^3中
取两列向量的所有线性组合,可以得到一个向量空间,叫column space C(A),结果是整个平面(在这个维度很自然可以看出,高维较难),当然通过原点。
本讲的核心,列向量的线性组合可以构成向量子空间
本节课内容,矩阵的五种乘法,以及用Gauss-Jordan方法求矩阵的逆
有五种乘法,结果显然是一致的,矩阵相乘的前提,如AB,A的列和B的行要相等,C = AB,A拥有m行,n列;B拥有n行,p列;而C就会有m行,p列
我们都知道,矩阵*向量得到向量。A*B的列1,得到C的列1,其余的部分不参与次运算,A*B的列2,得到C的列2,扩展开来,C中的列是A中的列的线性组合,矩阵乘法可以看做是A与一个个列相乘的p个向量组合在一起。而A乘以向量,等价于A中列的线性组合,而向量B的列说明了如何组合,这点很重要。在linear regression,的feature的组合中经常用到这种解释,A的列对应某一维特征的值,而向量则表明了每一维特征的权重。
同上面的方法比较类似,即C中的行,是B中的行的线性组合
这算是一种比较非主流的方法,没列 * 行得到一个矩阵,多个矩阵相加得到最终相乘的结果
第一种方法的拓展,将矩阵划分中多个block,像元素一样使用,记得相乘的block需要能够行列match
如A=[1 3| 2 6] (如果取行列式,结果为0,还没学到)
一种解释:
假设A * B = I,I中的列是A中的列的线性组合,显然不可能,所有的线性组合都在直线上,但是1,0不在上面
另一种解释:
if i can find a vector X(非零向量),with AX = 0,这样的A 没有逆,这里可以得到X = [3 , -1],证明如下:假设AX = 0,而且A有左逆A-1,则 A-1 ( AX) = 0,then X = [0, 0],矛盾,因此A没有左逆
结论:
singular matrix(即不可逆矩阵)的列能通过线性组合(非零向量X)得到0
方法如下 gauss-jordan idea(同时处理两个方程组),A * column j of A-1 = column j of I
求逆和求解方程组类似,尝试将A用消元法(先消元变成上三角阵,然后继续向上消元,即逆向)变成I,而左侧的I随着A做一样的操作,既可以得到A-1,可以检验一下,确实是A的逆
为什么能得到逆?本质上就是矩阵消元的方法,各种E,即E[A I] = [I ?] = [I E],可以看出EA = I,so E就是A的逆,而右侧的?就是E
本节课的主要内容如下
矩阵消元法解方程,也是计算机程序使用的方法;消元法奏效的情况,matrix is a good matrix;使用矩阵消元,既可以知道矩阵是不是一个好矩阵。消元后,回代,即可求解方程
我们本次要解决的AX = b
第一步
消元的目的,消去某个未知变量
先确定第一个主元(pivot)x,如A11,消去方程二和三种中的x,主元行不变,对第二行进行消元(行二减去主元行的某个倍数)
消元的时候可以先不管右侧矩阵,先看左侧(matlab也是这么做的,先算左侧A,再算右侧b)
第二个主元是A22,想消去方程三种的y,即3,2 step
第三个主元是A33
U 上三角矩阵,消元的目的是从A得到U
主元不能为0,为0即fail了,上面的success了,下面讨论下failure的消元,即得不到三个主元
如果0占据了主元的位置,需要做行交换,从下面的方程得到合适的主元,如果某行最终都为0了,则矩阵不可逆(下节课的内容),消元就fail了,行交换解决主元为0的临时问题,但是假如下面也没有可交换的行了,那么消元就fail了
首先将右侧向量带入,将右侧向量放到矩阵中(最右列),即增广矩阵augmented matrix,对这一列的每行做消元时候相同的操作
回代就是把新的矩阵转换成方程组,UX=c算出未知数的值,从下网上,依次算出z y x,是反向的。
矩阵变化,虽然之前在用矩阵,但是之前的操作,即消元步骤,并不是用矩阵来表示,下面就引入消元矩阵的概念。
矩阵乘法的一些思想
matirx * column = column
row * matrix = row
一步一步来,每次一个消元矩阵,下面是第一个消元矩阵
上图左为elementary matrix 即初等矩阵E21,表示位置目的把2 1 变成0。
然后是第二个消元矩阵
两步,消元就完成了。
把上面的消元矩阵结合起来如下
上式即矩阵相乘的结合律。
还有另一种初等矩阵,用于交换行的,or 置换,行交换,列交互,都可以使用单位阵来找置换矩阵
置换行的单位阵在左侧,置换列的单位阵在右侧。
同时引入矩阵的逆:
本节课主要是从三种几何角度来解释了方程组(或者说matrix于vector的乘法),一种角度是row picture,另一种则是column picture,还有big picture。下面就课程的一些例子做一个summary。
方程组和对应的matrix如下
row picture: 一次取一行,在平面上作图,每个方程就是一条直线,直线的交点就是方程的解,如下图:
column picture:找到正确的线性组合(linear combination),列向量的线性组合,用两个向量得到第三个向量,如下图
big picture:上面的两个向量的任意组合将得到一个平面,线性组合可以得到b,所有的线性组合得到所有的b,即整个平面(高维为超平面),线代的思想的基础即是线性组合。
和两个的比较类似,只不过维度多了一维,列一下。
row picture:三个方程对应三个平面,解是三个平面的交点(当然需要三个平面不平行)
column picture:则是三维空间的向量的线性组合
big picture:左侧矩阵不变,不同的线性组合可以构成整个三维空间,即AX = b,不论b是多少,X都有解(对于上图中的A)。而对于更多的方程和未知数,对应更高维度的矩阵A,道理其实是一致的,假如A中的列向量是线性无关的(即相互独立),他们能组成整个维度空间的所有向量,而假如线性有关(即有的列向量可以由其他向量组合而成,则改列向量相当于没有贡献),那么他们只能组成一个平面,甚至以条直线。
AX可以认为是A的线性组合方式理解,计算AX可以像上图一样,以列的线性组合的方式进行,推荐用这种方法来思考,对矩阵的理解有益。
无意中看到了自己的404页面,空荡而生硬,联想到了浩哥的404,咱也公益一把,也算是近点微薄之力。
虽然希望渺茫,但是希望这些娃能过得幸福,即使不在亲生父母身边,幸福是最重要的。
公益404
公益404接入地址:http://www.qq.com/404/
闲逛statckoverflow,有个问题是this指针到底是存在哪里的,栈,堆,还是代码段中?
下面有个哥们给出了比较权威的解释:
C++ ISO的规范里面说
In the body of a nonstatic (9.3) member function, the keywordthisis a non-lvalue expression whose value is the address of the object for which the function is called.
值得注意的是this并不是一个变量,它是一个表达式,就像1+2一样。而表达式的值可以存在任何地方,栈,寄存器,堆等,具体取决于编译器。即this是一个值为指针的表达式。
看到了non-lvalue的时候我自然就想到不就是rvalue么,也不知道为啥这么说,为了了解为何这么说(还是木有了解,可能是习惯?),又去看了下lvalue和rvalue,来自51CTO的一篇文章解释的不错,摘抄如下。
术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。
C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”
记住,lvalue和rvalue是针对表达式而言的。
lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。
rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string(“meow”) , 和 x++ 都是 rvalue。
++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,最后返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。
lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。
参考文献
mark一下,奥特卡同学来北京,6年不见了,感觉没变,依旧阳光,下午到我厂臭美了一番。
晚上,ZYANG和小蔡过来一起吃了个饭,聊得比较尽兴,10点多了,店都关门了才散。
更多的不说了,回忆是挺好的
google 最近正在定义一个广告相关的概念,active view,目前是针对display广告的,含义我理解就是一个广告被看见的程度。
根据google 的介绍,和我的理解,做一些解释和预测。
为何有这个定义:
因为投放display广告的广告主最关心的问题是,我的这个广告知否被用户看见了,假如没看见这个impression的钱就打水漂了,假如看见了,直觉上来讲肯定是看的时间越长越好。
如何定义:
大致是基于广告在屏幕上展示的比例和展示的时间。比如,广告有80%以上在屏幕上而且展示时间大于2s可以认为是有效的view。active根据类似的方法把是否view定义成了数值,可以使用展示比例和展示时间两个度量,也可以整合成一个度量。
这个定义能干啥:
根据adwords博客的描述,在viewable的情况下(可以假设展示比例超过一定阈值),展示时间越长的广告的ctr越高。猜测active view未来将会有如下应用:
1. 根据active view将原有的impression一分为二,只有viewable的广告才计费(当然计费会提高),其余的不收费,即cpv
2. 将站点和广告的active view作为一个度量,作为广告展示的评分
3. 广告主可以根据active view的高低来分阶段付费,直觉上就是效果越好给钱越多,而效果好不好由activew view来定义
active view的扩展:
我觉得这个定义最大的意义就是让一个媒介的展示可以度量化,不论是搜索引擎对结果的评估,媒体网站对自己各个部分曝光度的评估都可以借鉴。
假如你对足球感兴趣,那么你可以关注我的微信公共账户-虫子侃球,严格来说,它是个机器人,可以查询五大联赛球队最新比赛结果,以及预告未来几场比赛的时间。本文会先介绍一下这个账号的使用,然后也科普下这个账号的由来和开发。
在微信公共账号里面搜索“虫子侃球”即可添加账号,或者扫描下面的二维码
1.输入球队名称,查询球队上一场比赛比分和未来比赛时间
2.查询联赛球队名单,一方面让用户了解联赛球队名单,另一方面为了让用户正确输入球队名称,同系统一致(后续会升级系统,引入球队名称的同义信息,更方便用户输入)
3.help界面,查看账号如何使用,错误输入也将显示该界面
唠叨几句关于这个公共账号的诞生。
为什么要做
1.最近使用了一些生活相关的公共账号,感觉和app和浏览器对比,得到我想要的东西都更加快捷,清晰,比如天气预报相关的,只需要输入城市名称,不像墨迹天气,要打开刷新一会,而且app还老是有一些通知,同时会常驻内存。
2.我是个足球迷,又是个喜欢折腾的手艺人,作为球迷我迫切想尽快知道我喜爱的球队的信息,同时也想知道对手的信息(想让他们输呗,额,好阴暗);作为一个手艺人,我对微信公共账号有点兴趣,想折腾折腾。
3.我有很多球迷朋友。
这三点促使我做了这个账号。
怎么做
这个比较简单,我这里简单说下,希望对新手上门公众账号有所帮助
1.首先是申请公众账号,这个需要身份证和手机号码,申请之后就可以配置和使用公众账号了。很多媒体人和公知的公共账号基本上会每天发布一篇文章(我觉得这个限制很好,一方面防止信息泛滥,另一方面可以促进提升质量)。而机器人账号需要使用高级功能。
2.微信高级功能,有编辑模式和开发者模式,编辑模式就是编辑key和value的映射,用户给你发送key,你返回它value,比较固定。而开发者模式则强大的多,可以让用户通过自己的server自定义返回信息。编辑模式和开发者模式不可共存(坑爹,简单的功能其实编辑模式修改更加方便)。
3.开发者模式,这个模式需要首先验证server的网址以便接入,参考微信的例子即可。然后就可以开发业务功能了(这个时候验证信息就可以不返回,而只是做验证了)。
4.虫子侃球的开发,使用php 语言(感谢我老婆对我的大力支持,我之前是个php 盲),目前功能比较单一,我选择了虎扑作为比赛信息的来源。用python处理了五大联赛的的球队名称和虎扑url的映射关系,然后直接放入php的脚本里面,这个只需要每年更新一次即可。接下来就是根据用户的输入返回相应的信息了,当用户输入球队名称命中球队dict,就去相应的虎扑url页面中截取对应的element即可,目前只选择了上一场比赛信息和未来几场比赛信息。
看上去比较简单吧,当然我做的也比较糙
账号的部署
开始把账号部署在了我这个blog所在的空间,由于在美国,响应时间成了问题。第二天改到了sae ,但是这货的开发者认证让我很蛋疼,而且天天要豆豆,一怒之下,不用了;最终选择了我厂的bae (百度应用引擎),用起来还不错,也顺便推荐一下。
账号的未来
一点就是把代码给share了,让大家帮我看看bug,另外看看大家都有什么建议,对账号进行改进。还有一点是找个人写点啥,推送给大家,我没那个文采,欢迎大家自荐
之前一直都在用86的vps,先感谢一下。
迁移到bluehost有三个原因,首先是自己想独立放,不然经常!麻烦别人;二是vps目前我尚不需要,bluehost足以;三是bluehost空间和流量无限,可以折腾玩。
迁移起来并不复杂,将原来的blog的worspress目录备份上传到bluehost,原来的数据库导出。在bluehost需要建立数据库和用户,同时将这些name更新到wp-config.php,然后用phpMyadmin导入数据库。
有一点很重要,因为我不换域名,在新的空间work之前不能把旧的下掉,bliehost提供了临时的url,可以来做测试,而具体的使用可以参考bluehost的帮助,主要就是修改wp-option表对应的siteurl和home。然后就可以测试是否ok,这个时候有的页面和翻页可能有问题,但首页ok即可。
ok后,还有两件事要做,一是修改域名的nameserver,以便域名指向新的空间;二是在wordpress后台设置中将siteurl和home修改回来即可。
中间遇到图片中文乱码问题,手动更新了,后续还是用英文名吧。
迁移后,顺便把主题改了下,以前的感觉比较拥挤,换了个最新wordpress推荐的,还算小清新。
平板码字好痛:’(