機(jī)器學(xué)習(xí)-第八章 集成學(xué)習(xí)

8.1 個(gè)體與集成

集成學(xué)習(xí)是通過構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來完成任務(wù)。

集成學(xué)習(xí)的一般結(jié)構(gòu):一組"個(gè)體學(xué)習(xí)器"通過某種策略將它們結(jié)合起來。

集成學(xué)習(xí)的種類:
1)同質(zhì)集成
個(gè)體學(xué)習(xí)器通過某種算法訓(xùn)練而成,此時(shí)集成中只包含同種類型的個(gè)體學(xué)習(xí)器,這就是同質(zhì)集成。如,每個(gè)個(gè)體學(xué)習(xí)器通過C4.5決策樹算法訓(xùn)練而成,最終組成"決策樹集成";再如"神經(jīng)網(wǎng)絡(luò)集成"中都是神經(jīng)網(wǎng)絡(luò)。
同質(zhì)集成中的個(gè)體學(xué)習(xí)器稱為"基學(xué)習(xí)器",相應(yīng)算法稱為"基學(xué)習(xí)算法"。
2)異質(zhì)集成
集成中包含不同算法訓(xùn)練而成的個(gè)體學(xué)習(xí)器,如集成中同時(shí)包含決策樹和神經(jīng)網(wǎng)絡(luò),這樣的集成就是異質(zhì)集成。異質(zhì)集成中的個(gè)體學(xué)習(xí)器稱為"組件學(xué)習(xí)器"。

集成學(xué)習(xí)示意圖

要獲得好的集成,個(gè)體學(xué)習(xí)器應(yīng)當(dāng)"好而不同"。
"好"即個(gè)體學(xué)習(xí)器要有一定的"準(zhǔn)確性",不能太差;
"不同"即要有"多樣性",學(xué)習(xí)器之間要有差異。

舉一個(gè)例子:在二分類任務(wù)中,假定三個(gè)分類器(h)在三個(gè)測試樣本的表現(xiàn)如下,其中√表示分類正確,×表示分類錯(cuò)誤,集成學(xué)習(xí)的結(jié)果通過"少數(shù)服從多數(shù)"的原則產(chǎn)生。
集成中的學(xué)習(xí)器應(yīng)好而不同

圖a中,每個(gè)分類器h的精度是66.6%,但是集成中的精度提升到100%;圖b中,每個(gè)分類器的結(jié)果都是一樣的,因此集成中沒有變化;圖c中,每個(gè)分類器的精度只有33.3%,集成中的精度降低為0。從上面可以看出,圖a的三個(gè)分類器滿足了"好而不同","好"即有66.6%的精度,"不同"即每個(gè)分類器的結(jié)果不同;而圖b雖然"好",但是分類器結(jié)果相同;圖c雖然結(jié)果不同,但是精度太低。

假設(shè)基學(xué)習(xí)器的誤差相互獨(dú)立,則集成的錯(cuò)誤率為

從集成錯(cuò)誤率中可以看出,個(gè)體學(xué)習(xí)器的數(shù)目T越大,集成錯(cuò)誤率越低,直至為0。

然而,現(xiàn)實(shí)中,基學(xué)習(xí)器不是相互獨(dú)立的,所以個(gè)體學(xué)習(xí)器的"準(zhǔn)確性"和"多樣性"本身就存在沖突。一般的,準(zhǔn)確性很高之后,要增加多樣性就需犧牲準(zhǔn)確性。

如何產(chǎn)生結(jié)合"好而不同"的個(gè)體學(xué)習(xí)器,是集成學(xué)習(xí)研究的核心。

  • 對于產(chǎn)生好而不同的學(xué)習(xí)器的方式
    根據(jù)個(gè)體學(xué)習(xí)器的生成方式,目前的集成學(xué)習(xí)方法大致可分為兩大類:
    第一類:個(gè)體學(xué)習(xí)器問存在強(qiáng)依賴關(guān)系、必須串行生成的序列化方法。代表是Boosting
    第二類:個(gè)體學(xué)習(xí)器間不存在強(qiáng)依賴關(guān)系、可同時(shí)生成的并行化方法。代表是Bagging"隨機(jī)森林" (Random Forest)。

  • 結(jié)合學(xué)習(xí)器的方式。
    1)平均法
    2)投票法
    3)學(xué)習(xí)法

上面的產(chǎn)生和結(jié)合方式將在下面講到。

8.2 Boosting

弱學(xué)習(xí)器常指泛化性略優(yōu)于隨機(jī)猜測的學(xué)習(xí)器。
例如在二分類問題上精度略高于50%的分類器目。

Boosting是可以將弱學(xué)習(xí)器提升為強(qiáng)學(xué)習(xí)器的算法。
Boosting主要關(guān)住降低偏差,因此Boosting能基于泛化性能相當(dāng)弱的學(xué)習(xí)器構(gòu)建出很強(qiáng)的集成。

工作機(jī)制:
先從初始訓(xùn)練集訓(xùn)練出一個(gè)基學(xué)習(xí)器;
再根據(jù)基學(xué)習(xí)器的表現(xiàn)對訓(xùn)練樣本分布進(jìn)行調(diào)整,使得先前基學(xué)習(xí)器做錯(cuò)的訓(xùn)練樣本的權(quán)重變高,在后續(xù)受到更多關(guān)注;
然后基于調(diào)整權(quán)重后的樣本分布來訓(xùn)練下一個(gè)基學(xué)習(xí)器;
如此重復(fù)進(jìn)行,直至基學(xué)習(xí)器數(shù)目達(dá)到事先指定的值T;
最終將這T個(gè)基學(xué)習(xí)器進(jìn)行加權(quán)結(jié)合。

Boosting工作機(jī)制示意圖

關(guān)于Boosting的兩個(gè)核心問題:
1)每一輪如何改變訓(xùn)練數(shù)據(jù)的權(quán)值或概率分布?
通過提高那些在前一輪被弱分類器分類錯(cuò)誤樣例的權(quán)值,減小前一輪分類正確樣例的權(quán)值,來使得分類器對誤分的數(shù)據(jù)有較好的效果。

2)通過什么方式來組合弱分類器?
通過加法模型將弱分類器進(jìn)行線性組合。

Boosting族中最著名的是AdaBoost算法。
剛開始訓(xùn)練時(shí)對每一個(gè)訓(xùn)練例賦相等的權(quán)重,然后用該算法對訓(xùn)練集訓(xùn)練t輪,每次訓(xùn)練后,對訓(xùn)練失敗的訓(xùn)練例賦以較大的權(quán)重,也就是讓學(xué)習(xí)算法在每次學(xué)習(xí)以后更注意學(xué)錯(cuò)的樣本,從而得到多個(gè)預(yù)測函數(shù)。通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。

y∈{-1,1},f(x)是真實(shí)(值)函數(shù)。
AdaBoost算法流程

以下是AdaBoost的推導(dǎo)

基于基學(xué)習(xí)器的線性組合,來最小化指數(shù)損失函數(shù)

基學(xué)習(xí)器的線性組合
指數(shù)損失函數(shù)
使用指數(shù)損失函數(shù)是因?yàn)槠渚哂锌晌⒌?、較好的數(shù)學(xué)性質(zhì)。

第一個(gè)基學(xué)習(xí)器h1是通過基學(xué)習(xí)算法用于初始數(shù)據(jù)發(fā)布獲得。
之后迭代產(chǎn)生αt和ht,當(dāng)學(xué)習(xí)器ht基于發(fā)布Dt產(chǎn)生后,ht的權(quán)重αt,要使得αtht最小化指數(shù)損失函數(shù)。對于每個(gè)αtht有,

每個(gè)基學(xué)習(xí)器的指數(shù)損失函數(shù)
因?yàn)闄?quán)重αt,要使得指數(shù)損失函數(shù)最小,因此對權(quán)重令偏導(dǎo)為0,得
得到Ht-1集成之后,樣本分布需要調(diào)整,使得學(xué)習(xí)器ht能糾正Ht-1的錯(cuò)誤。理想的ht能糾正Ht-1的全部錯(cuò)誤,即最小化指數(shù)損失函數(shù)。如下

推導(dǎo)之后,可以再次鞏固AdaBoost算法的流程。
算法流程:https://blog.csdn.net/qq_37960402/article/details/88426900

AdaBoost的例題

AdaBoost算法的實(shí)現(xiàn)代碼

import pdb
import numpy as np
import operator
import math
def dataset():
    data=[0,1,2,3,4,5,6,7,8,9]
    labels=[1,1,1,-1,-1,-1,1,1,1,-1]
    return data,labels


def mytree(data,label,D1):    #生成最優(yōu)決策樹
    point=(np.array(data[:-1])+np.array(data[1:]))/2   #取data中相鄰兩者之間的平均值
    dic={}
    sign={}
    for i in point:      #遍歷平均值
        predict1=np.array(data<i)       #判斷左邊為1
        predict1=(predict1+0)+(predict1-1)    #將結(jié)果轉(zhuǎn)換為[1,-1]
        result1=sum(abs(predict1-label)/2*D1)  #誤差

        predict2 = np.array(data > i)    #判斷右邊為1
        predict2 = (predict2 + 0) + (predict2 - 1)
        result2 = sum(abs(predict2 - label) / 2 * D1)
        if  result1<=result2:   #保存符號和左右邊哪個(gè)結(jié)果更好
            dic[i]=result1
            sign[i]='<'
        else:
            dic[i]=result2
            sign[i]='>'
    bestpoint = sorted(dic.items(),key=operator.itemgetter(1))
    return bestpoint[0],sign[bestpoint[0][0]]



def Zm1(label,Gm,a,D1):   #返回當(dāng)前樣本的權(quán)重
    sum=0
    for i in range(len(label)):
        sum+=D1[i]*math.e**(-a*label[i]*Gm[i])
    newD1=[]
    for i in range(len(label)):
        w=D1[i]/sum*math.e**(-a*label[i]*Gm[i])
        newD1.append(w)
    return newD1


def adaboot1():
    data,label=dataset()           #獲取數(shù)據(jù)集和標(biāo)簽文件
    D1=[1/len(data)]*len(data)     #求每一個(gè)樣本的初始權(quán)重,0.1
    bestpoint=[]                   #保存目前最佳的分割點(diǎn)
    besta=[]                       #保存每一棵基決策樹對應(yīng)的權(quán)重
    signall=[]                       #保存每一個(gè)最佳分割點(diǎn)對應(yīng)的符號(大于或小于)
    result=[]                         #保存每個(gè)基決策樹對樣本分類的結(jié)果
    for i in range(20):
        ht,sign=mytree(data,label,D1)   #當(dāng)前最好的樹
        signall.append(sign)            #保存記號
        bestpoint.append(ht[0])         #保存當(dāng)前最佳分割點(diǎn)
        if sign==str('>'):
            Gm= np.array(data > ht[0])
            Gm = (Gm+0) + (Gm-1)
        else:
            Gm= np.array(data < ht[0])
            Gm = (Gm+ 0) + (Gm- 1)       #樣本帶入樹中得到當(dāng)前樣本結(jié)果

        a=0.5*(math.log((1-ht[1])/ht[1]))    #通過誤差計(jì)算得到基決策樹權(quán)值
        besta.append(a)
        result.append(Gm)
        D1=Zm1(label,Gm,a,D1)                #計(jì)算得到每個(gè)樣本點(diǎn)的權(quán)值

        sum1=[0]*len(data)              #以下循環(huán)計(jì)算當(dāng)前結(jié)果是否達(dá)到最優(yōu)
        for i in range(len(result)):
            sum1+=result[i]*besta[i]     #result=w1f(x1)+w2f(x2)+..
        sum1 = np.array(sum1>=0)
        sum1 = (sum1 + 0) + (sum1- 1)

        if sum(sum1==label)==len(data):    #如果結(jié)果相等,則輸出以下語句
            print("一種生成{}棵基函數(shù)".format(len(result)))
            for i in range(len(result)):
                dic = {}
                print ("第{}棵決策樹是".format(i+1))
                if signall[i]==str('>'):
                    dic['num'+'>' + str(bestpoint[i])]=1
                    dic['num'+'<' + str(bestpoint[i])] = -1
                if signall[i] == str('<'):
                    dic['num'+'<' + str(bestpoint[i])] = 1
                    dic['num'+'>' + str(bestpoint[i])] = -1
                print(dic)
                print ("權(quán)值是{}".format(besta[i]))
                print()
            break

adaboot1()

代碼來源:https://blog.csdn.net/qq_37960402/article/details/88539253

8.3 Bagging與隨機(jī)森林

為了提高泛化能力,要盡可能使基學(xué)習(xí)器相對獨(dú)立,對訓(xùn)練樣本進(jìn)行采樣以產(chǎn)生若干個(gè)不同的子集,對每一個(gè)子集訓(xùn)練一個(gè)基學(xué)習(xí)器;又為了進(jìn)行有效的學(xué)習(xí)獲得較好的集成,子集不能完全不同,因此使用子集之間相互有交疊的采樣方法。

1. Bagging

bagging 是一種個(gè)體學(xué)習(xí)器之間不存在強(qiáng)依賴關(guān)系、可同時(shí)生成的并行式集成學(xué)習(xí)方法。

bagging基于自助采樣法(bootstrap sampling),即給定包含m個(gè)樣本的數(shù)據(jù)集,先隨機(jī)從樣本中取出一個(gè)樣本放入采樣集中,再把該樣本返回初始數(shù)據(jù)集,使得下次采樣時(shí)該樣本仍可以被選中。這樣,經(jīng)過m次隨機(jī)采樣,就可以得到包含m個(gè)樣本的采樣集,初始數(shù)據(jù)集中有的樣本多次出現(xiàn),有的未出現(xiàn)。訓(xùn)練集中約有63.2%的樣本出現(xiàn)在采樣集中。

上面的操作進(jìn)行T次得到T個(gè)每個(gè)含m個(gè)樣本的采樣集,基于每個(gè)采樣集訓(xùn)練一個(gè)基學(xué)習(xí)器,一共訓(xùn)練出T個(gè),再將基學(xué)習(xí)器進(jìn)行組合。這就是Bagging的基本流程。在對輸出進(jìn)行預(yù)測時(shí),Bagging通常對分類進(jìn)行簡單投票法,對回歸使用簡單平均法。在分類中,若出現(xiàn)票數(shù)相同的情況,則隨機(jī)取一個(gè)。

Bagging的基本流程

Bagging的優(yōu)點(diǎn):

  • Bagging 是一個(gè)很高效的集成學(xué)習(xí)算務(wù)。
  • 與標(biāo)準(zhǔn) AdaBoost 只適用于二分類任務(wù)不間,Bagging能不經(jīng)修改地用于多分類、回歸等任務(wù)。
  • 每個(gè)基學(xué)習(xí)器使用63.2%的數(shù)據(jù),所以剩下36.8%的數(shù)據(jù)可以用來做驗(yàn)證集來對泛化性能進(jìn)行“包外估計(jì)”(out-of-bag estimate)。
    進(jìn)行包外估計(jì),需要記錄每個(gè)基學(xué)習(xí)器所使用的樣本。
    令Dt表示ht實(shí)際使用的訓(xùn)練樣本集,令Hoob(x)表示對樣本x的包外預(yù)測,即僅考慮剩余未使用的x訓(xùn)練的基學(xué)習(xí)器在x上的預(yù)測
    包外樣本(剩余的樣本)有其他用途
    當(dāng)基學(xué)習(xí)器是決策樹時(shí),可以使用包外樣本來輔助剪枝;
    當(dāng)基學(xué)習(xí)器是神經(jīng)網(wǎng)絡(luò),可用包外樣本來輔助早停以減少過擬合。

從偏差-方差的角度來說,boosting主要關(guān)注減小偏差,而Bagging主要關(guān)注降低方差,也就說明boosting在弱學(xué)習(xí)器上表現(xiàn)更好,而降低方差可以減小過擬合的風(fēng)險(xiǎn),所以Bagging通常在強(qiáng)分類和復(fù)雜模型上表現(xiàn)得很好。舉個(gè)例子:bagging在不減枝決策樹、神經(jīng)網(wǎng)絡(luò)等易受樣本擾動的學(xué)習(xí)器上效果更為明顯。

2. 隨機(jī)森林

隨機(jī)森林是Bagging算法的進(jìn)化版,對bagging進(jìn)行了改進(jìn)。
隨機(jī)森林RF以決策樹為基學(xué)習(xí)器構(gòu)建Bagging集成的基礎(chǔ)上,進(jìn)一步在決策數(shù)訓(xùn)練過程中引入了隨機(jī)屬性選擇。

具體來說,傳統(tǒng)決策樹在選擇劃分屬性時(shí)是在當(dāng)前結(jié)點(diǎn)的屬性集合(假定有d個(gè)屬性)中選擇一個(gè)最優(yōu)屬性;
而在RF中,對基決策樹的每個(gè)結(jié)點(diǎn),先從該結(jié)點(diǎn)的屬性集合中隨機(jī)選擇一個(gè)包含k個(gè)屬性的子集,然后再從子集中選擇一個(gè)最優(yōu)屬性用于劃分。

k描述了隨機(jī)性的引入程度。若k=d,則決策樹的構(gòu)建與傳統(tǒng)決策樹相同;若k=1,則隨機(jī)選擇一個(gè)屬性用于劃分;一般情況,k=long2d。

RF的優(yōu)點(diǎn)
隨機(jī)森林中基學(xué)習(xí)器的多樣性不僅來自樣本擾動,還來自屬性擾動,這就使得最終集成的泛化性能可通過個(gè)體學(xué)習(xí)器之間差異度的增加而進(jìn)一步提升。

RF與Bagging的比較

兩者的收斂性相似,但RF的起始性能相對較差,特別只有一個(gè)基學(xué)習(xí)器時(shí)。隨著基學(xué)習(xí)器數(shù)量的增加,隨機(jī)森林通常會收斂到更低的泛化誤差。隨機(jī)森林的訓(xùn)練效率常優(yōu)于Bagging,因?yàn)锽agging是“確定型”決策樹,而隨機(jī)森林使用“隨機(jī)型”決策樹。

8.4 結(jié)合策略

通過上面對個(gè)體學(xué)習(xí)器產(chǎn)生的方式了解之后,我們來看一下個(gè)體學(xué)習(xí)器的結(jié)合。
結(jié)合有以下三個(gè)好處:
1)結(jié)合多個(gè)學(xué)習(xí)器可以提升泛化性能。
2)多個(gè)學(xué)習(xí)器結(jié)合可以降低陷入槽糕局部極小點(diǎn)的風(fēng)險(xiǎn)。
3)結(jié)合多個(gè)學(xué)習(xí)器,可以擴(kuò)大假設(shè)空間,學(xué)得更好的近似。

結(jié)合策略如下
假定集成包含T個(gè)基學(xué)習(xí)器{h1,h2,……,hT},其中hi在樣例x上的輸出為hi(x)。

1. 平均法

數(shù)值型輸出hi(x)∈R,常用的是平均法。

  • 簡單平均法
  • 加權(quán)平均法


    加權(quán)平均法不一定優(yōu)于簡單平均法。一般在個(gè)體學(xué)習(xí)器性能相差較大時(shí)宜使用加權(quán)平均法,而在個(gè)體學(xué)習(xí)器性能相近時(shí)宜使用簡單平均法。

2. 投票法

對分類來說,學(xué)習(xí)器hi將從類別集合C={c1,c2,……,cN}中預(yù)測出一個(gè)類別標(biāo)記,最常用的是投票法。為便于討論,我們將hi在樣本x上的預(yù)測輸出表示為一個(gè)N維向量(hi1(x),hi2(x),……,hiN(x)),其中hij(x)是hi在類別標(biāo)記cj上的輸出。

  • 絕對多數(shù)投票法
  • 相對多數(shù)投票法
  • 加權(quán)投票法

3. 學(xué)習(xí)法

當(dāng)數(shù)據(jù)很多時(shí),可以通過另一個(gè)學(xué)習(xí)器來結(jié)合,即學(xué)習(xí)法。其中典型代表為Stacking,在stacking中我們把個(gè)體學(xué)習(xí)器稱為初級學(xué)習(xí)器,用于結(jié)合的學(xué)習(xí)器稱為次學(xué)習(xí)器或者元學(xué)習(xí)器。

Stacking的主要思想為:先從初始數(shù)據(jù)集訓(xùn)練出初級學(xué)習(xí)器,然后“生成”一個(gè)新的數(shù)據(jù)集用于訓(xùn)練次級學(xué)習(xí)器。生成的新數(shù)據(jù)中,初級學(xué)習(xí)器的輸出被當(dāng)做樣例輸入特征而初始樣本的標(biāo)記仍被當(dāng)做樣例標(biāo)記。

在訓(xùn)練階段,次級學(xué)習(xí)器的訓(xùn)練數(shù)據(jù)集是利用初級學(xué)習(xí)器來產(chǎn)生的,若直接用初級學(xué)習(xí)器的訓(xùn)練集來產(chǎn)生訓(xùn)練數(shù)據(jù)集,則很有可能會出現(xiàn)過擬合;所以一般在使用Stacking時(shí),采用交叉驗(yàn)證或留一法的方式,用訓(xùn)練初級學(xué)習(xí)器未使用的樣本來產(chǎn)生次級學(xué)習(xí)器的訓(xùn)練樣本。
如以k折交叉驗(yàn)證法為例。初始訓(xùn)練集D被隨機(jī)分為k個(gè)大小相同的子集D1,D2,……,Dk。令Dj和D^j=D/Dj(Dj的補(bǔ)集)分別表示第j折的測試集訓(xùn)練集。
給定T個(gè)初級學(xué)習(xí)算法,初級學(xué)習(xí)器htj 在訓(xùn)練集D^j 上使用第t個(gè)學(xué)習(xí)算法而得。對測試集Dj中每個(gè)樣本xi,令zit=htj(xi),即xi在初始學(xué)習(xí)器ht上的輸出記為zit,則由xi產(chǎn)生的次級訓(xùn)練集的樣例部分為zi=(zi1,zi2,……,ziT),而標(biāo)記部分為yi。那么在整個(gè)過程結(jié)束之后,從T個(gè)初級學(xué)習(xí)器產(chǎn)生的次級訓(xùn)練集就是D'={(zi,yi)}mi=1,最后將次級訓(xùn)練集用于訓(xùn)練次級學(xué)習(xí)器。

8.5 多樣性

1. 誤差-分歧分解

上面的推導(dǎo)只適用于回歸學(xué)習(xí),難以推廣到分類學(xué)習(xí)。

2. 多樣性度量

多樣性度量(diversity measure)是用于度量集成中個(gè)體分類器的多樣性,即估算個(gè)體學(xué)習(xí)器的多樣化程度。

  • 不合度量


  • 相關(guān)系數(shù)


  • Q-統(tǒng)計(jì)量


  • k-統(tǒng)計(jì)量


3. 多樣性增強(qiáng)

增強(qiáng)多樣性的方法有:

  • 數(shù)據(jù)樣本擾動
    給定初始數(shù)據(jù)集,可從中產(chǎn)生出不同的數(shù)據(jù)子集,再利用不同的數(shù)據(jù)子集訓(xùn)練出不同的個(gè)體學(xué)習(xí)器。如boosting 和bagging,這種方法對“不穩(wěn)定學(xué)習(xí)器”(例如,決策樹,神經(jīng)網(wǎng)絡(luò))很有效。對于穩(wěn)定基學(xué)習(xí)器,如 線性學(xué)習(xí)器,支持向量機(jī),樸素貝葉斯往往使用輸入屬性擾動。
  • 輸入屬性擾動
    訓(xùn)練樣本通常由一組屬性描述,不同的“子空間”提供了觀察數(shù)據(jù)的不同視角。從不同子空間訓(xùn)練出的個(gè)體學(xué)習(xí)器必然有所不同。子空間一般指從初始的高維屬性空間投影產(chǎn)生的低維屬性空間。若數(shù)據(jù)只包含少量屬性,或者冗余屬性很少,則不宜使用輸入屬性擾動法.
  • 輸出表示擾動
    基本思路是對輸出表示進(jìn)行操縱以增強(qiáng)多樣性??蓪τ?xùn)練樣本
    的類標(biāo)記稍作變動,如翻轉(zhuǎn)法(Flipping Output),隨機(jī)改變一些訓(xùn)練樣本的標(biāo)記;也可對輸出表示進(jìn)行轉(zhuǎn)化,如“輸出調(diào)制法”(Output Smearing)。
  • 算法參數(shù)擾動
    通過隨機(jī)設(shè)置不同的參數(shù)可以產(chǎn)生不同的基學(xué)習(xí)器。對參數(shù)較少的算法,可通過將其學(xué)習(xí)過程中某些環(huán)節(jié)用其他類似方式代替?從而達(dá)到擾動的目的,例如可將決策樹使用的屬性選擇機(jī)制替換成其他的屬性選擇機(jī)制。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容