精华内容
下载资源
问答
  • 2019-01-30 15:16:37

    在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型。最终的目标是希望我们的模型在测试集上有最好的表现。

    但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试。此时,我们就需要对数据集D进行划分。

    对于数据集D的划分,我们尽量需要满足三个要求:

    1. 训练集样本量充足
    2. 训练模型时的计算量可以忍受
    3. 不同的划分方式会得出不同的训练集和测试集,从而得出不同的结果,我们需要消除这种影响

    我们将分别介绍留出法、交叉验证法,以及各自的python实现。自助法(bootstrapping)将在下篇中加以介绍。

    1.留出法

    留出法是最常用最直接最简单的方法,它直接将数据集D拆分成两个互斥的集合,其中一个作为训练集R,另一个作为测试集T。 即 D = S ∪ T , S ∩ T = ∅ D = S∪T,S∩T = \varnothing D=STST=

    在使用留出法时,需要注意:

    1. 要有足够的样本量,以保证训练模型的效果
    2. 在划分时注意保证数据分布的一致性(如:500个样本中正例和反例的比为2:3,则在训练集和测试集中正例和反例的比也要求为2:3),只需要采用随机分层抽样即可
    3. 为了减弱随机划分的影响,重复划分训练集和测试集,对得到的多次结果取平均作为最后的结果
    4. 一般训练集和测试集的比例在8:2或者7:3

    当然留出法的缺点也非常明显,即它会损失一定的样本信息;同时需要大样本

    python实现留出法,只需要使用sklearn包就可以

    from sklearn.model_selection import train_test_split
    #使用train_test_split划分训练集和测试集
    train_X , test_X, train_Y ,test_Y = train_test_split(
            X, Y, test_size=0.2,random_state=0)
    ''' 
    X为原始数据的自变量,Y为原始数据因变量;
    train_X,test_X是将X按照8:2划分所得;
    train_Y,test_Y是将X按照8:2划分所得;
    test_size是划分比例;
    random_state设置是否使用随机数
    '''
    

    2.交叉验证法

    交叉验证法(cross validation)可以很好地解决留出法的问题,它对数据量的要求不高,并且样本信息损失不多

    交叉验证法先将数据集D划分为k个大小相似的互斥子集,即 D = D 1 ∪ D 2 ∪ . . . ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D = D_1 \cup D_2 \cup ...\cup D_k, D_i \cap D_j = \varnothing(i \neq j) D=D1D2...Dk,DiDj=(i̸=j)

    为了保证数据分布的一致性,从D中随机分层抽样即可。

    之后,每次都用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样我们就可以获得k组训练/测试集,从而进行k次训练和测试,最终返回这k组测试的均值。

    具体说来,我们以k=10为例:
    第一次我们选取第10份数据为测试集,前9份为训练集;
    第二次我们选取第9份数据为测试集,第1-8和10为训练集;

    第十次我们选取第1份数据为测试集,第2-9为训练集;
    由此,我们共获得10组训练集和测试集,进行10次训练和测试,最终返回10次测试结果的均值。

    显然,交叉验证法结果的稳定性和保真性很大程度取决于k的选择,为了强调这一点,交叉验证法也称作“k折交叉验证法”,k最常取的是10,也有取5或者20的。
    5折交叉验证法
    同时,我们也需要避免由于数据划分的随机性造成的误差,我们可以重复进行p次实验。
    p次k折交叉验证法,相当于做了pk次留出法(比例为k-1:1)

    python实现交叉验证法,只需要使用sklearn包就可以。注意,函数返回的是样本序号。

    import pandas as pd
    from sklearn.model_selection import KFold
    
    data = pd.read_excel('') #导入数据
    kf = KFold(n_splits = 4,shuffle = False,random_state = None) 
    '''n_splits表示将数据分成几份;shuffle和random_state表示是否随机生成。
    如果shuffle = False,random_state = None,重复运行将产生同样的结果;
    如果shuffle = True,random_state = None,重复运行将产生不同的结果;
    如果shuffle = True,random_state = (一个数值),重复运行将产生相同的结果;
    '''
    for train, test in kf.split(data):
        print("%s %s" % (train, test))
     '''
     结果
    [ 5  6  7  8  9 10 11 12 13 14 15 16 17 18] [0 1 2 3 4]
    [ 0  1  2  3  4 10 11 12 13 14 15 16 17 18] [5 6 7 8 9]
    [ 0  1  2  3  4  5  6  7  8  9 15 16 17 18] [10 11 12 13 14]
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14] [15 16 17 18]
    '''
    

    如果想对数据集重复几次使用交叉验证法划分的话,使用RepeatedKFold函数即可,其中多了一个参数n_repeats


    与留出法相比,交叉验证法的数据损失较小,更加适合于小样本,但是其计算复杂度变高,存储空间变大。极端的说来,如果将数据集D(m个样本)分成m份,每次都取m-1个样本为训练集,余下的那一个为测试集。共进行m次训练和测试。这种方法被叫做留一法。

    留一法的优点显而易见,其数据损失只有一个样本,并且不会受到样本随即划分的影响。但是,其计算复杂度过高,空间存储占用过大。

    python实现交叉验证法,只需要使用sklearn包就可以

    from sklearn.model_selection import LeaveOneOut
    
    X = [1, 2, 3, 4]
    loo = LeaveOneOut()
    for train, test in loo.split(data):
        print("%s %s" % (train, test))
    '''结果
    [1 2 3] [0]
    [0 2 3] [1]
    [0 1 3] [2]
    [0 1 2] [3]
    '''

    综上所述:
    当我们数据量足够时,选择留出法简单省时,在牺牲很小的准确度的情况下,换取计算的简便;
    当我们的数据量较小时,我们应该选择交叉验证法,因为此时划分样本集将会使训练数据过少;
    当我们的数据量特别少的时候,我们可以考虑留一法。

    更多相关内容
  • 该代码包括遗传算法 (GA) 的主要功能:精英主义、锦标赛选择、交叉两点和启发式)和变异。 有一些使用 GA 的 benchmank 测试函数。 * 它是在遗传工具箱的帮助下开发的。
  • 简单易懂的10折交叉法

    千次阅读 2019-04-04 21:33:17
    10折交叉验证 我们构建一个分类器,输入为运动员的身高、体重,输出为其从事的体育项目-体操、田径或篮球。 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: 1. 该分类器的精确率怎么样? 2. 该分类器...
    10折交叉验证
    
    我们构建一个分类器,输入为运动员的身高、体重,输出为其从事的体育项目-体操、田径或篮球。
    一旦构建了分类器,我们就可能有兴趣回答类似下述的问题:
    1. 该分类器的精确率怎么样?
    2. 该分类器到底有多好?
    3. 和其他分类器相比较,该分类器表现如何?
    我们把每个数据集分成两个子集
        - 一个用于构建分类器,该数据集称为训练集(training set)
        - 另一个数据集用于评估分类器,该数据集称为测试集(test set)
        训练集和测试集是数据挖掘中的常用术语。
    
    下面以近邻算法为例来解释为什么不能使用训练数据来测试。如果上述例子中的篮球运动员Marissa Coleman在训练数据中存在,那么身高6英尺1英寸体重160磅的她就会与自己最近。因此,如果对近邻算法进行评估时,若测试集是训练数据的子集,那么精确率总是接近于100%。更一般地,在评估任意数据挖掘算法时,如果测试集是训练数据的子集,那么结果就会十分乐观并且过度乐观。因此,这种做法看起来并不好。
    
    那么我们将数据集分成两部分。较大的那部分用于训练,较小的那部分用于评估。事实表明这种做法也存在问题。在进行数据划分时可能会极端不走运。例如,所有测试集中的篮球运动员都比较矮(像Debbie Black的身高只有5英尺3英寸,体重只有124磅),他们会被分成马拉松运动员。而测试集中所有的田径运动员就像Tatyana Petrova(俄罗斯马拉松运动员,身高5英尺3英寸,体重108磅)一样较矮、体重较轻,可能会被分成体操运动员。如果测试集像上面一样,分类器的精确率会很差。另一方面,有时候测试集的选择又会十分幸运。测试集中的每个人都有所从事项目的标准身高和体重,此时分类器精确率接近100%。两种情况下,精确率都依赖于单个的测试集,并且该测试集可能并不能反映分类器应用于新数据的真实精确率。
    
    上述问题的一种解决方法是重复多次上述过程并对结果求平均。例如,我们可以将数据分成两半:Part 1和Part 2。

     

    我们可以使用Part 1的数据来训练分类器,而利用Part 2的数据对分类器进行测试。然后,我们重复上述过程,这次用Part 2训练而用Part 1测试。最后我们将两次的结果进行平均。但是,这种方法的问题在于我们每次只使用了一半数据进行训练。然而,我们可以通过增加划分的份数来解决这个问题。例如,我们可以将数据划分成3部分,每次利用2/3的数据训练而在其余1/3的数据上进行测试。因此,整个过程看起来如下:

    第一次迭代 使用Part 1和Part 2训练,使用Part 3测试

    第二次迭代 使用Part 1和Part 3训练,使用Part 2测试

    第三次迭代 使用Part 2和Part 3训练,使用Part 1测试

    对上述结果求平均。

    在数据挖掘中,最常用的划分数目是10,这种方法称为……

    10折交叉验证(10-fold Cross Validation)

    使用这种方法,我们将数据集随机分成10份,使用其中9份进行训练而将另外1份用作测试。该过程可以重复10次,每次使用的测试数据不同。

    10折交叉验证的例子

    第1步,将数据等分到10个桶中。

    我们会将50名篮球运动员和50名非篮球运动员分到每个桶中。每个桶当中放入了100人的信息。

    第2步,下列步骤重复10次。

    (1)每一次迭代中留存其中一个桶。第一次迭代中留存桶1,第二次留存桶2,其余依此类推。

    (2)用其他9个桶的信息训练分类器(第一次迭代中利用从桶2到桶10的信息训练分类器)。

    (3)利用留存的数据来测试分类器并保存测试结果。在上例中,这些结果可能如下:

    35个篮球运动员被正确分类;

    29个非篮球运动员被正确分类。

    第3步,对上述结果汇总。

    通常情况下我们会将结果放到与下表类似的表格中:

    在所有500名篮球运动员中,有372人被正确分类。可能需要做的一件事是将右下角的数字也加上去,也就是说1000人当中有652(372+280)人被正确分类。因此得到的精确率为65.2%。与2折或3折交叉验证相比,基于10折交叉验证得到的结果可能更接近于分类器的真实性能。之所以这样,是因为每次采用90%而不是2折交叉验证中仅仅50%的数据来训练分类器。

     

    有个问题
    如果10折交叉验证之所以好只是因为采用了90%数据的话
    那么为什么不用n折交叉验证?(n是数据集中样本的数目)
    
    例如,如果数据集中包含1000个样本,我们可以在999个样本上训练分类器
    然后在另外一个样本上测试分类器,这个过程可以重复1000次
    利用这种最大可能的交叉验证次数,可能会得到更精确的分类器

     

    1|0留一法(Leave-One-Out)

     

    在机器学习领域,n折交叉验证(n是数据集中样本的数目)被称为留一法。我们已经提到,留一法的一个优点是每次迭代中都使用了最大可能数目的样本来训练。另一个优点是该方法具有确定性。
    
    确定性的含义
    
    假设Lucy集中花费了80个小时来编写一个新分类器的代码。现在是周五,她已经筋疲力尽,于是她请她的两个同事(Emily和Li)在周末对分类器进行评估。她将分类器和相同的数据集交给每个人,请她们做10折交叉验证。周一,她问两人的结果……
    
    嗯,她们得到了不同的结果。她们俩可能是谁犯错了吗?未必如此。在10折交叉验证中,我们随机将数据分到桶中。由于随机因素的存在,有可能Emily和Li的数据划分结果并不完全一致。实际上,她们划分一致的可能性微乎其微。因此,她们在训练分类器时,所用的训练数据并不一致,而在测试时所用的数据也不完全一致。因此,她们得到不同的结果是很符合逻辑的。该结果与是否由两个不同的人进行评估毫无关系。即使Lucy自己进行两次10折交叉验证,她得到的结果也会有些不同。之所以不同的原因在于将数据划分到桶这个过程具有随机性。由于10折交叉验证不能保证每次得到相同的结果,因此它是一种非确定性的方法。与此相反,留一法是确定性的。每次应用留一法到同一分类器及同一数据上,得到的结果都一样。这是件好事!

    1|1留一法的缺点

     

     留一法的主要不足在于计算的开销很大。
    考虑一个包含1000个实例的中等规模的数据集,需要一分钟来训练分类器。
    对于10折交叉验证来说,我们将花费10分钟用于训练。而对于留一法来说,训练时间需要16个小时。
    如果数据集包含百万样本,那么花费在训练上的总时间将接近两年。我的天哪!
    留一法的另一个缺点与分层采样(stratification)有关。

    2|0分层采样(Stratification)

     

    回到上一章的例子,即构建分类器来确定女运动员所从事的体育项目(篮球、体操或田径)。
    当训练分类器时,我们希望训练数据能够具有代表性,并且包含所有3类的数据。
    假设采用完全随机的方式将数据分配到训练集,则有可能训练集中不包含任何篮球运动员。
    正因为如此,最终的分类器对篮球运动员分类时效果不佳。
    或者,考虑构建一个100个运动员的数据集。
    首先我们去WNBA的网站获得33个女子篮球运动员的信息,然后去维基百科网站获得33名参加2012年奥运会的女子体操运动员的信息,最后我们再次去维基百科网站获得34名参加奥运会田径项目的女运动员的信息。
    因此,最终我们的数据如下所示:

    下面开始做10折交叉验证。我们从上表的第一行开始,每10个人放入一个桶。
    于是,第一个桶和第二个桶只有篮球运动员。第三个桶既有篮球运动员也有体操运动员。第四、第五个桶只包含体操运动员,其余桶的情况可以依此类推。
    任何一个桶都不能代表整个数据集,你认为上述划分会导致有偏差的结果,这种想法是对的。
    我们期望的方法是将实例按照其在整个数据集的相同比例分到各个桶中,即桶中的类别比例(篮球运动员、体操运动员、马拉松运动员)和整个数据集中的类别比例是一样的。
    由于整个数据集的1/3是篮球运动员,因此每个桶中应该包含1/3的篮球运动员。同样,该桶中也应包含1/3的体操运动员和1/3的马拉松运动员。
    上述做法称为分层采样,是一种好的方法。
    留一法评估的问题在于测试集中只有一个样本,因此它肯定不是分层采样的结果。
    总而言之,留一法可能适用于非常小的数据集,到目前为止10折交叉测试是最流行的选择。
    
    
    

     

    __EOF__

    作  者:Conan
    出  处:https://www.cnblogs.com/BlameKidd/p/9735102.html
    关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
    版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

    标签: 小知识点总结

    好文要顶 关注我 收藏该文  

     

    Conan_1996
    关注 - 64
    粉丝 - 91

    +加关注

    0

    0

    请先登录

    « 上一篇:Frobenius norm(Frobenius 范数)
    » 下一篇:百度网盘满速下载器:pandownload

    posted @ 2018-10-01 17:31 Conan_1996 阅读(2658) 评论(0) 编辑 收藏

    刷新评论刷新页面返回顶部

    注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。

     

    10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    Copyright ©2019 Conan_1996 

    【事实并非理所当然❤️世界总是欲盖弥彰】

    【❤️ 认清了生活的真相后还依然热爱它 ❤️】

    This blog has running : 290 d 13 h 32 m 57 sღゝ◡╹)ノ♡

    - Theme Authors:菜花君° -

    展开全文
  • 一、基础知识 1、方向向量(direction vector)是一个数学概念,空间直线的方向... 向量 平面α的向量。 3、直线表示方式:Ax+By+Cz+d=0 二、已知三点坐标怎样求向量  已知A(x1,y1,z1),B(x2,y2,z2),C(x3,...

    一、基础知识

    1、方向向量(direction vector)是一个数学概念,空间直线的方向用一个与该直线平行的非零向量来表示,该向量称为这条直线的一个方向向量。

    2、直线l⊥α,取直线l的方向向量a,则向量a叫做

    法向量 法向量

    平面α的法向量。

    3、直线表示方式:Ax+By+Cz+d=0

    二、已知三点坐标怎样求法向量
        已知A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3)三点的面怎样求它的法向量
        求:1.三个点可以形成3个向量,比如向量AB,向量AC和向量BC,则分别得到(x2-x1,y2-y1,z2-z1),AC(x3-x1,y3-y1,z3-z1),(x3-x2,y3-y2,z3-z2)
                2.设平面的法向量坐标是(x,y,z)则,根据法向量定义的,得到方程组:
                (x2-x1)*x+(y2-y1)*y+(z2-z1)*z=0;
                且(x3-x1)*x+(y3-y1)*y+(z3-z1)*z=0;
                且(x3-x2)*x+(y3-y2)*y+(z3-z2)*z=0 ;
                解出来x,y,z就是平面法向量的坐标,方向满足 右手螺旋 法则.

     

    三、空间直线与平面的交点

    如果直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z):

     将直线方程写成参数方程形式,即有:

    x = m1+ v1 * t

    y = m2+ v2 * t (1)

    z = m3+ v3 * t

    将平面方程写成点法式方程形式,即有:

    vp1 * (x – n1) + vp2 * (y – n2) + vp3 * (z – n3) = 0 (2)

    则直线与平面的交点一定满足式(1)和(2),联立两式,求得:

    t = ((n1 – m1)*vp1+(n2 – m2)*vp2+(n3 – m3)*vp3) / (vp1* v1+ vp2* v2+ vp3* v3) (3)

    如果(3)式中分母(vp1* v1+ vp2* v2+ vp3* v3)为0,则表示直线与平面平行,即直线与平面没有交点。求解出t后,然后将t代入式(1)即可求得交点O的坐标(x,y,z)。定义一个求直线与平面交点坐标的函数


    使用向量表示就是 vector3d S = R1 + (RN *(R0-R1))/(RN*RA)*RA  (R1是直线起点、RA是直线的方向向量、RN是平面法矢、R0是平面上一点、S就是计算得到的交点)

     

    四、相关代码

    1.点方式求法,直线上两点坐标A(Lx1, Ly1, Lz1),B(Lx2, Ly2, Lz2),与平面上的三点坐标C(Px1, Py1, Pz1),D(Px2, Py2, Pz2),E(Px3, Py3, Pz3),则该直线与平面的交点坐标计算方法为:

    public double[] MianXianJiaoDianXYZ(double Lx1, double Ly1, double Lz1, double Lx2, double Ly2, double Lz2, double Px1, double Py1, double Pz1, double Px2, double Py2, double Pz2, double Px3, double Py3, double Pz3)
        {
            double[] newJiaoPoint = new double[3];
            //L直线矢量
            double m = Lx2 - Lx1;
            double n = Ly2 - Ly1;
            double p = Lz2 - Lz1;
            //MessageBox.Show(m.ToString("#0.#") + "," + n.ToString("#0.#") + "," + p.ToString("#0.#,"));

            //平面方程Ax+BY+CZ+d=0 行列式计算
            double A = Py1 * Pz2 + Py2 * Pz3 + Py3 * Pz1 - Py1 * Pz3 - Py2 * Pz1 - Py3 * Pz2;
            double B = -(Px1 * Pz2 + Px2 * Pz3 + Px3 * Pz1 - Px3 * Pz2 - Px2 * Pz1 - Px1 * Pz3);
            double C = Px1 * Py2 + Px2 * Py3 + Px3 * Py1 - Px1 * Py3 - Px2 * Py1 - Px3 * Py2;
            double D = -(Px1 * Py2 * Pz3 + Px2 * Py3 * Pz1 + Px3 * Py1 * Pz2 - Px1 * Py3 * Pz2 - Px2 * Py1 * Pz3 - Px3 * Py2 * Pz1);
            //MessageBox.Show(A.ToString("#0.#") + "," + B.ToString("#0.#") + "," + C.ToString("#0.#,") + "," + D.ToString("#0.#,"));
            //系数比值 t=-(Axp+Byp+Cxp+D)/(A*m+B*n+C*p)

            if (A*m+B*n+C*p == 0)  //判断直线是否与平面平行   
            {  
                newJiaoPoint = null;  
            }
            else  
            {  
                double t = -(Lx1 * A + Ly1 * B + Lz1 * C + D) / (A * m + B * n + C * p);
                //MessageBox.Show(t.ToString("#0.##############"));
                newJiaoPoint[0] = Lx1 + m * t;
                newJiaoPoint[1] = Ly1 + n * t;
                newJiaoPoint[2] = Lz1 + p * t;
                //MessageBox.Show(newJiaoPoint[0].ToString("#0.####") + "," + newJiaoPoint[1].ToString("#0.####") + "," + newJiaoPoint[2].ToString("#0.####"));

            }
            return (newJiaoPoint);

    }

    2.向量方式求法

         /// <summary>  
        /// 求一条直线与平面的交点  
        /// </summary>  
        /// <param name="planeVector">平面的法线向量,长度为3</param>  
        /// <param name="planePoint">平面经过的一点坐标,长度为3</param>  
        /// <param name="lineVector">直线的方向向量,长度为3</param>  
        /// <param name="linePoint">直线经过的一点坐标,长度为3</param>  
        /// <returns>返回交点坐标,长度为3</returns>  
        private float[] CalPlaneLineIntersectPoint(float[] planeVector, float[] planePoint, float[] lineVector, float[] linePoint)  
        {  
        float[] returnResult = new float[3];  
        float vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t,vpt;  
        vp1 = planeVector[0];  
        vp2 = planeVector[1];  
        vp3 = planeVector[2];  
        n1 = planePoint[0];  
        n2 = planePoint[1];  
        n3 = planePoint[2];  
        v1 = lineVector[0];  
        v2 = lineVector[1];  
        v3 = lineVector[2];  
        m1 = linePoint[0];  
        m2 = linePoint[1];  
        m3 = linePoint[2];  
        vpt = v1 * vp1 + v2 * vp2 + v3 * vp3;  
        //首先判断直线是否与平面平行  
        if (vpt == 0)  
        {  
        returnResult = null;  
        }  
        else  
        {  
        t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt;  
        returnResult[0] = m1 + v1 * t;  
        returnResult[1] = m2 + v2 * t;  
        returnResult[2] = m3 + v3 * t;  
        }  
        return returnResult;  
        } 

    展开全文
  • 遗传算法一些交叉算子

    万次阅读 多人点赞 2020-09-07 12:13:01
    文章目录第二十章 遗传算法-史上最直观交叉算子(动画演示)20.1 单点交叉(Single-point crossover)20.2 两点交叉(Two-points crossover)20.3 多点交叉(Multi-point crossover)20.4 部分匹配交叉(Partially-....

    演化计算-遗传算法一些交叉算子(动画演示)

    第二十章 遗传算法-史上最直观交叉算子(动画演示)

    遗传算法通过交叉算子来维持种群的多样性,应该说交叉算子是遗传算法中最重要的操作。针对不同的优化问题,有多种不同的交叉算子,今天将带领大家以动画的形式,直观地介绍不同交叉算子的原理。制作不易,感谢关注。

    20.1 单点交叉(Single-point crossover)

    单点交叉通过选取两条染色体,在随机选择的位置点上进行分割并交换右侧的部分,从而得到两个不同的子染色体。单点交叉是经典的交叉形式,与多点交叉或均匀交叉相比,它交叉混合的速度较慢(因为将染色体分成两段进行交叉,这种方式交叉粒度较大),然而对于选取交叉点位置具有一定内在含义的问题而言,单点交叉可以造成更小的破坏。
    在这里插入图片描述

    20.2 两点交叉(Two-points crossover)

    两点交叉是指在个体染色体中随机设置了两个交叉点,然后再进行部分基因交换。两点交叉的具体操作过程是:

    1. 在相互配对的两个个体编码串中随机设置两个交叉点;
    2. 交换两个个体在所设定的两个交叉点之间的部分染色体。
      在这里插入图片描述

    20.3 多点交叉(Multi-point crossover)

    多点交叉或称广义交叉,是指在个体染色体中随机设置多个交叉点,然后进行基因交换。其操作过程与单点交叉和两点交叉相类似。如果多点交叉只选择了一个交叉点,那么多点交叉就变成了单点交叉。
    在这里插入图片描述

    20.4 部分匹配交叉(Partially-matched crossover,PMX)

    部分匹配交叉保证了每个染色体中的基因仅出现一次,通过该交叉策略在一个染色体中不会出现重复的基因,所以PMX经常用于旅行商(TSP)或其他排序问题编码。
    PMX类似于两点交叉,通过随机选择两个交叉点确定交叉区域。执行交叉后一般会得到两个无效的染色体,个别基因会出现重复的情况,为了修复染色体,可以在交叉区域内建立每个染色体的匹配关系,然后在交叉区域外对重复基因应用此匹配关系就可以消除冲突。
    Step1:随机选择一对染色体(父代)中几个基因的起止位置(两染色体被选位置相同)。
    在这里插入图片描述

    Step2:交换这两组基因的位置。
    在这里插入图片描述
    Step3:做冲突检测,根据交换的两组基因建立一个映射关系,如图所示,以7-5-2这一映射关系为例,可以看到第二步结果中子代1存在两个基因7,这时将其通过映射关系转变为基因2,以此类推至没有冲突为止。最后所有冲突的基因都会经过映射,保证形成的新一对子代基因无冲突。
    在这里插入图片描述
    最终结果为:
    在这里插入图片描述
    动画效果如下:
    在这里插入图片描述

    20.5 均匀交叉(Uniform crossover)

    均匀交叉也称一致交叉,在均匀交叉中,两个染色体的索引i处的基因以交换概率pS进行交换。经验研究表明,均匀交叉比是一种更具利用性的方法,这样可以更好地搜索设计空间,同时保持良好的信息交换。
    在这里插入图片描述

    20.6 顺序交叉(Order Crossover,OX)

    在两个父代染色体中随机选择起始和结束位置,将父代染色体1该区域内的基因复制到子代1相同位置上,再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。与PMX不同的是,OX不用进行冲突检测工作(实际上也只有PMX需要做冲突检测)。
    Step1:与PMX相同,随机选择一对染色体(父代)中几个基因的起止位置(两染色体被选位置相同)。
    在这里插入图片描述
    Step2:生成一个子代,并保证子代中被选中的基因的位置与父代相同。
    在这里插入图片描述
    Step3:先找出第一步选中的基因在另一个父代中的位置,再将其余基因按顺序放入上一步生成的子代中。
    在这里插入图片描述
    动画效果如下:
    在这里插入图片描述

    20.7 基于位置的交叉(Position-based Crossover,PBX)

    在两个父代染色体中随机选择几个位置,位置可以不连续,将父代染色体1这些位置上的基因复制到子代1相同位置上,再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。PBX与OX的不同在于选取的位置可以不连续。
    Step1:随机选择一对染色体(父代)中几个基因,位置可不连续,但两染色体被选位置相同。

    在这里插入图片描述
    Step2:与OX的第二步相同,生成一个子代,并保证子代中被选中的基因的位置与父代相同。

    在这里插入图片描述

    Step3:也与OX的第三步相同,先找出第一步选中的基因在另一个父代中的位置,再将其余基因按顺序放入上一步生成的子代中。
    在这里插入图片描述
    动画效果如下:
    在这里插入图片描述

    20.8 基于顺序的交叉(Order-Based Crossover,OBX)

    在两个父代染色体中随机选择几个位置,位置可以不连续,先在父代染色体2中找到父代染色体1被选中基因的位置,再用父代染色体2中其余的基因生成子代,并保证位置对应,将父代染色体1中被选择的基因按顺序放入子代剩余位置中。另一个子代以类似方式得到。OBX与PBX相比,生成子代的“基础”基因来源不同,PBX来自被选中基因,OBX来自剩余基因。
    Step1:随机选择一对染色体(父代)中几个基因,位置可不连续,但两染色体被选位置相同。
    在这里插入图片描述
    Step2:先在父代2中找到父代1被选中基因的位置,再用父代2中其余的基因生成子代,并保证位置对应。
    在这里插入图片描述
    Step3:将父代1中被选择的基因按顺序放入子代剩余位置中。
    在这里插入图片描述
    动画效果如下:
    在这里插入图片描述

    20.9 循环交叉(Cycle Crossover,CX)

    在某个父代上随机选择1个基因,然后找到另一个父代相应位置上的基因编号,再回到第一个父代找到同编号的基因的位置,重复先前工作,直至形成一个环,环中的所有基因的位置即为最后选中的位置。用父代染色体1中选中的基因生成子代,并保证位置对应,最后将父代染色体2中剩余基因放入子代中。另一个子代以相同方式获得。CX的特点在于只需要随机选择一个位置即可得到多个交叉位置。
    在这里插入图片描述

    20.10 子路径交叉交叉(Subtour Exchange Crossover,SEX)

    在某个父代上选择1组基因,在另一父代上找到这些基因的位置,保持未选中基因不变,按选中基因的出现顺序,交换两父代染色体中基因的位置,一次生成两个子代。SEX的特点是只在一个染色体上选择基因的位置。
    在这里插入图片描述

    展开全文
  • 遗传算法小结(三)

    万次阅读 2017-10-30 09:21:02
    二进制编码的缺点是汉明悬崖(Hamming Cliff),就是在某些相邻整数的二进制代码之间有很大的汉明距离,使得遗传算法的交叉和突变都难以跨越。 格雷码(Gray Code):在相邻整数之间汉明距离都为1。(较好)有意义...
  • 虽然感觉程序很简单,但是让你动手写那些过程矩阵的时候就感觉不怎么简单了,就上网找找看有木有简便的计算方法,搜索之后没有发现有现成的例子,只搜到了句“弄条线,从左上角挪到右下角”,“十字交叉法,从...
  • 数据分析方法论2:交叉&平均分析

    千次阅读 2020-12-17 16:44:19
    交叉分析 and 平均分析 平均分析 平均分析顾名思义,就是用平均数来反映数据在某一特征下的水平,平均分析通常和对比分析结合在一起,从时间和空间多个角度衡量差异,找到其中的趋势和规律。 01 不得不提...
  • 该算法根据启发式规则消除一部分虚假定位,用Hough变换检测出所有直线航迹,再利用逻辑起始真实目标的航迹。对存在虚警、漏检和目标数量未知的复杂环境的仿真研究,证明了该算法的有效性。讨论了新算法由站...
  • 信号交叉口通行能力计算方法探讨,张桂梅,李国文,介绍目前国内外常用的种计算信号交叉口通行能力的方法(停车线、冲突点法),以某个具有代表性的信号交叉口为例,通过用种方�
  • 作者注:本文写于三年前,今天才转到这里来。 ... 交叉又称重组,是指把个父代个体的部分结构加以替换、重组而生成新个体的操作。交叉操作的作用是组合出新的个体,在串空间进行有效搜索,同时
  • 通俗易懂彻底理解十倍交叉验证

    千次阅读 2021-01-06 15:00:21
    通俗易懂彻底理解十倍交叉验证 十倍交叉验证: 将所有数据分为十份,然后将每一份作为验证集,其他作为训练集来进行训练和验证。在这一过程中,保持超参数一致,然后取10个模型的平均训练loss和平均验证loss,来...
  • 西瓜书习题3.4 (交叉验证)

    千次阅读 2019-07-10 18:41:48
    ​ 选择个UCI数据集,比较10折交叉验证和留一所估计出的对率回归的错误率. 1.数据集长啥样? ​ 于是就下载了一组UCI数据集,它长这样: 至于这些数据是啥意思、UCI又是啥,咱也不知道咱也不敢问qwq~,只知道...
  • 根据冲突相位车流到达冲突时间的先后情况,得出当交叉口清空指数小于 0,左转车流到达冲突比直行车流时间长的情况,归纳了设置待行区的适宜条件.本研究把左转待行区合理地融合进我国现有的交叉口综合控制管理中...
  • 交叉验证是什么? 在模型建立中,通常有个数据集:训练集(train)和测试集(test)。训练集用来训练模型;测试集是完全不参与训练的数据,仅仅用来观测测试效果的数据。 一般情况下,训练的结果对于训练集的拟合...
  • 1、线性回归+留出与lasso+留出 #波士顿房价 from sklearn import datasets from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from
  • 将P1,P2两点之间部分提取出来,放在子代O2,O1相同位置 在提取出来的部分中,映射关系为2->1,7->6,1->8。下面我们可以把子代未填充的部分补充完整(使用父代),O1第一个位置来源于P1第一个位置,是3,第...
  • 交叉方向乘子(ADMM)算法

    千次阅读 2020-05-03 11:19:56
     交替方向乘子(ADMM)是一种求解具有可分离的凸优化问题的重要方法,由于处理速度快,收敛性能好,ADMM算法在统计学习、机器学习等领域有着广泛应用。 凸优化问题: 正常的凸优化问题:  这是最简单的优化问题...
  • 视觉里程计 特征点法 的基本过程

    千次阅读 2017-11-23 20:16:47
    视觉里程计的任务是估计相邻图像间相机的运动,分为特征点法和直接。...1. 特征点法 ...定义:特征是图像当中具有代表性的部分,这些在相机视角发生...组成:由关键和描述子部分组成 关键——位置
  • Python遗传算法部分匹配交叉(PMX)

    千次阅读 2020-10-07 10:50:08
    在进化算法的交叉环节中,无论是一点交叉还是两点交叉,基因重组后产生的后代可能出现编码重复的情况,那么就需要我们对产生的子代进行修订,常见修订算法有部分匹配交叉(PMX),顺序交叉(OX),循环交叉(CX)等 ...
  • 关键词: 错误率(error rate);精度(accuracy);经验误差(empirical error);...交叉验证(cross validation);自助(bootstrapping);训练集(train set)、验证集(valid set)、测试集(test set...
  • 个大地坐标下进行坐标转换时,首先要利用具有个坐标系下大地坐标的公共,求取转换参数。由于选择的公共距离较近,导致求参方程系数矩阵呈现病态性质。文中探讨利用截断奇异值和广义交叉检验准则解决这...
  • 透视变换---一点透视和两点透视

    万次阅读 2016-05-04 16:00:16
    下面我们将要学习的是两点透视,它通过两个灭点来增加斜线,两个面都用斜线绘制,从而增加纵深感。通过前面一点透视的学习,掌握两点透视就更加轻松了。关于透视,我们一共有三篇文章,希望学习基础绘画的朋友转载。...
  • 选自toward data science作者:Courtney Cochrane编译:机器之心本文简要讲解了交叉验证和嵌套交叉验证,并介绍了针对单个时序数据和多个时序数...
  • Dijkstra算法 1.定义概览 ...Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他...主要特点是以起始为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算
  • 深度学习知识:K折交叉验证

    千次阅读 2019-04-24 21:24:37
    K折交叉验证:将可用数据划分为K个分区(K通常取4或5),实例化K个相同的模型,将每个模型在K-1个分区上训练,并在剩下的一个分区上进行评估。模型的验证分数等于K个验证分数的平均值。 下面是3折交叉验证的图示: ...
  • 插入-delaunay三角剖分

    千次阅读 2020-02-25 15:19:27
    参考资料: 三角剖分 :https://baike.baidu.com/item/Delaunay%E4%B8%89%E8%A7%92%E5%89%96%E5%88%86%E7%AE%97%E6%B3%95?tp=2_11 TIN: ...逐插入三角剖...
  • 现在的训练可能很少用到交叉验证(cross-validate), 因为我现在处理的数据集规模庞大,如果使用交叉验证则会花费很长的时间。但是交叉验证的重要性有目共睹的,无论你是在使用小数据集做算法的改进,还是在Kaggle...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,330
精华内容 23,332
热门标签
关键字:

两点交叉法