主成分分析学习笔记(从矩阵的相似变换到PCA运用)
要理解PCA算法,我们得先理解矩阵的本质,以及矩阵相似变换的本质,这里有一篇关于矩阵相似的深入分析,给予我理解PCA很大帮助:如何理解相似矩阵,也是理解下文的基础。
矩阵的本质和相似
现在进入正题。矩阵在我看来其实可以有两种理解(1)是一种变换(2)是一种运动。两种定义侧重点不同,“变换”是形容矩阵对于其他向量的功能而言的(矩阵作用于向量上,可以使向量发生‘拉伸’或‘旋转’效果);“运动”是指的矩阵本身,是一种静态特性,矩阵可以分解为特征值和特征向量(特征向量看做矩阵不同的运动方向,特征值看做矩阵朝向这些方向运动的大小)。但是,两种说法没有本质区别,在运动学中,一种运动作用到另一种运动上,其实也就是对那种运动的变换。
那什么是相似矩阵?这涉及到我们对于矩阵“变换”的深一层理解。上面的文章说到,矩阵的本质是变换,并且是“在指定基下的一种变换”,而两个矩阵相似其实就是同一种变换在不同基下的表现形式。
其实文章的矩阵相似变换示意图很形象的表现了矩阵相似的本质。唯一有一点我们要注意,图中变换矩阵P是向量从一种基到另外一种基底的变换矩阵。那不是说矩阵是指定基下的变换吗?P变换的基底是什么?其实我觉得,P的基底其实在这里并不重要,它肯定是存在的,但是对我们理解来说不重要。抽象的感觉来说,就是存在一个把基底A和基底B都表示在其中的基空间,在这个空间内P把A变换成B。
但简而言之,矩阵P就是A基底在B基底下的坐标表示。
主成分分析
有了以上理解,我们来看主成分分析。我们拥有一个已经中心化了的数据集S,然后我们求出S的协方差矩阵C。C中表示的是数据中各个维度内部的方差,和他们之间的协方差,C中包含两种信息:(1)每个维度内的各个数据之间关系(2)不同维度之间的数据联系。我们想要提取其中的主成分,降低数据量怎么办?很自然地想法就是去除那些对数据整体影响不大的维度,那我们找到那些方差小的,数据变化不大的维度去掉不就行了?可是有一个问题,如果我们就这样在C的主对角线中找到方差最小的维度去掉,我们丢失的信息就不仅仅只是这个维度的数据,我们还丢失了这个维度和其他维度之间的联系。
怎样最小化减少信息丢失呢?我们想到了“变换”这个词。我们如果把协方差矩阵,变换到一个新的坐标基下,让各个维度之间都没有联系,我们不就可以不用关心维度之间的联系了吗?
对角化协方差矩阵: * * = C
有了对矩阵相似的理解,我们可以知道,这个公式其实就是通过变换矩阵P,将C变换到了另外一个坐标空间中去,而在这个坐标空间的和原来的C其实是等价的,而这个对角阵已经让不同维度之间的协方差为0了(不同维度都正交了)。现在如果我们把数据集放在新的坐标空间下考虑,它的协方差矩阵也就是了,我们现在就可以直接去掉矩阵对角线最小的几个元素了,因为他们现在确实就是对数据整体影响最小的维度。
去掉了影响最小的维度后,我们把数据集也用变换矩阵P相应变换到这个新的基下S' = S * P。然后根据上一步得到的方差最小的维度,直接在S'中划去即可,S'就是主成分分析得到的新的数据集。(更简单的做法:P矩阵实际上是新基底在原基上的坐标表示,P矩阵的每一列对应的是每一个维度的坐标变换,我们如果去除相应维度的坐标变换,也即是去除相应的列,可以直接将得到的S'去掉冗余维度)
补充:有人说对角化方差矩阵C,得到它的特征值矩阵,然后找到最小的特征值对应的特征向量,从P中去掉这些特征向量,再把得到的P'右乘原数据集S得到S'。虽然这样做的步骤得到的答案是没有问题的,但我觉得主成分的求解跟方差矩阵的特征值本来是没有任何关系的,只是分析的过程中恰好我们想把矩阵C变换为除主对角线以外,其余值(维度间联系)都为0的矩阵,得到的对角阵恰好又是我们以前所定义的特征值矩阵罢了。(很简单,如果协方差矩阵的排列是副对角线表示维度内数据方差的话,我们的任务就是把除副对角线以外其他的元素变为0,这个跟矩阵的特征值就没有任何关系了)
思考:C矩阵的静态特征:特征值跟我们的主成分分析是没有联系的,我们真正要分析的是原数据集各个维度内和维度之间的存储的信息。只是恰好,方差矩阵的对角线表示的是原数据集每个维度内的方差,而对角线又是矩阵C的特征值。
汇编学习记录
栈
(1)栈和栈寄存器:栈的寻址机制和代码寻址,数据段寻址实现的机制都是一样的,代码段寄存器为SS,通过SP来指示栈顶位置
(2)栈空时SP指向栈顶的下一个元素。Pop元素时SP+2;Push元素时SP-2
(3)在8086中,栈的最大值为64KB,因为栈寄存器SP的范围是0~ffff;且一个要注意的点是:汇编中栈没有越栈检查机制,一定要记清楚自己定义栈的大小,不要越栈。
(4)汇编伪指令和指令:assume cs:XXX ; XXX segment , XXX ends(注意ends 是end segment 的意思)end....
程序的载入:
(1)载入程序的是操作系统的shell,在DOS中这个shell也即是command程序
(2)DOS在加载应用程序进入内存的时候,会在DS:0(DS数据段寄存器)位置开始的256字节大小的区域,加入PSP区,这区里面描述了程序的大小,程序一些必要的数据等等
(3)所以程序开始CS都会比DS大256个字节
[BX]和loop指令
(1)BX寄存器一般用来存储寻址偏移量大小
(2)一个需要注意的点:在masm编译器下,内存寻址不能直接写[BX]或者[0],这样的表示会被直接编译成去掉括号的形式,而应该编译成DS:[BX]或DS:[0],要指定段寄存器名
(3)CPU执行loop指令时要做两步操作:1.(cx)= (cx)- 1 ;2.判断cx里面的值,若不为零则跳转至标号处继续循坏,反之走出循环。(循环的默认计数器是放在CX中的)
(4)编程时注意:
1.两个运算对象的类型要匹配(数据位大小相同,所以对内存每个字节做操作的时候就要用到al,ah等等寄存器)
2.结果不要溢出(怎样处理可能溢出的算法过程?->将可能溢出的数据用更大的寄存器装,eg. ax寄存器高位置0,低位al放数据,每次结果放入dx,那么dx就可以存储用al接受的不同大小的数据了);
3.汇编程序中,数据不能以字母开头(也就是说数据ffff要写为0ffff才能在汇编程序中直接使用)
(5)段前缀的灵活使用,可以将任意寄存器X,写为X:[0]的形式,X中储存一个自定义段的开始地址。
财富自由之路记录(7,8,9,10)
1.如何优化自己的第二种商业模式?
(写书,创新性发明,专利...)提升自己的创造力;找到顾客的刚需
2.如何优化自己的第三种商业模式?
关键词:合理减少出售时间的数量->投入到持续的“不断进化”之中去
3.“自我操作系统”?
自我操作系统构成:
(1)概念与关联
(2)价值观和方法论
(3)实践(检验)和践行
4.你所拥有的最宝贵的财富?
(1)人生三大坑:
莫名其妙的凑热闹
火急火燎的随大流
为别人操碎了心
(2)人的注意力是挖掘价值的最基本工具(网上的吸引流量的本质就是吸引人的注意力)
(3)注意力>时间>金钱(注意力才是一个人最宝贵的东西,减少生活中无谓的注意力消耗)