精华内容
下载资源
问答
  • 我们在二超对称规范理论中建立了双重对偶。... 在IR模式下,GLSM提供了一个字符串sigma模型,其目标空间是缺陷NS5-brane,Kaluza-Klein涡旋和外来5 2 2 -brane。 它们都是第二个方面,并与T对偶相关。 此模型
  • 我们研究S 3×θ2 $$ {\ mathbb {S}} ^ 3 \ times {\ mathbb {R}} _ {\ theta} ^ 2 $$上的五维超对称U(1)规范理论的定位 其中ℝ2 $$ {\ mathbb {R}} _ {\ theta} ^ 2 $$是非交换(NC)平面。 可以使用可分离...
  • 计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动。通常情况下,物体位置的变化包含三个基本的变化:平移、旋转和缩放,物体的运动也可以用这三个基本的运动...

    计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动。通常情况下,物体位置的变化包含三个基本的变化:平移、旋转和缩放,物体的运动也可以用这三个基本的运动形态的组合来描述。


    图形学中物体运动的数学表述是:将点的初始位置坐标P0映射到经过平移、旋转、绽放后的新位置P1的过程。


    平移:

    平移就是在原始的三维空间坐标点上分别加上对应方向上的平移量:




    旋转:

    旋转分为两类:在二维平面和三维空间中的旋转。

    二维平面上的旋转:



    相对坐标注原点旋转角度θ:




    以矩阵形式表述:




    扩展到三维空间,先看简单的绕某一个坐标轴旋转的情况。


    绕Z轴旋转:




    绕X轴旋转:




    绕Y轴旋转:




    三维空间中绕指定的任意轴旋转变换可以分解为分别绕三个坐标轴的旋转变换和一个平移变换的叠加。

    缩放变换是三个维度上分别乘一个缩放系数:




    总结以上,可以看到变换后的坐标点除了平移变换是在原始坐标上加上一个平移向量外,旋转、缩放都是在原始坐标点上乘以一个变换矩阵。


    为了把平移变换也统一成矩阵相乘的形式,引入了齐次坐标齐次坐标就是将一个原来是N维的向量用一个N+1维向量来表示 。在齐次坐标中用4个分量来表示三维空间中的一个点,前三个分量跟普通三维坐标一样,第四个分量设置为1。


    在齐次坐标下,平移变换可以表述为:




    这样,在齐次坐标系下,三维空间的运动一一平移、旋转、缩放在形式上都统一为左乘一个变换矩阵的形式。

    考察一个物体的运动,先进行一次平移,再进行一次旋转,两个运动可以表述为:




    R*T也是一个4*4的变换矩阵,这个变换包含了一次平移和一次旋转的叠加。


    推广到更复杂的变换,只需要在当前R*T矩阵上依次左乘上对应的变换矩阵,最终得到的变换矩阵包含了物体所有变换的叠加,而这一系列的变换只需要用初始坐标左乘上这个最终的变换矩阵就可以实现,这个矩阵就是“模型矩阵”。


    例如对于三维空间中的一条直线,直线经过点(x0,y0,z0),并且方向为(a,b,c),则一个物体绕该直线旋转θ角度的运动变换可以分解为:

    • 平移(-x,-y,-z)平移到原点
    • 绕x轴旋转角度p使指定的旋转轴在x-z平面上
    • 绕y轴旋转角度q使指定的旋转轴与z轴重合
    • 绕z轴旋转角度 绕y轴旋转角度-q
    • 绕x轴旋转角度-p     
    • 平移(x,y,z )

    综上可以看到,模型矩阵描述了三维空间物体的一系列变换的信息。在物体为刚体模型(刚体是在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体)的情况下,物体的所有顶点通过左乘模型矩阵,就可以实现物体的指定运动,所以模型矩阵大大降低了运动模型的复杂度。


    模型视图矩阵


    在模型矩阵中,关心的是物体在运动之后在世界坐标系下位置坐标点的变化。更加普遍的情况是,我们更加关心物体相对于观察者的位置变化,而不仅仅是关于世界坐标系下的变化。例如观察者在一辆运动着的汽车中观察另一辆相向而行的汽车的变换,这时候观察者和被观察的物体都在运动。这种观察者也在移动的情况,在现实世界中更加普遍。这也增加了确定运动模型的复杂度。


    所幸的是,我们可以从另一个角度看待这个问题,即观察者的位置和方向发生变化时(这个变换可以用一个模型矩阵来表述),可以看做是被观察的物体进行了观察者运动相反的运动,即需要在模型矩阵的基础上再左乘一个观察者变换矩阵的逆矩阵,这个逆矩阵称为“视图矩阵”,而这个视图矩阵跟模型矩阵相乘得到的矩阵就是所谓的“模型视图矩阵”。


    物体左乘模型视图矩阵后获得的新的位置(形状),描述 的是当观察者和物体都在运动时,物体在观察者眼中坐标点(形状)的变化。


    数学 就是这么奇妙,它先把一个很简单问题复杂化,然后再把它简单化,以彰显其牛逼之处。


    转载于:https://my.oschina.net/abcijkxyz/blog/787728

    展开全文
  • 考虑纱线间的相互挤压状况,在假设编织纱和轴纱横截面形状分别为扁平椭圆形和正方形的基础上,系统建立了三维五向及全向编织复合材料的三单胞参数化结构模型。给出了两种编织材料的纤维体积含量计算公式并进行了对比...
  • 维空间超曲面等投影问题用几何方法是不便表达或不易表达的,但用抽象的数学解析的方法...本文用解析方法确定四维空间中投影的个问题,不仅为计算机绘制四维空间投影图提供大量的数学模型,也为几何作图提供了依据。
  • 我们生活在一个三的世界——如果要观察一个物体,我们可以: 1、从不同的位置去观察它。(视图变换) 2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换) 3、如果...
    在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能是X轴向右,Y轴向上,Z轴垂直屏幕。这些限制给我们的绘图带来了很多不便。

    我们生活在一个三维的世界——如果要观察一个物体,我们可以:
    1、从不同的位置去观察它。(视图变换)
    2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
    3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
    4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
    这些,都可以在OpenGL中实现。

    OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。关于矩阵的知识,这里不详细介绍,有兴趣的朋友可以看看线性代数(大学生的话多半应该学过的)。
    OpenGL可以在最底层直接操作矩阵,不过作为初学,这样做的意义并不大。这里就不做介绍了。
    1、模型变换和视图变换
    从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。
    由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
    glMatrixMode(GL_MODELVIEW);
    通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:
    glLoadIdentity();

    然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到三个函数:
    glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。
    glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
    glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。

    注意我都是说“与XX相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。
    假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。所以,经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法的结合率,((RT)v) = (R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。
    OpenGL之所以这样设计,是为了得到更高的效率。但在绘制复杂的三维图形时,如果每次都去考虑如何把变换倒过来,也是很痛苦的事情。这里介绍另一种思路,可以让代码看起来更自然(写出的代码其实完全一样,只是考虑问题时用的方法不同了)。
    让我们想象,坐标并不是固定不变的。旋转的时候,坐标系统随着物体旋转。移动的时候,坐标系统随着物体移动。如此一来,就不需要考虑代码的顺序反转的问题了。

    以上都是针对改变物体的位置和方向来介绍的。如果要改变观察点的位置,除了配合使用glRotate*和glTranslate*函数以外,还可以使用这个函数:gluLookAt。它的参数比较多,前三个参数表示了观察点的位置,中间三个参数表示了观察目标的位置,最后三个参数代表从(0,0,0)到(x,y,z)的直线,它表示了观察者认为的“上”方向。
    2、投影变换
    投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。(注意,从现在起,坐标可以不再是-1.0到1.0了!)
    OpenGL支持两种类型的投影变换,即透视投影和正投影。投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
    glMatrixMode(GL_PROJECTION);
    通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
    glLoadIdentity();

    透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。
    使用glFrustum函数可以将当前的可视空间设置为透视投影空间。其参数的意义如下图:
    http://blog.programfan.com/upfile/200610/20061007151547.gif
    声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。
    也可以使用更常用的gluPerspective函数。其参数的意义如下图:
    http://blog.programfan.com/upfile/200610/2006100715161.gif
    声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。

    正投影相当于在无限远处观察得到的结果,它只是一种理想状态。但对于计算机来说,使用正投影有可能获得更好的运行速度。
    使用glOrtho函数可以将当前的可视空间设置为正投影空间。其参数的意义如下图:
    http://blog.programfan.com/upfile/200610/20061007151619.gif
    声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。

    如果绘制的图形空间本身就是二维的,可以使用gluOrtho2D。他的使用类似于glOrgho。
    3、视口变换
    当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:应该把像素绘制到窗口的哪个区域呢?通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。(即:把整个图象填充到一半的窗口内)
    http://blog.programfan.com/upfile/200610/20061007151639.gif
    声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。

    使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最左下方),后两个参数分别是宽度和高度。

    4、操作矩阵堆栈
    介于是入门教程,先简单介绍一下堆栈。你可以把堆栈想象成一叠盘子。开始的时候一个盘子也没有,你可以一个一个往上放,也可以一个一个取下来。每次取下的,都是最后一次被放上去的盘子。通常,在计算机实现堆栈时,堆栈的容量是有限的,如果盘子过多,就会出错。当然,如果没有盘子了,再要求取一个盘子,也会出错。
    我们在进行矩阵操作时,有可能需要先保存某个矩阵,过一段时间再恢复它。当我们需要保存时,调用glPushMatrix函数,它相当于把矩阵(相当于盘子)放到堆栈上。当需要恢复最近一次的保存时,调用glPopMatrix函数,它相当于把矩阵从堆栈上取下。OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。
    通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便,更快速。
    注意:模型视图矩阵和投影矩阵都有相应的堆栈。使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。
    5、综合举例
    好了,视图变换的入门知识差不多就讲完了。但我们不能就这样结束。因为本次课程的内容实在过于枯燥,如果分别举例,可能效果不佳。我只好综合的讲一个例子,算是给大家一个参考。至于实际的掌握,还要靠大家自己花功夫。闲话少说,现在进入正题。

    我们要制作的是一个三维场景,包括了太阳、地球和月亮。假定一年有12个月,每个月30天。每年,地球绕着太阳转一圈。每个月,月亮围着地球转一圈。即一年有360天。现在给出日期的编号(0~359),要求绘制出太阳、地球、月亮的相对位置示意图。(这是为了编程方便才这样设计的。如果需要制作更现实的情况,那也只是一些数值处理而已,与OpenGL关系不大)
    首先,让我们认定这三个天体都是球形,且他们的运动轨迹处于同一水平面,建立以下坐标系:太阳的中心为原点,天体轨迹所在的平面表示了X轴与Y轴决定的平面,且每年第一天,地球在X轴正方向上,月亮在地球的正X轴方向。
    下一步是确立可视空间。注意:太阳的半径要比太阳到地球的距离短得多。如果我们直接使用天文观测得到的长度比例,则当整个窗口表示地球轨道大小时,太阳的大小将被忽略。因此,我们只能成倍的放大几个天体的半径,以适应我们观察的需要。(百度一下,得到太阳、地球、月亮的大致半径分别是:696000km,6378km,1738km。地球到太阳的距离约为1.5亿km=150000000km,月亮到地球的距离约为380000km。)
    让我们假想一些数据,将三个天体的半径分别“修改”为:69600000(放大100倍),15945000(放大2500倍),4345000(放大2500倍)。将地球到月亮的距离“修改”为38000000(放大100倍)。地球到太阳的距离保持不变。
    为了让地球和月亮在离我们很近时,我们仍然不需要变换观察点和观察方向就可以观察它们,我们把观察点放在这个位置:(0, -200000000, 0)——因为地球轨道半径为150000000,咱们就凑个整,取-200000000就可以了。观察目标设置为原点(即太阳中心),选择Z轴正方向作为“上”方。当然我们还可以把观察点往“上”方移动一些,得到(0, -200000000, 200000000),这样可以得到45度角的俯视效果。
    为了得到透视效果,我们使用gluPerspective来设置可视空间。假定可视角为60度(如果调试时发现该角度不合适,可修改之。我在最后选择的数值是75。),高宽比为1.0。最近可视距离为1.0,最远可视距离为200000000*2=400000000。即:gluPerspective(60, 1, 1, 400000000);
    现在我们来看看如何绘制这三个天体。
    为了简单起见,我们把三个天体都想象成规则的球体。而我们所使用的glut实用工具中,正好就有一个绘制球体的现成函数:glutSolidSphere,这个函数在“原点”绘制出一个球体。由于坐标是可以通过glTranslate*和glRotate*两个函数进行随意变换的,所以我们就可以在任意位置绘制球体了。函数有三个参数:第一个参数表示球体的半径,后两个参数代表了“面”的数目,简单点说就是球体的精确程度,数值越大越精确,当然代价就是速度越缓慢。这里我们只是简单的设置后两个参数为20。
    太阳在坐标原点,所以不需要经过任何变换,直接绘制就可以了。
    地球则要复杂一点,需要变换坐标。由于今年已经经过的天数已知为day,则地球转过的角度为day/一年的天数*360度。前面已经假定每年都是360天,因此地球转过的角度恰好为day。所以可以通过下面的代码来解决:
    glRotatef(day, 0, 0, -1);
    /* 注意地球公转是“自西向东”的,因此是饶着Z轴负方向进行逆时针旋转 */
    glTranslatef(地球轨道半径, 0, 0);
    glutSolidSphere(地球半径, 20, 20);
    月亮是最复杂的。因为它不仅要绕地球转,还要随着地球绕太阳转。但如果我们选择地球作为参考,则月亮进行的运动就是一个简单的圆周运动了。如果我们先绘制地球,再绘制月亮,则只需要进行与地球类似的变换:
    glRotatef(月亮旋转的角度, 0, 0, -1);
    glTranslatef(月亮轨道半径, 0, 0);
    glutSolidSphere(月亮半径, 20, 20);
    但这个“月亮旋转的角度”,并不能简单的理解为day/一个月的天数30*360度。因为我们在绘制地球时,这个坐标已经是旋转过的。现在的旋转是在以前的基础上进行旋转,因此还需要处理这个“差值”。我们可以写成:day/30*360 - day,即减去原来已经转过的角度。这只是一种简单的处理,当然也可以在绘制地球前用glPushMatrix保存矩阵,绘制地球后用glPopMatrix恢复矩阵。再设计一个跟地球位置无关的月亮位置公式,来绘制月亮。通常后一种方法比前一种要好,因为浮点的运算是不精确的,即是说我们计算地球本身的位置就是不精确的。拿这个不精确的数去计算月亮的位置,会导致“不精确”的成分累积,过多的“不精确”会造成错误。我们这个小程序没有去考虑这个,但并不是说这个问题不重要。
    还有一个需要注意的细节:OpenGL把三维坐标中的物体绘制到二维屏幕,绘制的顺序是按照代码的顺序来进行的。因此后绘制的物体会遮住先绘制的物体,即使后绘制的物体在先绘制的物体的“后面”也是如此。使用深度测试可以解决这一问题。使用的方法是:1、以GL_DEPTH_TEST为参数调用glEnable函数,启动深度测试。2、在必要时(通常是每次绘制画面开始时),清空深度缓冲,即:glClear(GL_DEPTH_BUFFER_BIT);其中,glClear(GL_COLOR_BUFFER_BIT)与glClear(GL_DEPTH_BUFFER_BIT)可以合并写为:
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    且后者的运行速度可能比前者快。
    到此为止,我们终于可以得到整个“太阳,地球和月亮”系统的完整代码。


    Code:
    --------------------------------------------------------------------------------
    // 太阳、地球和月亮
    // 假设每个月都是30天
    // 一年12个月,共是360天
    static int day = 200; // day的变化:从0到359
    void myDisplay(void)
    {
         glEnable(GL_DEPTH_TEST);
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         gluPerspective(75, 1, 1, 400000000);
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
         gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);

         // 绘制红色的“太阳”
         glColor3f(1.0f, 0.0f, 0.0f);
         glutSolidSphere(69600000, 20, 20);
         // 绘制蓝色的“地球”
         glColor3f(0.0f, 0.0f, 1.0f);
         glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
         glTranslatef(150000000, 0.0f, 0.0f);
         glutSolidSphere(15945000, 20, 20);
         // 绘制黄色的“月亮”
         glColor3f(1.0f, 1.0f, 0.0f);
         glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
         glTranslatef(38000000, 0.0f, 0.0f);
         glutSolidSphere(4345000, 20, 20);

         glFlush();
    }
    --------------------------------------------------------------------------------
    试修改day的值,看看画面有何变化。
    小结:本课开始,我们正式进入了三维的OpenGL世界。
    OpenGL通过矩阵变换来把三维物体转变为二维图象,进而在屏幕上显示出来。为了指定当前操作的是何种矩阵,我们使用了函数glMatrixMode。
    我们可以移动、旋转观察点或者移动、旋转物体,使用的函数是glTranslate*和glRotate*。
    我们可以缩放物体,使用的函数是glScale*。
    我们可以定义可视空间,这个空间可以是“正投影”的(使用glOrtho或gluOrtho2D),也可以是“透视投影”的(使用glFrustum或gluPerspective)。
    我们可以定义绘制到窗口的范围,使用的函数是glViewport。
    矩阵有自己的“堆栈”,方便进行保存和恢复。这在绘制复杂图形时很有帮助。使用的函数是glPushMatrix和glPopMatrix。
    展开全文
  • 信息安全系统三维空间

    千次阅读 2013-10-10 08:43:25
    维空间中,Y轴是OSI网络参考模型,信息安全系统的许多技术、技巧都是在网络的各个层面上实施的。X轴是“安全机制”,Z轴是“安全服务”。 由X、Y、Z三个轴形成的空间就是信息系统的“安全空间”,随着网络逐层...
    “信息安全保障系统”一般简称为“信息安全系统”。三维空间图见下图
    

     

    三维空间中,Y轴是OSI网络参考模型,信息安全系统的许多技术、技巧都是在网络的各个层面上实施的。X轴是“安全机制”,Z轴是“安全服务”。
    由X、Y、Z三个轴形成的空间就是信息系统的“安全空间”,随着网络逐层扩展,这个空间不仅范围逐步加大,安全的内涵也就更丰富,达到具有认证、权限、完整、加密和不可否认五大要素,也叫做“安全空间”的五大“属性”。
    显然,每个轴上的内容越丰富,越深入,越科学,“安全空间”就越大,安全性越好。

    关于信息安全系统和安全体系的更多内容请查看信息系统项目管理师教程(第二版)P538

    展开全文
  • 该程序处理种不同类型的网状结构分析模型:2D(平面)桁架、2D(平面)框架、格栅、3D(空间)桁架和 3D(空间)框架。 此外,还考虑了线性单元的两种弯曲行为:Euler-Bernoulli(纳维理论)单元和 Timoshenko ...
  • 从物理上讲,此流形作为非线性sigma模型的目标空间出现,该模型是通过在圆环上压实五维规范理论而获得的。 这样就可以根据弦理论中D-instantons的已知结果来计算规范理论的重音和弦瞬间。 此外,我们根据Calabi-Yau...
  • 基于此,我又将研究范围拓展为多视角视频的压缩编码理论的探究,提出了多视角彩色视频流的五维矩阵 (SDM)表示模型及SDM-DCT理论,本文主要针对基于4DM-DCT立体视频的压缩编码和基SDM-DCT的多视角彩色视频流压缩编码...
  • 基于三维五向编织复合材料细观结构模型,通过假设挤压固化后编织纱线和轴纱分别具有六边形和正方形横截面以及分析纱线之间的空间几何关系,建立了该类材料的有限元模型.并且,采用有限元方法计算得到了三维五向编织...
  • 建立了三激光切割机轴联动运动学模型,分析切割轨迹刀位点几何信息转换为机床个运动轴空间坐标的可选值。结合B和C旋转轴运动部件间的摩擦力、质量和转动惯量,建立相邻刀位点间的旋转轴旋转运动耗能模型。将...
  • 引言:     线性模型(linear modal)试图学得一个通过属性的...    如图1,在二维空间中有一些样本点,我们用一条直线对这些点进行拟合,该直线称为最佳拟合直线。线性回归就是根据训练集,寻找对训练样...

    引言

        线性模型(linear modal)试图学得一个通过属性的线性组合来进行预测的函数。本文介绍两种经典的线性模型,分别是回归任务中的线性回归(linear regression)与二分类任务中的逻辑回归(logistic regression)。
        如图1,在二维空间中有一些样本点,我们用一条直线对这些点进行拟合,该直线称为最佳拟合直线。线性回归就是根据训练集,寻找对训练样本的最佳拟合直线;逻辑回归则是利用“单位跳跃函数”将线性模型产生的预测值转换为0/1值,从而实现二分类任务。
    这里写图片描述

    图1

    一、数学预备知识

    1.方向导数

    如果函数f(x,y)f(x,y)在点P0(x0,y0)P_0(x_0,y_0)可微分,那么函数在该点沿任一方向ll的方向导数存在,且有fl(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ \left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=f_x(x_0,y_0)\cosα+f_y(x_0,y_0)\cosβ 其中cosα\cosαcosβ\cosβ是方向ll的方向余弦。
    (α为ll与x轴正向夹角,β为ll与y轴正向夹角。方向导数反映的是函数沿任一指定方向的变化率问题)

    例1
    求函数z=xe2yz=xe^{2y}在点P(1,0)P(1,0)处沿从点P(1,0)P(1,0)到点Q(2,1)Q(2,-1)的方向的方向导数
    解:
    这里方向ll即向量PQ=(1,1)\vec {PQ}=(1,-1)的方向,与ll同向的单位向量为el=(12,12)e_l=({1\over\sqrt{2}},-{1\over\sqrt{2}})
    因为函数可微分,且Zx(1,0)=e2y=1 Z_x(1,0)=e^{2y}=1 Zy(1,0)=2xe2y=2Z_y(1,0)=2xe^{2y}=2 故所求方向导数为Zl(1,0)=1×12+2×(12)=22 \left.\frac{∂Z}{∂l} \right| _{(1,0)}=1\times{1\over\sqrt{2}}+2\times(-{1\over\sqrt{2}})=-{\sqrt{2}\over2}

    2.梯度

    与方向导数有关联的一个概念是函数的梯度。在二元函数的情形,设函数f(x,y)f(x,y)在平面区域D内具有一阶连续偏导数,则对于每一点P0(x0,y0)DP_0(x_0,y_0)∈D,都可定出一个向量fx(x0,y0)i+fy(x0,y0)j f_x(x_0,y_0){\bf i}+f_y(x_0,y_0)\bf j 这向量称为函数f(x,y)f(x,y)在点P0(x0,y0)P_0(x_0,y_0)的梯度,记作grad f(x0,y0){\bf grad}\ f(x_0,y_0)f(x0,y0)∇f(x_0,y_0),即grad f(x0,y0)=f(x0,y0)=fx(x0,y0)i+fy(x0,y0)j {\bf grad}\ f(x_0,y_0)=∇f(x_0,y_0)=f_x(x_0,y_0){\bf i}+f_y(x_0,y_0)\bf j 其中=xi+yj∇={∂\over{∂x}}{\bf i}+{∂\over{∂y}}{\bf j}称为(二维的)向量微分算子或Nabla算子,f=fxi+fyj∇f={{∂f}\over{∂x}}{\bf i}+{{∂f}\over{∂y}}{\bf j}
    如果函数f(x,y)f(x,y)在点P0(x0,y0)P_0(x_0,y_0)可微分,el=(cosα,cosβ)e_l=(\cosα,\cosβ)是与方向ll同向的单位向量,则fl(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ=grad f(x0,y0)el=grad f(x0,y0)cosθ \left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=f_x(x_0,y_0)\cosα+f_y(x_0,y_0)\cosβ={\bf grad}\ f(x_0,y_0)\cdot e_l=|{\bf grad}\ f(x_0,y_0)|\cosθ 其中θ=<grad f(x0,y0),el>θ=<{\bf grad}\ f(x_0,y_0),e_l>
    这一关系式表明了函数在一点的梯度与函数在这点的方向导数间的关系。特别的:
    θ=0θ=0,即方向ele_l与梯度grad f(x0,y0){\bf grad}\ f(x_0,y_0)的方向相同时,函数f(x,y)f(x,y)增加最快。此时,函数在这个方向的方向导数达到最大值,这个最大值就是梯度grad f(x0,y0){\bf grad}\ f(x_0,y_0)的模,即fl(x0,y0)=grad f(x0,y0) \left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=|{\bf grad}\ f(x_0,y_0)| θ=πθ=π,即方向ele_l与梯度grad f(x0,y0){\bf grad}\ f(x_0,y_0)的方向相反时,函数f(x,y)(x,y)减少最快,函数在这个方向的方向导数达到最小值,即fl(x0,y0)=grad f(x0,y0) \left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=-|{\bf grad}\ f(x_0,y_0)| θ=π2θ={π\over 2},即方向ele_l与梯度grad f(x0,y0){\bf grad}\ f(x_0,y_0)的方向正交时,函数的变化率为零,即fl(x0,y0)=grad f(x0,y0)cosθ=0 \left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=|{\bf grad}\ f(x_0,y_0)|\cosθ=0 例2
    f(x,y)=12(x2+y2)f(x,y)={1\over 2}(x^2+y^2)P0(1,1)P_0(1,1),求
    f(x,y)f(x,y)P0P_0处增加最快的方向以及f(x,y)f(x,y)沿这个方向的方向导数;
    f(x,y)f(x,y)P0P_0处减少最快的方向以及f(x,y)f(x,y)沿这个方向的方向导数;
    f(x,y)f(x,y)P0P_0处的变化率为零的方向;
    解:
    f(x,y)f(x,y)P0P_0处沿f(1,1)∇f(1,1)的方向增加最快f(1,1)=(xi+yj)(1,1)=i+j ∇f(1,1)=(x{\bf i}+y{\bf j})|_{(1,1)}={\bf i}+{\bf j} 故所求方向可取为n=f(1,1)f(1,1)=12i+12j n={{∇f(1,1)}\over{|∇f(1,1)|}}={1\over{\sqrt 2}}{\bf i}+{1\over{\sqrt 2}}{\bf j} 方向导数为fn(1,1)=f(1,1)=2 \left.\frac{∂f}{∂n} \right| _{(1,1)}=|∇f(1,1)|=\sqrt 2 f(x,y)f(x,y)P0P_0处沿f(1,1)-∇f(1,1)的方向减少最快,这个方向可取为n1=n=12i12j n_1=-n=-{1\over{\sqrt 2}}{\bf i}-{1\over{\sqrt 2}}{\bf j} 方向导数为fn1(1,1)=f(1,1)=2 \left.\frac{∂f}{∂n_1} \right| _{(1,1)}=-|∇f(1,1)|=-\sqrt 2 f(x,y)f(x,y)P0P_0处沿垂直于f(1,1)∇f(1,1)的方向变化率为零,这个方向是n2=12i+12j n_2=-{1\over{\sqrt 2}}{\bf i}+{1\over{\sqrt 2}}{\bf j} n3=12i12j n_3={1\over{\sqrt 2}}{\bf i}-{1\over{\sqrt 2}}{\bf j}

    3.带佩亚诺余项的泰勒公式

    f(x)f(x)x=ax=ann阶微商,即f(n)(a)f^{(n)}(a)存在,则当xax\rightarrow a时有f(x)=f(a)+f(a)(xa)+f(a)2!(xa)2++f(n)(a)n!(xa)n+o((xa)n) f(x)=f(a)+f'(a)(x-a)+{{f''(a)}\over{2!}}(x-a)^2+\cdots+{{f^{(n)}(a)}\over{n!}}(x-a)^n+\rm o((x-a)^n) 其中多项式f(a)+f(a)(xa)++f(n)(a)n!(xa)n f(a)+f'(a)(x-a)+\cdots+{{f^{(n)}(a)}\over{n!}}(x-a)^n 称为f(x)f(x)aa点的nn阶泰勒多项式。

    4.二元函数的泰勒公式

    f(x,y)f(x,y)P0(x0,y0)P_0(x_0,y_0)的某领域O(P0)\rm O(P_0)内有直到n+1n+1阶连续偏导数,则对O(P0)\rm O(P_0)内任一点(x0+Δx,y0+Δy)(x_0+Δx ,y_0+Δy),存在θ(0,1)θ∈(0,1),使得f(x0+Δx,y0+Δy)=k=0n1k!(xΔx+yΔy)kf(x0,y0)+Rn f(x_0+Δx ,y_0+Δy)=\sum_{k=0}^n{1\over{k!}}\left(\frac{∂}{∂x}Δx+\frac{∂}{∂y}Δy\right)^kf(x_0,y_0)+R_n 其中Rn=1(n+1)!(xΔx+yΔy)n+1f(x0+θΔx,y0+θΔy) R_n={1\over{(n+1)!}}\left(\frac{∂}{∂x}Δx+\frac{∂}{∂y}Δy\right)^{n+1}f(x_0+θΔx ,y_0+θΔy) n=1n=1,忽略余项RnR_n,即得函数的一阶泰勒展开式f(x0+Δx,y0+Δy)f(x0,y0)+fx(x0,y0)Δx+fy(x0,y0)Δy f(x_0+Δx ,y_0+Δy)≈f(x_0,y_0)+{f'}_x(x_0,y_0)Δx+{f'}_y(x_0,y_0)Δy 利用泰勒公式,可以用nn阶多项式逼近函数f(x,y)f(x,y)nn越大则误差越小,近似程度越好。



    二、线性回归

    1.最小二乘法

        给定训练集D={(x1,y1),(x2,y2),,(xN,yN)}D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},其中xi=(xi(1),xi(2),,xi(n))Tx_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^Txi(j)x_i^{(j)}是第ii个实例的第jj个特征。线性回归试图学得f(xi)=wTxi+b使f(xi)yi f(x_i)=w^Tx_i+b,使得f(x_i)≈y_i 其中w=(w1,w2,...,wn)Tw=(w_1,w_2,...,w_n)^T
        如何确定wwbb呢?一个常用的方法是极小化其平方损失函数,即使均方误差最小化,得(w,b)=argmin(w,b)i=1N(f(xi)yi)2=argmin(w,b)i=1N(yiwTxib)2 (w^*,b^*)=arg\min_{(w,b)}\sum_{i=1}^N(f(x_i)-y_i)^2=arg\min_{(w,b)}\sum_{i=1}^N(y_i-w^Tx_i-b)^2     基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。均方误差有非常好的几何意义,它对应了欧几里得距离,在线性回归中,最小二乘法就是试图找到一条直线,使得所有样本到直线上的欧几里得距离之和最小。

    2.求解w和b

        为了讨论方便,我们把wwbb吸收入向量形式w^=(wT;b)T\hat w=(w^T;b)^T。把训练集DD表示为一个N×(n+1)N\times (n+1)大小的矩阵XX,其中每行对应于一个实例xix_i,该行前nn个元素对应于xix_inn个属性,最后一个元素恒置为1。即
    矩阵
    再把类别也写成向量形式y=(y1,y2,,yN)Ty=(y_1,y_2,\cdots,y_N)^T,则有w^=argminw^(yXw^)T(yXw^) {\hat w}^*=arg\min_{\hat w}(y-X\hat w)^T(y-X\hat w) E=(yXw^)T(yXw^)E=(y-X\hat w)^T(y-X\hat w),对w^\hat w求导得到Ew^=2XT(Xw^y) E_{\hat w}=2X^T(X{\hat w}-y) 令上式为零可求得w^\hat w的最优解。当XTXX^TX为满秩矩阵时,可解得w^=(XTX)1XTy                 (1) \hat w=(X^TX)^{-1}X^Ty\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1) 从而求解出wwbb,得到线性回归模型:y=wTx+b y=w^Tx+b

    3.岭回归(ridge regression)

        然而,现实任务中XTXX^TX往往不是满秩矩阵,无法计算(XTX)1(X^TX)^{-1}。为了解决这个问题,统计学家引入岭回归。简单说来,岭回归就是在矩阵XTXX^TX上加入一个λIλI,使得能对XTX+λIX^TX+λI求逆。其中IIN×NN\times N的单位矩阵。则w^=(XTX+λI)1XTy \hat w=(X^TX+λI)^{-1}X^Ty     这里通过引入λλ来限制所有ww之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减(shrinkage)。可以通过交叉验证法,选取不同的λλ进行测试,最终得到一个使预测误差最小化的λ。

    4.代码实现(python)

    以下代码来自Peter Harrington《Machine Learing in Action》。
    代码如下(保存为regression.py):

    # -- coding: utf-8 --
    from numpy import *
    
    def loadDataSet(fileName):
        dataMat = []; labelMat = []
        fr = open(fileName)
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataMat.append([float(lineArr[0]), 1.0]) # dataMat为吸收后的X,即将特征值最后一个元素恒置为1
            labelMat.append(float(lineArr[1]))       # labelMat为对应的标记类别
        return dataMat,labelMat
    
    def standRegres(xArr,yArr):
        # xArr为特征值,yArr为对应的标记类别,该函数用于计算w和b
        xMat = mat(xArr); yMat = mat(yArr).T
        xTx = xMat.T*xMat               # 计算xTx
        if linalg.det(xTx) == 0.0:
            print "This matrix is singular, cannot do inverse"
            return
        ws = xTx.I * (xMat.T*yMat)      # 若xTx不为零,则根据式(1)计算w^
        return ws
    

    数据集格式如下(保存为ex0.txt):

    0.067732	3.176513
    0.427810	3.816464
    0.995731	4.550095
    0.738336	4.256571
    0.981083	4.560815
    0.526171	3.929515
    

    运行命令如下:
    线性回归代码
    最后求出的wswsw^\hat w



    三、逻辑回归

    逻辑回归是一种分类模型,本文主要介绍二分类的逻辑回归。

    1.Sigmoid函数

        给定训练集D={(x1,y1),(x2,y2),,(xN,yN)}D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},其中xi=(xi(1),xi(2),,xi(n))Tx_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^Txi(j)x_i^{(j)}是第ii个实例的第jj个特征,yi0,1y_i∈{0,1}为实例的类别。若用线性回归模型y=wTx+by=w^Tx+b对该训练集进行分类,分类图形如图2线A(此处设xi=(xi(1))Tx_i=(x_i^{(1)})^T)所示:
    这里写图片描述

    图2

        从上图看出,线性回归模型产生的预测值z=wTx+bz=w^Tx+b是实值,于是,我们需要将实值zz转换为0/1值,这里我们引入Sigmoid函数,其数学形式是g(z)=11+ez g(z)={1\over{1+e^{-z}}}     图3给出了Sigmoid函数的坐标图。当zz为0时,Sigmoid函数值为0.5,随着zz的增大,对应的Sigmoid值将逼近于1;而随着zz的减少,Sigmoid值将逼近于0。
    Sigmoid函数

    图3

    我们将z=wTx+b代入Sigmoid函数,从而将z值转化为一个接近0或1的数,得到
    y=11+e(wTx+b)y={1\over{1+e^{-(w^Tx+b)}}}

    2.模型

        逻辑回归模型所做的假设是,将(1)中yy视为类后验估计P(Y=1x)P(Y=1|x),得到P(Y=1x)=11+e(wTx+b)=ewTx+b1+ewTx+b P(Y=1|x)={1\over{1+e^{-(w^Tx+b)}}}={e^{w^Tx+b}\over{1+e^{w^Tx+b}}}     通过P(Y=0x)=1P(Y=1x)P(Y=0|x)=1-P(Y=1|x)求得P(Y=0x)=11+ewTx+b P(Y=0|x)={1\over{1+e^{w^Tx+b}}}     对于给定的实例xx,可以求得P(Y=1x)P(Y=1|x)P(Y=0x)P(Y=0|x),比较两个条件概率值的大小,将实例xx分到概率大的那一类,若概率值相等则可任意判别。

    3.损失函数

        这里使用对数损失函数L(Y,P(YX))=logP(YX)L(Y,P(Y|X)) = -log P(Y|X)P(YX)P(Y|X)的取值范围为[0,1],P(YX)P(Y|X)的值越接近1,则损失函数值越小。
        为了讨论方便,我们把w和b吸收入向量形式w^=(wT;b)T\hat w=(w^T;b)^T,令xi=(xi(1),xi(2),,xi(n),1)Tx_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)},1)^T,则wTx+bw^Tx+b可简写为w^x\hat wx。设P(Y=1x)=π(x)P(Y=1|x)=π(x)P(Y=0x)=1π(x)P(Y=0|x)=1-π(x),则最终逻辑回归模型的损失函数为L(w^)=i=1N[yilogπ(xi)(1yi)log(1π(xi))] L(\hat w)=\sum_{i=1}^N[−y_i\logπ(x_i) −(1−y_i)\log(1−π(x_i))] =i=1N[yilogπ(xi)yilog(1π(xi))+log(1π(xi))]                    (2)=-\sum_{i=1}^N[y_i\logπ(x_i)−y_i\log(1−π(x_i))+\log(1−π(x_i))] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2) =i=1N[yilogπ(xi)1π(xi)+log(1π(xi))]=i=1N[yi(w^Txi)log(1+ew^Txi)]=-\sum_{i=1}^N\left[y_i\log{π(x_i)\over{1-π(x_i)}}+\log(1−π(x_i))\right] =-\sum_{i=1}^N\left[y_i({\hat w}^Tx_i)-log(1+e^{{\hat w}^Tx_i})\right]     对损失函数L(w^)L(\hat w)求极小值,从而可得w^\hat w
        最后求得的直线应该如图2线B,分类为0的样本点使得z<0,此时P(Y=1x)<P(Y=0x)P(Y=1|x)<P(Y=0|x);分类为1的样本点使得z>0,此时P(Y=1x)>P(Y=0x)P(Y=1|x)> P(Y=0|x)

    4.梯度下降法

        假设f(xf(x)是RnR_n上具有一阶连续偏导数的函数,要求解的无约束优化问题是minxRn  f(x) \min_{x∈R_n}\ \ f(x) xx^*表示目标函数f(x)f(x)的极小点。
        梯度下降算法是一种迭代算法,选取适当的初值x(0)x^{(0)},不断迭代,更新xx的值,进行目标函数的极小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新xx的值,从而达到减少函数值的目的。
        由于f(x)f(x)具有一阶连续偏导数,若第kk次迭代值为x(k)x^{(k)},则可将f(x)f(x)x(k)x^{(k)}附近进行一阶泰勒展开:f(x)=f(x(k))+gkT(xx(k)) f(x)=f(x^{(k)})+{g_k}^T(x-x^{(k)}) 这里,gk=g(x(k))=f(x(k))g_k=g(x^{(k)})= ∇f(x^{(k)})f(x)f(x)x(k)x^{(k)}的梯度。
        求出第k+1次迭代值x(k+1):x(k+1)=x(k)+λkpk x^{(k+1)}=x^{(k)}+λ_kp_k 其中,pkp_k是搜索方向,取负梯度方向pk=f(x(k))p_k=-∇f(x^{(k)})λkλ_k是步长,由一维搜索确定,即λkλ_k使得f(x(k)+λkpk)=minλ0 f(x(k)+λpk) f(x^{(k)}+λ_kp_k)=\min_{λ≥0}\ f(x^{(k)}+λp_k) 算法1(梯度下降法)
    输入:目标函数f(x)f(x),梯度函数g(x)=f(x)g(x)= ∇f(x),计算精度εε
    输出:f(x)f(x)的极小点xx^*
    ①取初始值x(0)Rnx^{(0)}∈R^n,置k=0k=0
    ②计算f(x(k))f(x^{(k)})
    ③计算梯度gk=g(x(k))g_k=g(x^{(k)}),当gk<ε||g_k||<ε,停止迭代,令x=x(k)x^*=x^{(k)};否则,令pk=f(x(k))p_k=-∇f(x^{(k)}),求λkλk,使f(x(k)+λkpk)=minλ0 f(x(k)+λpk) f(x^{(k)}+λ_kp_k)=\min_{λ≥0}\ f(x^{(k)}+λp_k) ④置x(k+1)=x(k)+λkpkx^{(k+1)}=x^{(k)}+λ_kp_k,计算f(x(k+1))f(x^{(k+1)}),当f(x(k+1))f(x(k))<ε||f(x(k+1))-f(x(k))||<εx(k+1)x(k)<ε||x(k+1)-x(k)||<ε时,停止迭代,令x=x(k+1)x^*=x^{(k+1)}
    ⑤否则,置k=k+1k=k+1,转③

    5.代码实现(python)

    以下代码来自Peter Harrington《Machine Learing in Action》。
        我们需要求式(2)中L(w^)L(\hat w)的最小值。若令f(w^)=L(w^)f(\hat w)=-L(\hat w),则问题可转换为求f(w^)f(\hat w)的最大值:f(w^)=i=1N[yi(w^Txi)log(1+ew^Txi)] f(\hat w)=\sum_{i=1}^N\left[y_i({\hat w}^Tx_i)-log(1+e^{{\hat w}^Tx_i})\right]     为了求上式的最大值,我们使用梯度上升算法。算法1(梯度下降法)中,由于与梯度相反方向下降最快,所以pk=f(x(k))p_k=-∇f(x(k));而在本例的梯度上升算法,令pk=f(x(k))p_k=∇f(x(k)),即梯度方向上升最快。先求f(w^)∇f(\hat w)f(w^)=i=1N[yixi11+ew^Txixi]=i=1Nxi[yi11+ew^Txi]          (3) ∇f(\hat w)=\sum_{i=1}^N\left[y_ix_i-{1\over{1+e^{-{\hat w}^Tx_i}}}x_i\right]=\sum_{i=1}^Nx_i\left[y_i-{1\over{1+e^{-{\hat w}^Tx_i}}}\right]\ \ \ \ \ \ \ \ \ \ (3)     在本代码中,预先设置好步长λλ的值和迭代次数,则w=λ+f(w^)w^*=λ+∇f(\hat w),在循环迭代完成后输出训练好的回归系数。
    代码如下(保存为logRegres.py):

    # -- coding: utf-8 --
    from numpy import *
    
    def loadDataSet():
        dataMat = []; labelMat = []
        fr = open('testSet.txt')
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataMat.append([float(lineArr[0]), float(lineArr[1]), 1.0]) # dataMat为吸收后的X,即将特征值最后一个元素恒置为1
            labelMat.append(int(lineArr[2])) # labelMat为对应的标记类别
        return dataMat,labelMat
    
    def sigmoid(inX):
        return 1.0/(1+exp(-inX))
    
    def gradAscent(dataMatIn, classLabels):
        dataMatrix = mat(dataMatIn)
        labelMat = mat(classLabels).transpose()
        m,n = shape(dataMatrix)
        alpha = 0.001          # 步长
        maxCycles = 500        # 迭代次数
        weights = ones((n,1))  # 将w的各个元素和b初始化为1
        for k in range(maxCycles):
            h = sigmoid(dataMatrix*weights)
            error = (labelMat - h)
            # 根据式(3)可知dataMatrix.transpose()* error为梯度,则可得(新的weights)=(旧的weights)+步长*梯度
            weights = weights + alpha * dataMatrix.transpose()* error
        return weights
    

    数据集如下(保存为testSet.txt):

    -1.395634	4.662541	1
    -1.322371	7.152853	0
    0.423363	11.054677	0
    0.406704	7.067335	1
    0.667394	12.741452	0
    -2.460150	6.866805	1
    

    这里写图片描述
    调用gradAscent函数求得的值即为w^\hat w









    以上全部内容参考书籍如下:
    李航《统计学习方法》
    周志华《机器学习》
    Peter Harrington《Machine Learing in Action》
    《高等数学第六版下册 同济大学》
    《数学分析简明教程 第二版上册》

    展开全文
  • meshgrid指令生成网格点 观察meshgrid指令的效果 程序 x=... plot(X,Y'+) 观察结果 三维曲面图绘图指令 mesh(X,Y,z) 在三维空间中绘出由(X,Y,z)表示的曲面 meshz(X,Y,z) 除了具有mesh的功能外还画出上下高度线 meshc
  • 词嵌入 one-hot 向量将每个单词表示为完全独立的个体,不同词向量都是正交的,因此单词间的相似度无法体现。 换用特征化表示方法能够解决...在通过复杂而非线性的方法映射到二维空间后,每个词会根据语义和相关程...
  • VTK实现三地质建模

    2021-05-25 20:05:03
    目前,地质体三数据模型总体上可分为线模型 、 表面模型 、 实体模型 、 面向对象的三数据模型及混合数据模型五大类型 。 线模型的优点是集合关系明确,缺点是对于实体间关系表达及实现交 、并等叠加操作较困难 。...
  • 游戏DirectX笔记

    2020-10-27 13:47:48
    绪论第一章:面向对象的游戏编程原理第二章:Windows编程基础第三章:DirectX简介第四章:基本空间变换第章:基于顶点缓存的图形绘制第六章:融合技术第七章:光照与材质第八章:动画网格模型与三网格模型总结 ...
  • 国内外主流的三GIS软件

    热门讨论 2011-03-14 13:38:59
     介绍:EV-Globe具有大范围的、海量的、多源的数据一体化管理和快速三维实时漫游功能,支持三维空间查询、分析和运算,可与常规GIS软件集成,可方便快速构建三维空间信息服务系统,亦可快速在二维GIS系统完成向三维...
  • 标准模型粒子的质谱在六维翘曲空间中的轨距-希格斯统一中得以再现,而没有引入外来的费米子。 轻中微子质量由量表-希格斯跷跷板机制解释。 我们评估了四维希格斯玻色子的有效... 第五维的Kaluza-Klein质量标度近似为。
  • 重建全流程,倾斜摄影测量

    热门讨论 2014-10-25 01:02:11
    步结合相机参数对格网进行纹理映射,重建出实景真三维模型; 第六步三数据瓦片化(大场景显示需要,该数据较小未切片)。 这是本人一个简单实验结果,但是已经涵盖了基于图像的三重建领域大部分内容,大场景...
  • 内容涵盖了OpenGL程序框架、OpenGL几何模型、坐标变换、纹理映射、材质、计算机动画技术、双目立体真三、OpenGL扩展应用、OpenGL图像处理、三图形学基础、摄像漫游、构造天空和地形、模型载入、高级纹理映射、...
  • 我们分析了扭曲的五维空间中电弱对称破裂的模型,其中散装了规范玻色子和费米子。 希格斯玻色子由量规场的第五部分标识。 我们使用顶夸克多重峰和另一个费米子多重峰之间的竞争来动态生成希格斯势,从而创建一个以小...
  • ​ 在不同的假设空间下,依据各自的准则选择出最优模型后(学习),往往需要对这些模型进行评估。一般而言,把训练数据划分为训练集-验证集-测试集。 训练集:用来训练不同模型,获得模型及其训练误差; 验证集:...
  • 网络的迅速发展以及与社会现实空间的深入融合,网络空间的概念得到不断拓展,网络空间对国家主权、安全、发展利益带来新挑战,提出新要求,产生深远影响。...构建了一个五维网络空间安全安全保障体系模型
  • 线性模型回顾 SVM处理非线性 通过限制条件和最小化,我们能够使ξ既不会很大,也不会很小(因为当ξ很大时,限制条件1恒成立) ...最终,我们要在这个五维平面中,找到w(也是五维的)和b,使得计算机能够分开c1和c2.
  • 1、无限容量的个人网盘空间; 2、项目组随意创建,同样没上限╮(╯▽╰)╭任性~; 3、类似QQ一样的基础聊天通讯功能(位号等你来申请<( ̄▽ ̄)> 哇哈哈…); 4、组内提供傻瓜式操控体验如PS级的专业标注工具,...
  • 具体来说,我们对非最小标准模型扩展的CPT奇数扇区的第5术语感兴趣。 通过对算子k ^ AF的特定选择,我们获得了Carroll-Field-Jackiw(CFJ)项的高阶导数形式,即12εκλμνAλDκ□Fμν,并带有违反洛伦兹的...
  • 我们将中性手性超场的对偶变换规则应用于脑的N =(4,4)线性线性sigma模型。 我们还研究了A1型ALE空间在N =(4,4)规范线性sigma模型中带电手性超场的对偶变换规则。 在这两种情况下,我们都获得了超场形式主义中...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 283
精华内容 113
关键字:

五维空间模型