問題的由來
參考文獻《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. 交叉
對于種群中每個個體和它所生成的子代變異向量進行交叉,即對每一個特征向量按照一定的概率選擇子代變異向量(否則就是原種群個體的特征向量)來生成試驗個體

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ù)的輸入
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ù)量(和值)可以不同。
- Phenotype.txt,代表表型數(shù)據(jù)值
Phenotype.txt- 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ù)
補充說明:
其中 xi 代表第 i 個sample的特征向量;xj 代表第 j 個sample的特征向量,上式計算的是計算 sample 之間的 similarity(協(xié)方差)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])
初始化部分:
補充說明:
- NP 為差分進化算法的群體數(shù)量,例子中定為40,通過模擬種群中的遺傳變異來篩選出優(yōu)質(zhì)種群
res_M1 <- Pre_ER5(trainop1_ex, A_train, num_test)是利用線性混合模型進行訓(xùn)練并且- 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 的部分,如下:對應(yīng)NA部分現(xiàn)已被預(yù)測出數(shù)值原來NA部分被預(yù)測出來- 隨機選擇五次測試集做訓(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)確率- 初始的種群群體矩陣 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ù))
- 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_teF0[k] <- res_M1[length(res_M1)]長度為 1;F0 (1 × 40)為初始化時 40 個種群的平均準(zhǔn)確率- 此處可理解為融合了 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 部分:
補充說明:
- 變異算法:
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]]) }
- 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), ] }對于種群中每個個體和它所生成的子代變異向量進行交叉,即對每一個特征向量按照一定的概率選擇子代變異向量(否則就保持原種群個體的特征向量)來生成試驗個體
- 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)系信息











