UML类图符号 各种关系说明以及举例

UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。 依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。 泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。 实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。 关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。 聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。 组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。 1.1.1       依赖(Dependency):虚线箭头表示 1、依赖关系也是类与类之间的联结 2、依赖总是单向的。(#add 注意,要避免双向依赖。一般来说,不应该存在双向依赖。) 3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。 (软件开发中,往往会设计一些公用类,供别的类调用,如果这些公用类出问题了,那调用这些公用类的类都会因此而出问题。 两个元素之间的一种关系,其中一个元素(提供者)的变化将影响另一个元素(客体),或向它提供所需信息 显示一个类引用另一个类) 方法参数示例: public class Person { void buy(Car car) { … } } 表示方法:虚线加箭头 特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。 依赖关系可以分为以下四类: 1)  使用依赖(Usage)表示客户使用提供者提供的服务以实现它的行为,包括: 使用<<use>>–声明使用一个类时需要用到已存在的另一个类。 调用<<call>>–声明一个类调用其他类的操作的方法。 参数<<parameter>>–声明一个操作和它的参数之间的关系。 发送<<send>>–声明信号发送者和信号接收者之间的关系。 实例化<<instantiate>>–声明用一个类的方法创建了另一个类的实例。 2)  抽象依赖(Abstraction)表示客户与提供者之间用不同的方法表现同一个概念,通常一个概念更抽象,一个概念更具体。包括: 跟踪<<trace>>–声明不同模型中的元素之间存在一些连接但不如映射精确。 精化<<refine>>–声明具有两个不同语义层次上的元素之间的映射。 …

OpenCV中的机器学习方法

Mahalanobis算法:通过除以协方差来对数据空间进行变换,然后计算距离。如果协方差矩阵是单位矩阵,那么该度量等价于欧氏距离。 K均值算法:一种非监督的聚类方法,使用K个均值来表示数据的分布,其中K的大小由用户定义。该方法与期望最大化方法的区别是K均值的中心不是高斯分布,而且因为各个中心竞争去“俘获”最近的点,所以聚类结果更像肥皂泡。聚类区域经常被用作稀疏直方图的bin,用来描述数据。 正态/朴素贝叶斯分类器算法:一种通用的分类器,它假设特征是高斯分布而且统计上互相独立。这个假设过于苛刻,在很多条件下不能满足,故被称作“朴素贝叶斯”分类器。而在许多情况下,这个分类器的效果却出奇的好。 决策树算法:一个判别分类器。该树在当前节点通过寻找数据特征和一个阈值,来最优化分数据得不同的类别。处理流程是不停地划分数据并向下到树的左侧子节点或右侧子节点。虽然它一般不具有最优性能,但是往往是测试算法的第一选择,因为它的速度比较快。而且具有不错的功能。 Boosting算法:多个判别子分类器的组合。最终的分类决策是由各个子分类器的加权组合来决定。在训练时,逐个训练子分类器,且每个子分类器是一个弱分类器(只是优于随机选择的性能)。这些弱分类器由单变量决策树构成,被称作“树桩”。在训练时,“树桩”不仅从数据中学习分类决策,而且还根据识别精度学习“投票”的权重。当逐个训练分类器的时候,数据样本的权重被重新分配,使之能够给予分错的数据更多的注意力。训练过程不停地执行,直到总错误(加权组合所有决策树组成的分类器产生的错误)低于某个已经设置好的阈值。为了达到好的效果,这个方法通常需要很大量训练的训练数据。 随机森林:这是由许多决策树组成的“森林”,每个决策树向下递归以获取最大深度。在学习过程中,每棵树的每个节点只从特征数据的一个随机子集中选择。这保证了每棵树是统计上不相关的分类器。在识别过程中,将每棵树的结果进行投票来确定最终结果,每棵树的权重相同。这个分类器方法经常很有效,而且对每棵树的输出进行平均,可以处理回归问题。 人脸检测/Haar分类器:这个物体检测方法巧妙地使用了boosting算法。OpenCV提供了正面人脸检测的检测器,它的检测效果非常好。你也可使用OpenCV提供的软件训练算法,使之能够检测其他物体。该算法非常擅长检测特定视角的刚性物体。 期望最大化(EM)算法:一种用于聚类的非监督生成算法,它可以拟合N个多维高斯到数据上,此处,N的大小由用户决定。这样仅仅使用几个参数(均值和方差)就可以非常有效的表达一个比较负责的分布。该方法经常用于分科。 K近邻:K近邻可能是最简单的分类器。训练数据跟类别标签存放在一起,离测试数据最近的(欧氏距离最近)K个样本进行投票,确定测试数据的分类结果。该方法通常比较有效,但是速度比较慢且对内存需求比较大。 神经网络/多层感知器:该分类算法在输入结点和输出结点之间具有隐藏结点,这可以更好的表示输入信号。训练该分类器很慢,但是识别时很快。 支持向量机(SVM):它可以进行分类,也可以进行回归。该算法需要定一个高位空间中任两点的距离函数。(将数据投影到高维空间会使数据更容易地线性可分。)该算法可以学习一个分类超平面,用来在高纬空间里实现最优分类器。当数据有限的时候,该算法可以获得非常好的性能,而boosting和随机森林只能在拥有大量训练数据时才有好的效果。 算法使用总结 计算机视觉中使用算法流程:标定数据 –> 提取特征 –> 数据分类(训练集、测试集、验证集) –> 选择分类器。 特征提取:需要寻找表达物体固有属性的特征,如梯度直方图、色彩、各种特征等。如果有背景信息,可能需首先把背景去除,提取出物体,然后进行图像处理(归一化图像、尺度变换、旋转、直方图均衡),计算很多特征。物体的特征向量将与物体的标签对应。 数据分类:建议交叉使用训练集、验证集、测试集。即将所有数据分成K个子集,然后每次随机选取其中一部分来训练,剩余的用来测试。测试结果求平均,得到最终的性能结果。使用交叉验证,可更清楚地看到处理异常数据时分类器的性能。 分类器选择:一般分类器的选择需要考虑计算速度、数据形式和内存大小。一些应用中,在线用户优先选择建模,所以分类器需要能够快速完成训练。这种情况下,最近邻算法、正态贝叶斯和决策树是不错的选择。如果需要考虑内存因素,决策树和神经网络是理想的选择。如果不需要很快训练,而需要很快判断,那么神经网络可以满足要求,正态贝叶斯和SVM也不错。如果不需要训练很快,但是需要精度很高,可选择boosting和随机森林。如果选取的特征比较好,仅仅需要一个简单易懂的分类器,就选择决策树和最近邻算法。要获取最好的性能,离不开boosting和随机森林。 诊断特征重要性的算法: 1)用训练集训练一个分类器。 2)使用验证集或测试集来确定分类器的准确率。 3)对于每一个数据样本和一个选择的特征,随机选择其他特征数据中的该特征的值来替代(替补抽样法)。这样可以保证特征的分布与原始数据集的一样,但是特征的结构或者意义被抹去了(因为它的值是从剩余的数据中随机选择的)。 4)用改变后的训练集训练分类器,然后用改变后的测试集或者验证集来评价分类器。如果完全打乱特征使正确率降低很多,那么这个特征并没有多重要,可以考虑删除。 5)把原始数据重新换一个特征按照3和4操作,直到所有的特征全部分析完毕,得到的结果就是每个特征的重要性。 机器学习中,一些重要规律是:大量数据比少量数据好;好的特征比好的算法更重要。如果选取的特征好,最大化它们的独立性,最小化它们在不同环境下的变化,那么大部分算法那都可以获得比较好的效果。此外,经常遇到的两个问题: 欠拟合:模型假设太严格,所以模型不能拟合到实际数据上; 过拟合:算法不仅学习了数据,而且把噪声也当做信号学习了,这样算法的推广能力很差。 欠拟合的解决方案:使用更多的特征有利于拟合;选用一个学习能力更好的拟合算法。 过拟合的解决方案:增加训练数据的数量可使得拟合曲线更光滑;减少特征的数量可降低过拟合程度;使用一个学习能力差一点的算法。 训练和测试比较好,但实际应用效果不好的解决方案:采集更加真实的数据。 模型无法学习数据的解决方案:重新选择特征,使特征更能表达数据的不变特征;采集更新、更相关的数据;选用一个学习能力更好的拟合算法。 交叉验证与自抽样法 交叉验证首先把数据分为k个不同的子集。然后用k-1个子集进行训练,用没有用来训练的子集进行测试。这样做k次(每个子集都有一次机会作为测试集),然后把结果平均。 自抽样法跟交叉验证类似,但是验证集是从训练集中随机选取的。选择的点仅用于测试,不在训练中使用。这样做N次,每次随机选择一些验证集,最后把得到的结果平均。这意味着一些数据样本会出现在不同的验证集中,自抽样的效果一般胜于交叉验证。 ROC曲线评估了分类器参数的变化对分类器性能的影响。 参考文献:学习OpenCV ——————— 作者:Dream_yz 来源:CSDN 原文:https://blog.csdn.net/yzhang6_10/article/details/53958153 版权声明:本文为博主原创文章,转载请附上博文链接!