在 GA 中绘制最小化图
Plotting minimization graph in GA
GA
包最大化了自然界中的适应度函数。我知道对于使用 GA
的最小化问题,您需要在适应度函数中将适应度乘以 -1。
##calling the ga() function
my_ga <- ga(...)
在为最小化问题绘制图形 (plot(my_ga)
) 时,我得到了一个显示最大化模式的图形:
我试图通过改变 plot()
中的 ylim
来反转 y 轴,我得到了这个(这是我想要的,负 y 轴除外):
## explicitly defining the y-axis
x <- seq(1.1,1.4, 0.05)
plot(my_ga, ylim=rev(range(-x)))
但我发现这种方法根本没有效率,有没有更快的方法 - 将 y 轴更改为正值并隐式确定范围,使用 GA
包绘制最小化图?
顺便说一句,忽略这个例子中收敛不好的地方
[编辑] - 添加源代码
library(clusterSim)
library(GA)
## data
data(data_ratio)
dataset2 <- data_ratio
## fitness function
DBI2 <- function(x) {
cl <- kmeans(dataset2, centers = dataset2[x==1, ])
dbi <- index.DB(dataset2, cl=cl$cluster, centrotypes = "centroids")
score <- -dbi$DB
return(score)
}
k_min <- 5
## initialization of populaton
initial_population <- function(object) {
init <- t(replicate(object@popSize, sample(rep(c(1, 0), c(k_min, object@nBits - k_min))), TRUE))
return(init)
}
## mutation operator
my_mutation <- function(object, parent){
pop <- parent <- as.vector(object@population[parent, ])
difference <- abs(sum(pop) - k_min)
## checking condition where there are more cluster being turned on than k_min
if(sum(pop) > k_min){
## determine position of 1's
bit_position_1 <- sample(which(pop==1), difference)
## bit inversion
for(i in 1:length(bit_position_1)){
pop[bit_position_1[i]] <- abs(pop[bit_position_1[i]] - 1)
}
} else if (sum(pop) < k_min){
## determine position of 0's
bit_position_0 <- sample(which(pop==0), difference)
## bit inversion
for(i in 1:length(bit_position_0)){
pop[bit_position_0[i]] <- abs(pop[bit_position_0[i]] - 1)
}
}
return(pop)
}
my_ga<- ga(type = "binary",
population = initial_population,
fitness = DBI2,
selection = ga_rwSelection,
crossover = gabin_spCrossover,
mutation = my_mutation,
pcrossover = 0.8,
pmutation = 1.0,
popSize = 100,
maxiter = 100,
seed = 212,
nBits = nrow(dataset2))
plot(my_ga)
好吧,我们可以通过翻转对象本身中数据的符号来作弊。这是一个帮助函数来做到这一点
flip_ga_y <- function(x) {
x@summary <- x@summary*-1
x
}
然后你可以像这样绘制你的样本数据
plot(flip_ga_y(my_ga), ylim=c(1.1,1.4))
请注意,您必须指定 ylim
,因为该函数对它看起来的标志方向做出了一些强有力的选择。但是这个returns
GA
包最大化了自然界中的适应度函数。我知道对于使用 GA
的最小化问题,您需要在适应度函数中将适应度乘以 -1。
##calling the ga() function
my_ga <- ga(...)
在为最小化问题绘制图形 (plot(my_ga)
) 时,我得到了一个显示最大化模式的图形:
我试图通过改变 plot()
中的 ylim
来反转 y 轴,我得到了这个(这是我想要的,负 y 轴除外):
## explicitly defining the y-axis
x <- seq(1.1,1.4, 0.05)
plot(my_ga, ylim=rev(range(-x)))
但我发现这种方法根本没有效率,有没有更快的方法 - 将 y 轴更改为正值并隐式确定范围,使用 GA
包绘制最小化图?
顺便说一句,忽略这个例子中收敛不好的地方
[编辑] - 添加源代码
library(clusterSim)
library(GA)
## data
data(data_ratio)
dataset2 <- data_ratio
## fitness function
DBI2 <- function(x) {
cl <- kmeans(dataset2, centers = dataset2[x==1, ])
dbi <- index.DB(dataset2, cl=cl$cluster, centrotypes = "centroids")
score <- -dbi$DB
return(score)
}
k_min <- 5
## initialization of populaton
initial_population <- function(object) {
init <- t(replicate(object@popSize, sample(rep(c(1, 0), c(k_min, object@nBits - k_min))), TRUE))
return(init)
}
## mutation operator
my_mutation <- function(object, parent){
pop <- parent <- as.vector(object@population[parent, ])
difference <- abs(sum(pop) - k_min)
## checking condition where there are more cluster being turned on than k_min
if(sum(pop) > k_min){
## determine position of 1's
bit_position_1 <- sample(which(pop==1), difference)
## bit inversion
for(i in 1:length(bit_position_1)){
pop[bit_position_1[i]] <- abs(pop[bit_position_1[i]] - 1)
}
} else if (sum(pop) < k_min){
## determine position of 0's
bit_position_0 <- sample(which(pop==0), difference)
## bit inversion
for(i in 1:length(bit_position_0)){
pop[bit_position_0[i]] <- abs(pop[bit_position_0[i]] - 1)
}
}
return(pop)
}
my_ga<- ga(type = "binary",
population = initial_population,
fitness = DBI2,
selection = ga_rwSelection,
crossover = gabin_spCrossover,
mutation = my_mutation,
pcrossover = 0.8,
pmutation = 1.0,
popSize = 100,
maxiter = 100,
seed = 212,
nBits = nrow(dataset2))
plot(my_ga)
好吧,我们可以通过翻转对象本身中数据的符号来作弊。这是一个帮助函数来做到这一点
flip_ga_y <- function(x) {
x@summary <- x@summary*-1
x
}
然后你可以像这样绘制你的样本数据
plot(flip_ga_y(my_ga), ylim=c(1.1,1.4))
请注意,您必须指定 ylim
,因为该函数对它看起来的标志方向做出了一些强有力的选择。但是这个returns