21/8/16 读书笔记 问题定义&需求分析&架构设计 降维和度量学习

21/8/16 读书笔记

Code Complete 软件构建前的准备

将主要的风险提前清除,使得项目能够尽可能平稳进行。前期准备倾向改进需求分析和项目规划,其中心目标是降低风险,包括糟糕的需求分析和糟糕的项目计划带来的风险。

项目规划、商业案例分析、需求分析、高质量架构设计都属于前期工作,但是这些活动都需要经验和技能,不是轻而易举能够获得的。

发现错误的时间尽可能接近引入该错误的时间。一个缺陷在系统中存在的时间越长,它对之后的工作造成的损害越大。因此前期准备中就需要对需求、架构中存在的缺陷进行充分考虑。

准备工作的可以按顺序分为问题定义、需求分析、架构设计

问题定义在具体的需求分析之前,其利用客户的语言来从客户的角度描述问题。问题定义的意义在于我们找到的正确的软件目标,对要做什么有总体的把握。

需求分析是对“软件系统应该做什么”的详细描述,需求的明确性非常重要,其确保了客户来驾驭系统的功能(而不是由软件设计人员来决定)。需求分析的意义是保证我们在对问题有总体的把握的情况下,找到问题的重点方面。

  • 需求应该对于所有参与者都是可以阅读的,包括客户、第三方小组、软件设计人员、编码人员;
  • 保证每条需求都是可测试的
  • 所有已经预见的可能的需求改变进行描述
  • 对功能需求和质量需求并重;

软件架构是软件设计的高层部分,用于支持更细节的软件设计。架构是对于整个系统范围内的设计约束,不需要对特定系统的实现进行约束。软件架构应该保证我们在确定瞄准正确的问题后,能够使用正确的解决办法。软件的架构应该能够满足需求对于功能和质量的双重要求

  • 软件的架构应该描述系统的组织架构,说明为什么要这样设计架构,并与其他可能的设计方案对比,来证明每个类都是慎重考虑的。
  • 定义系统的主要构造块,并且明确构造块的主体职责以及相互的通信规则。
  • 详细定义主要的类,一般主要的类指那些数量占20%左右,构成了系统80%左右行为的类。
  • 描述相关数据的结构,包括文件、数据表等。
  • 架构应该确定统一的错误处理标准,包括如何向用户展示错误信息、如何记录错误日志等。
  • 描述系统对于可伸缩性、性能、安全性、资源管理、国际化、互用性、业务规则等方面的考虑和假设。

软件系统的健壮度不是取决于最薄弱的一环,而是所有薄弱环节的乘积。如果每个部分只是在最低限度上满足健壮度要求,那么系统整体是达不到所要求的健壮程度的。

好的架构应该和问题和谐一致。架构是问题的解决方法,但不是和问题硬捆在一起,其本身应具有设计者的思想光芒。

架构应该详细描述决策动机,应该注重可解释性,即“我们为什么这么做?为什么不用别的方法”。

  • 架构应该详细描述如何应对需求中可能发生的改变,具体来说,必须证明对当前的架构进行简单的修改就能满足需求分析中定义的那些预期需求变动。这些变动都已经被预料到了,任何单一的变更只会影响当前架构中的少数几个类。
  • 架构应该指出哪些区域具有风险,为什么具有风险,当前的架构是如何使得风险最小化的。

通常一个项目在前期准备上的开销占10%20%的工作量和20%30%的工作时间。如果在范围之外就要审视自己是否进行过度准备或者缺乏准备。

在构建过程中如果发现当前的形势已经有失败的迹象时,最好退回到前期准备重新开始。


机器学习 降维&度量学习

理论证明,如果我们的样本足够密集,采样密度足够大,那么k近邻学习的泛化误差率不超过贝叶斯最优分类器的两倍。

高维度的情形下出现的数据样本十分稀疏,导致距离计算十分困难,甚至计算内积都非常困难,这带来了“维度灾难”

降维通过将利用数学变换将原高维属性空间转变为一个低维的子空间。其理论基础在于虽然我们观测的样本是高维的,但是与学习任务真正相关的可能只是其中某个低维的子空间,称为高维空间中的一个低维嵌入,其余的属性空间通常受噪声影响显著。

多维缩放技术(Multi Dimensional Scaling, MDS)是经典的降维技术,其要求原始空间内样本间的距离在低维空间内保持。通常来说,我们不要求缩放前后的距离严格相等,而是尽可能接近,以有效降维。

线性变换进行降维的方法称为线性降维方法,其依赖于特定的变换矩阵来实现。根据对于低维子空间的性质有不同要求,而对变换矩阵施加了不同约束。比如MDS中,变换矩阵是正交变换。

主成分分析(Principal Component Analysis)试图在高维空间内找到一个超平面,满足:

  • 最近重构性:样本点到该平面的距离足够近。
  • 最大可分性:样本点在该平面上的投影尽可能分开。

这两点都能作为主成分分析的实际解释,因此二者实际是等价的。PCA通过将所有样本点投影到该超平面上,而实现降维(注意该超平面不一定只降一个维度,而可以降低多个维度)。实际上,PCA依赖于对样本的协方差矩阵的特征值对应的特征向量进行选择来实现降维,而舍弃的特征向量对应特征值较小,这意味着舍弃的向量所包含的信息更有可能是噪声。

线性降维假设了高维空间到低维空间的映射是线性的,然而实际情况中这种映射可能是非线性的,需要我们进行非线性降维。核化线性降维基于核技巧使得线性降维方法拓展到非线性降维中,

流形学习(Maniford Learning),借鉴了拓扑流形概念。文中介绍了两种流形学习方法:

  • 等度量映射:计算每个点的近邻点集合,将每个点和其所有近邻点相连成一条边,权重为二者欧氏距离,形成一张图,然后对于样本点A和B,计算A到B的最短路径。其维护了局部近邻样本之间的欧氏距离不变
  • 局部线性嵌入:计算每个点的近邻点集合,然后将当前点用其近邻点集合的线性组合表示出来,记下线性组合的相关系数\(\bold w\)。在低维空间中要求各个样本点的投影之间也应该满足\(\bold w\)​​​描述的线性组合关系。其维护了局部近邻样本之间的线性组合关系不变

流形:在局部上看具有欧氏空间的性质,能够使用欧氏距离进行计算;在全局上看则没有这种性质。典型的例子就是山地地形中,我们计算从山顶A到山顶B的需要走的距离,不能直接求AB间的欧氏距离。存在AB间的山谷C,对于A和C、B和C来说,他们各自处在同一个“局部”的概念中,计算A到山谷C的距离就是A到C的欧氏距离,B到C的距离同理。

每个空间对应了一个在样本属性上的距离度量,因此寻找合适的空间也就是寻找合适的距离度量。度量学习就是基于这一动机而诞生的,让我们基于样本来学习一个合适的度量方式,使得基于该度量近邻分类器能够获得更好的正确率。我们用马氏距离来描述一个度量方式,在数值上依赖于一个半正定对称矩阵\(M\)。我们将这个度量方式放入近邻学习器中,将\(M\)​​作为该学习器的参数来进行学习。

标准马氏距离中M是协方差矩阵的逆,在度量学习中M的灵活性更高,我们认为其只是一个半正定对称矩阵。

posted @ 2021-08-16 22:26  neumy  阅读(124)  评论(0)    收藏  举报