Multi-view BLUP 原理介紹

問題的由來

參考文獻《Multi-view BLUP: a promising solution for post-omics data integrative prediction》
表型預(yù)測是加速植物育種的一種很有前途的策略,隨著大數(shù)據(jù)時代的來臨,對于同一種性狀的表征往往可以采用不同的數(shù)據(jù)進行推斷。例如從基因組層面,轉(zhuǎn)錄組層面,表觀組層面都可以對表型進行推斷。主要問題:如何整理不同來源的數(shù)據(jù)并進行表型推斷?
作者在這里提出了Multi-view BLUP的框架,用于整合不同來源的數(shù)據(jù)(基因組層面,轉(zhuǎn)錄組層面,表觀組層面記作不同來源的數(shù)據(jù),在計算機中稱之為多視圖)并推斷其表型

理論部分

差分進化算法的目的是,利用不同層次數(shù)據(jù)計算親緣關(guān)系矩陣,并全局最優(yōu)化親緣關(guān)系矩陣,此時該親緣關(guān)系矩陣融合了不同層次的數(shù)據(jù)信息

差分進化算法的步驟分為:初始化,變異,交叉,選擇

1. 初始化


設(shè)解空間內(nèi)存在NP個個體(即種群大小為NP),每個個體是 d 維向量,初始種群隨機產(chǎn)生,可依靠任意函數(shù)生成,上述為一個例子

不同行代表不同種群,行向量(X1~X40代表種群個體的特征向量

2. 變異

差分進化算法使用種群中兩個不同的特征向量來干擾一個現(xiàn)有向量,進行差分操作,來實現(xiàn)變異;g 代表種群代數(shù)


從當(dāng)前群體中隨機選擇 3 個互不相同的種群個體 r1,r2,r3;c 代表變異因子(縮放因子),g 代表種群代數(shù);由此得到變異種群個體特征向量 V1~V40

3. 交叉

對于種群中每個個體和它所生成的子代變異向量進行交叉,即對每一個特征向量按照一定的概率選擇子代變異向量(否則就是原種群個體的特征向量)來生成試驗個體

CR(即 δ)為交叉概率因子;randb(j) 為隨機自然數(shù),可理解為閾值;大于該閾值保持原種群個體的特征向量,賦予對應(yīng)索引的 X1~X40 向量;小于該閾值則選擇子代變異向量 V1~V40 向量

4. 選擇

通過以上的變異、交叉和選擇操作,種群進化到下一代并反復(fù)循環(huán),直到算法迭代次數(shù)達到預(yù)定最大次數(shù),或種群最優(yōu)解達到預(yù)定誤差精度時算法結(jié)束


判斷最優(yōu)解需要設(shè)置目標(biāo)函數(shù),該例子的目標(biāo)函數(shù) f(X) 是混合線性回歸模型;按照一定比例分train和test部分,利用train部分訓(xùn)練混合線性回歸模型,用test部分得到預(yù)測值,計算test部分預(yù)測值與真實值的相關(guān)性,在一定迭代數(shù)中,滿足前后兩代的40個種群個體的平均準(zhǔn)確率向量小于閾值時,停止計算,此時得到的親緣關(guān)系矩陣即為融合了8個層次數(shù)據(jù)的親緣關(guān)系矩陣

代碼部分

整個流程:

source('./MVBLUP/R/GP.R')
source('./MVBLUP/R/MVBLUP.R')
source('./MVBLUP/R/plot.R')
source('./MVBLUP/R/similarity_matrix.R')

library(rrBLUP)

NP <- 40 
n <- 8
CR <- 0.5
Mu <- 0.5
s0 <- 0
s1 <- 1
thre <- 0.0001
iter <- 50
cv <- 5
trid <- 1
output_path <- "./MVBLUP/res/"

# read the multi-view dataset
Multi_view1 <- read.table("./MVBLUP/data/Multi_view1.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view2 <- read.table("./MVBLUP/data/Multi_view2.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view3 <- read.table("./MVBLUP/data/Multi_view3.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view4 <- read.table("./MVBLUP/data/Multi_view4.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view5 <- read.table("./MVBLUP/data/Multi_view5.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view6 <- read.table("./MVBLUP/data/Multi_view6.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view7 <- read.table("./MVBLUP/data/Multi_view7.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_view8 <- read.table("./MVBLUP/data/Multi_view8.txt", header=TRUE, sep="", stringsAsFactors=0, check.names=FALSE)
Multi_dataset <- list(Multi_view1, Multi_view2, Multi_view3, Multi_view4, Multi_view5, Multi_view6, Multi_view7, Multi_view8)

# read phenotype
Phenotype <- read.table("./MVBLUP/data/Phenotype.txt", header = TRUE, sep = "", stringsAsFactors = 0, check.names = FALSE)
train_test_id <- read.table("./MVBLUP/data/train_test_id.txt", header = TRUE, sep = "", stringsAsFactors = 0, check.names = FALSE)

# obtain single-view inner product for calculating multi-view kinship matrix
A_N <- similarity_inner_product(Multi_dataset, n)

# optimize the weights of various single-view datasets by employing the MVBLUP model
MVBLUP_results <- MVBLUP_weights(NP, n, CR, Mu, s0, s1, 
                                 thre, iter, cv, trid, A_N,
                                 Phenotype, train_test_id)


# multi-view kinship matrix obtained from the MVBLUP model
kinship_test <- MVBLUP_results$kinship_test
# testop1_ex: true phenotypes of the test set
testop1_ex <- MVBLUP_results$testop1_ex
# trainop1_ex: true phenotypes of the train set
trainop1_ex <- MVBLUP_results$trainop1_ex

# We output a demo result of MVBLUP model, which includes the optimal weight values for different single-view datasets and the number of iterations required for convergence.
write.table(MVBLUP_results$MVBLUP_information, paste0(output_path, "trait", trid, "-MVBLUP_information.txt"), row.names = FALSE)

# test the MVBLUP model and store the results
MVBLUP_accuracy <- MVBLUP_PreTest(kinship_test, testop1_ex, trainop1_ex)
write.table(MVBLUP_accuracy, paste0(output_path, "trait", trid, "-MVBLUP_accuracy.txt"), row.names = TRUE)

1. 關(guān)于數(shù)據(jù)的輸入

  1. Multi_view1.txt - Multi_view8.txt,相當(dāng)于不同層面的數(shù)據(jù):


    Multi_view1.txt

    Multi_view8.txt

行代表不同的sample,列表示不同的特征,可以是SNP信息,可以是基因表達譜數(shù)據(jù)。Multi_view1.txt為 100(sample)× 3000(特征數(shù)量)的矩陣,Multi_view8.txt為 100(sample)× 1000(特征數(shù)量)的矩陣。各個來源數(shù)據(jù)的樣本數(shù)量相同,特征的數(shù)量(和值)可以不同。

  1. Phenotype.txt,代表表型數(shù)據(jù)值
    Phenotype.txt
  2. train_test_id.txt,劃分sample的訓(xùn)練集和測試集
    train_test_id.txt

2. 關(guān)于函數(shù) similarity_inner_product()

similarity_inner_product() 解析:

#=============Computing the inner product of a single-view dataset==============
similarity_inner_product <- function(Multis,n) {
  A_N <- array(0, dim = c(nrow(Phenotype), nrow(Phenotype), n))
  for (n0 in 1:n) {
    # Multis 中含有 8 個不同層次來源的數(shù)據(jù),Multis[[n0]][, -1] 相當(dāng)于將每一個層次的數(shù)據(jù)矩陣取出來并刪除第一列sample名
    # as.numeric(x) - mean(as.numeric(x))) / sd(as.numeric(x) 相當(dāng)于對同一層次數(shù)據(jù)矩陣中的每一個特征(每一列)的向量進行標(biāo)準(zhǔn)化
    data_S <- apply(Multis[[n0]][, -1], 2, function(x) {
      (as.numeric(x) - mean(as.numeric(x))) / sd(as.numeric(x))
    })
   # 計算 sample 特征向量之間的乘積以便后續(xù)計算 kinship 矩陣(協(xié)方差) ,A_M 為100x100的矩陣(sample 一共 100 個)
    A_M <- data_S %*% t(data_S)
   # 對角線改為 1
    A_M[diag(A_M) == 0] <- 1
    A_N[, , n0] <- A_M
  }
  return(A_N)
}

# example,計算不同層次來源的數(shù)據(jù)(矩陣)的 similarity
A_N <- similarity_inner_product(Multi_dataset, n)

Multi_dataset 代表不同層次來源的數(shù)據(jù)(矩陣,Multi_view1-Multi_view8矩陣的 list),n 代表有 8 個不同層次來源的數(shù)據(jù)

補充說明:


  1. 其中 xi 代表第 i 個sample的特征向量;xj 代表第 j 個sample的特征向量,上式計算的是計算 sample 之間的 similarity(協(xié)方差)
  2. A_N <- similarity_inner_product(Multi_dataset, n)中 A_N 代表 8 個不同層次來源數(shù)據(jù)中,每一個不同層次來源數(shù)據(jù)(矩陣中)各個 sample 之間的 similarity

3. 關(guān)于函數(shù) MVBLUP_weights()

MVBLUP_weights() 函數(shù)

MVBLUP_weights <- function(NP, n, CR, Mu, s0, s1, thre, iter, cv, trid, A_N, Phenotype, train_test_id) {
  # 設(shè)置 5 x 交叉驗證的 sample
  num_ex <- floor(nrow(Phenotype) / cv)
  # 區(qū)分訓(xùn)練集和測試集,并將他們的 index 取出來
  index_sample <- match(train_test_id[, 1], Phenotype[, 1])
  # 根據(jù) id 將表型值取出來賦予 dt_ex 
  dt_ex <- Phenotype[index_sample, -1]
  samplenames <- train_test_id[, 1]
  # trid 代表需要選擇的性狀,trid = 1 代表選擇 Phenotype 矩陣中的第一個性狀
  # Phenotype 矩陣中的第一個性狀值賦予 dt_in
  dt_in <- dt_ex[, trid]
  # 如果 dt_in 矩陣中的元素有NA值,則取第一個性狀值的均值覆蓋該 NA 值
  dt_in[is.na(dt_in)] <- mean(dt_in, na.rm = TRUE)
  # 區(qū)分 5 x 交叉驗證的訓(xùn)練集和測試集
  trainop1_ex <- dt_in[-c(1:num_ex)]
  testop1_ex <- dt_in[1:num_ex]
  
  # 將各個來源數(shù)據(jù) sample 之間的 similarity 矩陣 A_N(list)賦予 AA
  AA <- array(0, dim = c(nrow(train_test_id), nrow(train_test_id), n))
  for (n0 in 1:n) {
    AA[,, n0] <- A_N[,, n0][index_sample, index_sample]
  }
  
  # 創(chuàng)建兩個空的 dataframe,一個討論 Training Accuracy 另一個討論 Training Weight
  Training_Accuracy <- data.frame(iter = rep(1:iter, each = NP), group = rep(1:NP, iter), Accuracy = NA)
  Training_Weight <- data.frame(iter = rep(1:iter, each = n), Parameter = rep(1:n, iter), Weight = NA)
  num_test <- floor(length(trainop1_ex) / cv)
  
  # 初始化部分 F0 代群體
  # 隨機生成個 8 x 40 的矩陣(0-1)之間,40 相當(dāng)于種群群體
  BM <- matrix(runif(n * NP, 0, 1), nrow = n)
  F0 <- NULL
  # 利用差分進化算法表征 sample 間的親緣關(guān)系
  ## 初始化 8 個不同來源(層次)的 sample 間的矩陣信息,初始化 kinship 矩陣
  ## 1. 初始化 40 個群體
  for (k in 1:NP) {
    b <- BM[1:n, k]
    # 將 8 個不同來源(層次)的 sample 間的矩陣分別乘上一個微擾動值 b[n0]^2,然后全部累加起來(Reduce)
    # 此處可理解為融合了 8 個不同層次數(shù)據(jù)制作親緣關(guān)系矩陣的過程,見補充說明 8
    # AA[,,n0] 為每一層次數(shù)據(jù)的 similarity 矩陣
    A_M <- Reduce("+", lapply(1:n, function(n0) (b[n0]^2) * AA[,,n0]))
    rownames(A_M) <- samplenames
    colnames(A_M) <- samplenames
    ## 初始化 8 個不同來源(層次)的 sample 間的矩陣信息,得到 kinship 矩陣
    A <- similarity_kinship(A_M)
    A_train <- A[-c(1:num_ex), -c(1:num_ex)]
    # 用混合線性模型 training
    # 詳見以下補充說明 2
    res_M1 <- Pre_ER5(trainop1_ex, A_train, num_test)
    # F0[k] <- res_M1[length(res_M1)] 長度為 1;F0 (1 × 40)為初始化時 40 個種群的平均準(zhǔn)確率,見補充說明 7
    F0[k] <- res_M1[length(res_M1)]
  }
  # 提取每一次測試的準(zhǔn)確率,統(tǒng)稱為F0代測試的準(zhǔn)確率,見補充說明 4
  Training_Accuracy[1:NP, ncol(Training_Accuracy)] <- F0
  # 提取準(zhǔn)確率最高時,對應(yīng)的種群矩陣,作為訓(xùn)練權(quán)重,統(tǒng)稱為F0訓(xùn)練權(quán)重,見補充說明 5
  Training_Weight[1:n, ncol(Training_Weight)] <- BM[, which.max(F0)]
  F_N0 <- matrix(0, nrow = NP, ncol = iter)
  F_N0[, 1] <- F0
  
  # 2. Mutation 部分
  # 選出最優(yōu)的種群權(quán)重值后,進行變異部分計算
  # iter 為迭代次數(shù),可以理解為代數(shù),從 2 開始是因為初始化部分相當(dāng)于第一代
  for (j in 2:iter) {
    # 初始化 V 和 U 矩陣(8 × 40),40 相當(dāng)于種群群體,參考 BM 矩陣
    V <- matrix(0, nrow = n, ncol = NP)
    U <- matrix(0, nrow = n, ncol = NP)
    # 初始化 U 矩陣,即 BM矩陣 8 x 40 的矩陣(0-1)之間,40 相當(dāng)于種群群體
    U <- BM
    # 變異算法:
    # 遍歷 40 個群體,見補充說明 1
    for (l in 1:NP) {
      # 產(chǎn)生1~40的自然數(shù)
      Index_NP <- c(1:NP)
      # 1~40中隨機選三個數(shù)
      r <- sample(Index_NP[-l])[1:3]
      # 執(zhí)行上述遺傳算法 Mu = 0.5
      V[, l] <- BM[, r[1]] + Mu * (BM[, r[2]] - BM[, r[3]])
    }

    # 3. Crossover 部分
    # 閾值從標(biāo)準(zhǔn)正態(tài)分布中選取其中一個值
    randrow <- runif(n)
    # CR = 0.5 代表 δ 為交叉概率,見補充說明 2
    # V 和 U 矩陣為 8 × 40 的矩陣
    # 如果滿足 randrow 最小值大于 CR 
    # 之前的 U 矩陣有 U <- BM
    if (min(randrow) > CR) {
      # 隨機換一個變異的特征向量
      rid <- sample(nrow(BM))[1]
      U[rid, ] <- V[rid, ]
    # 如果不滿足,選擇小于 CR 的元素對應(yīng)的向量索引,利用該索引將變異矩陣 V 的行向量賦予對應(yīng)的 U 矩陣,其余部分保持 BM 的原有向量
    } else {
      U[which(randrow <= CR), ] <- V[which(randrow <= CR), ]
     }
    
    # 4. Selection 部分
    for (k in 1:NP) {
      # 將超過 1 或者不足 0 的 U 矩陣元素分別替換為 1,0
      U[U[, k] <= s0, k] <- s0
      U[U[, k] > s1, k] <- s1
      if (max(U[, k]) == 0) {
        U[, k] <- BM[, k]
      }
      # 類似于初始化部分,利用混合線性模型進行推理,然后計算測試集預(yù)測值與真實值的相關(guān)性,
      b <- U[1:n, k]
      A_M <- Reduce("+", lapply(1:n, function(n0) (b[n0]^2) * AA[,,n0]))
      rownames(A_M) <- samplenames
      colnames(A_M) <- samplenames
      A <- similarity_kinship(A_M)
      A_train <- A[-c(1:num_ex), -c(1:num_ex)]
      res_M1 <- Pre_ER5(trainop1_ex, A_train, num_test)
      # j 為迭代次數(shù)(可以理解為代數(shù)),第 j 代,k 為第 k 個種群
      # F_N0[k,j] 代表第 j 代的第 k 個個體的平均準(zhǔn)確率,見補充說明 3
      F_N0[k, j] <- res_M1[length(res_M1)]
      if (F_N0[k, j] < F0[k]) {
        U[, k] <- BM[, k]
        F_N0[k, j] <- F0[k]
      }
    }
    BM <- U
    # 當(dāng)滿足前后兩代的40個種群個體的平均準(zhǔn)確率向量小于閾值時,停止計算,見補充說明 3
    if (max(F_N0[, j] - F_N0[, (j - 1)]) < thre) {
      F0 <- F_N0[, j]
      Training_Accuracy[((j - 1) * NP + 1):(j * NP), ncol(Training_Accuracy)] <- F0
      Training_Weight[((j - 1) * n + 1):(j * n), ncol(Training_Weight)] <- U[, which.max(F0)]
      break
    }
    F0 <- F_N0[, j]
    Training_Accuracy[((j - 1) * NP + 1):(j * NP), ncol(Training_Accuracy)] <- F0
    Training_Weight[((j - 1) * n + 1):(j * n), ncol(Training_Weight)] <- U[, which.max(F0)]
  }
  MVBLUP_information <- data.frame(parameters = c(paste0("View", 1:n, "_W"), "iter", "Trait"),
                                   values = c(BM[, which.max(F0)], j, colnames(dt_ex)[trid]))
  
  results <- list(Training_Accuracy = Training_Accuracy, 
                  Training_Weight = Training_Weight, 
                  MVBLUP_information = MVBLUP_information, 
                  kinship_test = A,
                  trainop1_ex = trainop1_ex,
                  testop1_ex = testop1_ex)
  return(results)
}

函數(shù) Pre_ER5()PR() 的解析:

# 定義用于測試的樣本個數(shù)為 num_test =16
Pre_ER5<-function(dt,A_train,num_test){
  A <-A_train
  # 隨機選擇測試集,多次測試
  # 利用性狀數(shù)據(jù)與初始化的親緣關(guān)系矩陣 A_train 建立混合線性回歸關(guān)系
  res1<-PR(dt,A,1:num_test)
  res2<-PR(dt,A,(num_test+1):(num_test*2))
  res3<-PR(dt,A,(num_test*2+1):(num_test*3))
  res4<-PR(dt,A,(num_test*3+1):(num_test*4))
  res5<-PR(dt,A,(num_test*4+1):nrow(A))
  res_Pcor<-c(res1$pcor_te,res2$pcor_te,res3$pcor_te,res4$pcor_te,res5$pcor_te)
  res_Pl<-c(res1$pl_te,res2$pl_te,res3$pl_te,res4$pl_te,res5$pl_te)
  # 計算測試集部分對應(yīng)的預(yù)測數(shù)據(jù)與 pl_te 的相關(guān)性的均值,作為 training 準(zhǔn)確性的指標(biāo),相關(guān)性越高,準(zhǔn)確性越強;見補充說明 4
  Pcor5<-sum(res_Pcor)/5
  res=c(res_Pl,res_Pcor,Pcor5)
  return(res)
}

nut = num_test
PR<-function(dt,A,nut){
  dt_M<-dt
  # 將選作為測試集的數(shù)據(jù)進行 NA 化,見補充說明 3
  dt_M[nut]<-NA
  data <- data.frame(y=dt_M,gid=rownames(A))
  # 利用性狀數(shù)據(jù) dt_M 與初始化的親緣關(guān)系矩陣 A_train 建立混合線性回歸關(guān)系
  ans <- kin.blup(data=data,geno="gid",pheno="y",K=A)
  # 取出測試集部分對應(yīng)的預(yù)測數(shù)據(jù)(未被NA),計算去除測試集部分后對應(yīng)預(yù)測數(shù)據(jù)的均值
  # 上述兩部分相加得到 pl_te;見補充說明 6
  pl_te<-ans$g[nut]+mean(dt[-nut]) # ans$g[nut] 為測試集部分對應(yīng)的預(yù)測數(shù)據(jù)(未被NA);mean(dt[-nut]) 為去除測試集部分后對應(yīng)預(yù)測數(shù)據(jù)的均值
  # 計算測試集部分對應(yīng)的預(yù)測數(shù)據(jù)與 pl_te 的相關(guān)性
  pcor_te<-cor(as.numeric(dt[nut]),pl_te)
  Model=list(pcor_te=pcor_te,pl_te=pl_te) 
  return(Model)
}

?為什么要加平均:pl_te<-ans$g[nut]+mean(dt[-nut])
初始化部分:

補充說明:

  1. NP 為差分進化算法的群體數(shù)量,例子中定為40,通過模擬種群中的遺傳變異來篩選出優(yōu)質(zhì)種群
  2. res_M1 <- Pre_ER5(trainop1_ex, A_train, num_test) 是利用線性混合模型進行訓(xùn)練并且
  3. dt_M 的數(shù)據(jù)展示為:

    用作測試的部分替換為NA,利用性狀數(shù)據(jù) dt_M 與初始化的親緣關(guān)系矩陣 A_train 建立混合線性回歸關(guān)系 A <-A_train; ans <- kin.blup(data=data,geno="gid",pheno="y",K=A)。A_train 的數(shù)據(jù)展示為:
    然后通過混合線性回歸模型可以預(yù)測測試集 NA 的部分,如下:
    原來NA部分被預(yù)測出來
    對應(yīng)NA部分現(xiàn)已被預(yù)測出數(shù)值
  4. 隨機選擇五次測試集做訓(xùn)練,計算每次訓(xùn)練測試集部分對應(yīng)的預(yù)測數(shù)據(jù)(未被NA)與 pl_te 的相關(guān)性:pcor_te<-cor(as.numeric(dt[nut]),pl_te);然后取五次訓(xùn)練的均值:Pcor5<-sum(res_Pcor)/5 作為訓(xùn)練準(zhǔn)確性的指標(biāo),稱為F0代測試的準(zhǔn)確率
  5. 初始的種群群體矩陣 BM:

    BM 為 8 x 40 的矩陣,NP=40相當(dāng)于40次采樣,8對應(yīng)8個不同來源(層次)數(shù)據(jù)的權(quán)重;當(dāng)訓(xùn)練準(zhǔn)確性達到最大時,BM矩陣對應(yīng)的特征向量為最佳的群體權(quán)重向量,作為F0訓(xùn)練權(quán)重,F(xiàn)0 訓(xùn)練權(quán)重向量(長度為40),每個元素代表每個 NP(1~40) 對應(yīng)的 Pcor5 值(詳見Pre_ER5()函數(shù))

  6. pl_te 的解釋:pl_te<-ans$g[nut]+mean(dt[-nut]) ans$g[nut] 為測試集部分對應(yīng)的預(yù)測數(shù)據(jù)(未被NA),mean(dt[-nut]) 為去除測試集部分后對應(yīng)預(yù)測數(shù)據(jù)的均值;取出測試集部分對應(yīng)的預(yù)測數(shù)據(jù)(未被NA),計算去除測試集部分后對應(yīng)預(yù)測數(shù)據(jù)的均值;上述兩部分相加得到 pl_te
  7. F0[k] <- res_M1[length(res_M1)] 長度為 1;F0 (1 × 40)為初始化時 40 個種群的平均準(zhǔn)確率
  8. 此處可理解為融合了 8 個不同層次數(shù)據(jù)制作親緣關(guān)系矩陣的過程:
# 此處可理解為融合了 8 個不同層次數(shù)據(jù)制作親緣關(guān)系矩陣的過程
# AA[,,n0] 為每一層次數(shù)據(jù)的 similarity 矩陣
A_M <- Reduce("+", lapply(1:n, function(n0) (b[n0]^2) * AA[,,n0]))
rownames(A_M) <- samplenames
colnames(A_M) <- samplenames
## 初始化 8 個不同來源(層次)的 sample 間的矩陣信息,得到 kinship 矩陣
A <- similarity_kinship(A_M)

變異部分,Crossover 部分和 Selection 部分:

補充說明:

  1. 變異算法:
    Xgr1(向量長度為8)為BM[, r[1]];Xgr2(向量長度為8)為BM[, r[2]];Xgr3(向量長度為8)為BM[, r[3]];Mu 為 c scaling factor。V[, l] <- BM[, r[1]] + Mu * (BM[, r[2]] - BM[, r[3]]) 相當(dāng)于
    差分進化算法使用種群中兩個不同的特征向量來干擾一個現(xiàn)有向量,進行差分操作,來實現(xiàn)變異
# 遍歷 40 個群體
for (l in 1:NP) {
   # 產(chǎn)生1~40的自然數(shù)
   Index_NP <- c(1:NP)
   # 1~40中隨機選三個數(shù)
   r <- sample(Index_NP[-l])[1:3]
   # 執(zhí)行上述遺傳算法 Mu = 0.5
   V[, l] <- BM[, r[1]] + Mu * (BM[, r[2]] - BM[, r[3]])
}
  1. Crossover 部分
# 從標(biāo)準(zhǔn)正態(tài)分布中選取 8 個值,賦予向量 randrow 
# CR = 0.5 代表 δ 為交叉概率
randrow <- runif(n)
# 如果滿足 randrow 最小值大于 CR 
# 之前的 U 矩陣有 U <- BM
if (min(randrow) > CR) {
   # ?隨機換一個變異的特征向量
   rid <- sample(nrow(BM))[1]
   U[rid, ] <- V[rid, ]
# 如果不滿足,選擇小于 CR(交叉概率) 的元素對應(yīng)的向量索引,利用該索引將變異矩陣 V 的行向量賦予對應(yīng)的 U 矩陣
} else {
   U[which(randrow <= CR), ] <- V[which(randrow <= CR), ]
}

對于種群中每個個體和它所生成的子代變異向量進行交叉,即對每一個特征向量按照一定的概率選擇子代變異向量(否則就保持原種群個體的特征向量)來生成試驗個體

  1. Selection 部分:F_N0[k,j] (40 × iter,這里的 iter 代表代數(shù)) 代表第 j 代的第 k 個個體的平均準(zhǔn)確率;當(dāng)滿足前后兩代的40個種群個體的平均準(zhǔn)確率向量小于閾值時,停止計算

最優(yōu)化后,此時推導(dǎo)出的親緣關(guān)系矩陣即為融合了8個層次數(shù)據(jù)的親緣關(guān)系矩陣,里面提取了不同層次的親緣關(guān)系信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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